使用导出的Mojo和二进制模型训练H2O堆叠集成模型

我尝试使用H2O Java API构建堆叠集成模型。

为此,我训练了两个模型

  1. 一个GBM模型
  2. 一个DRF模型

我以Mojo和二进制格式导出了这些模型。用于导出模型的代码片段如下:

Mojo格式导出:

        water.api.ModelsHandler modelsHandler = new ModelsHandler();        water.api.StreamingSchema streamingSchema = modelsHandler.fetchMojo(3, modelsV3); //water.api.schemas3.ModelsV3

二进制格式导出:

        water.api.ModelsHandler modelsHandler = new ModelsHandler();        modelsHandler.exportModel(3, modelExport); //water.api.schemas3.ModelExportV3

我还导出了交叉验证的保留数据,因为这些数据稍后用于训练堆叠集成模型是必需的。

假设我导出的模型名称及其保留数据名称如下:

模型名称: StackGBMReg1 保留数据名称: cv_holdout_prediction_StackGBMReg1

模型名称: StackDRFReg1 保留数据名称: cv_holdout_prediction_StackDRFReg1

训练堆叠集成模型

然后,我将这些模型及其CV数据导入到H2O服务器以训练堆叠集成模型。以下是此操作的代码片段:

导入保留数据:

    ImportFilesV3 importFile = h2o.importFiles(workingDir + fileName); //fileName: cv_holdout_prediction_StackGBMReg1 or DRFReg1 one.

导入模型:

    ModelsHandler modelsHandler = new ModelsHandler();    water.api.schemas3.ModelsV3 importedModel = modelsHandler.importModel(3, modelImport); //water.api.schemas3.ModelImportV3

当我尝试导入Mojo模型时,我遇到了以下错误:

    H2OException: Error while importing model : StackGBMReg1.zip        at ImportAndScore.importModel(ImportAndScore.java:306)        at ImportAndScore.main(ImportAndScore.java:61)    Caused by: java.lang.IllegalArgumentException: Missing magic number 0x1CED at stream start        at water.AutoBuffer.<init>(AutoBuffer.java:287)        at hex.Model.importBinaryModel(Model.java:2380)        at water.api.ModelsHandler.importModel(ModelsHandler.java:209)        at ImportAndScore.importModel(ImportAndScore.java:302)        ... 1 more

根据我在h2o论坛上得到的回复,导入Mojo模型是不支持的。我觉得这很奇怪。

为了解决这个问题,我导入了二进制模型,导入成功。然后训练了堆叠集成模型,效果很好。

我的问题是:

1. 由于使用ModelsHandler.importModel()无法导入Mojo模型,是否有其他可用的API或解决方案可以帮助我在H2O中导入Mojo模型?2. 我们可以将POJO或MOJO模型转换为二进制模型以用于导入吗?3. 根据h2o的最后回复,二进制模型不具备向后兼容性。因此,如果我稍后升级H2O,我的旧模型将无法用于训练新的堆叠集成模型。实际上,它会在导入步骤本身就失败。     a. 那么,有没有办法在不遇到向后兼容性问题的情况下使用二进制模型?    b. 如果二进制模型是唯一可行的方法,那么我用于训练堆叠集成模型(使用之前导出/保存的模型)的方法是否正确?    c. 我将来可能会遇到其他与二进制模型相关的问题,而这些问题是我现在没有预见的吗?

我主要关心的是解决向后兼容性问题。如果有任何方法可以解决这个问题,那将对我工作有很大帮助。由于我使用的是Java代码,我不介意使用任何未直接暴露的内部h2o API。

请注意,我不是在谈论为了评分目的而加载MOJO模型。我了解我们可以根据此链接轻松使用Mojo模型进行评分:http://docs.h2o.ai/h2o/latest-stable/h2o-docs/productionizing.html


回答:

针对您的问题逐条回答:

1. 由于使用ModelsHandler.importModel()无法导入Mojo模型,是否有其他可用的API或解决方案可以帮助我在H2O中导入Mojo模型?

没有。MOJO的设计目的是为了便于将模型投入生产。

2. 我们可以将POJO或MOJO模型转换为二进制模型以用于导入吗?不可以。

3. 根据h2o的最后回复,二进制模型不具备向后兼容性。因此,如果我稍后升级H2O,我的旧模型将无法用于训练新的堆叠集成模型。实际上,它会在导入步骤本身就失败。

是的,您只能在与训练模型时使用的相同版本的H2O中加载和使用该保存的二进制模型。H2O二进制模型在不同H2O版本之间不兼容。

a. 那么,有没有办法在不遇到向后兼容性问题的情况下使用二进制模型? 没有。

b. 如果二进制模型是唯一可行的方法,那么我用于训练堆叠集成模型(使用之前导出/保存的模型)的方法是否正确?是的。

c. 我将来可能会遇到其他与二进制模型相关的问题,而这些问题是我现在没有预见的吗? 向后兼容性是主要问题。

请注意,H2O.ai未来可能会支持将MOJOs读取到H2O-3中,但目前没有时间表。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注