使用导出的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

为什么我们在K-means聚类方法中使用kmeans.fit函数?

我在一个视频中使用K-means聚类技术,但我不明白为…

如何获取Keras中ImageDataGenerator的.flow_from_directory函数扫描的类名?

我想制作一个用户友好的GUI图像分类器,用户只需指向数…

如何查看每个词的tf-idf得分

我试图了解文档中每个词的tf-idf得分。然而,它只返…

如何修复 ‘ValueError: Found input variables with inconsistent numbers of samples: [32979, 21602]’?

我在制作一个用于情感分析的逻辑回归模型时遇到了这个问题…

如何向神经网络输入两个不同大小的输入?

我想向神经网络输入两个数据集。第一个数据集(元素)具有…

逻辑回归与机器学习有何关联

我们正在开会讨论聘请一位我们信任的顾问来做机器学习。一…

发表回复

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