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

时间:2018-08-16 08:29:20

标签: java machine-learning h2o ensemble-learning sparkling-water

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

为此,我训练了2个模型

  1. GBM模型
  2. DRF模型

我以Mojo和Binary格式导出了这些模型。对于导出模型,我使用了以下代码片段:

对于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

我还导出了交叉验证保持数据,这是以后训练堆叠集成模型所必需的。

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

ModelName:StackGBMReg1 CVDataName:cv_holdout_prediction_StackGBMReg1

ModelName:StackDRFReg1 CVDataName:cv_holdout_prediction_StackDRFReg1

训练堆叠的集成模型

然后,我稍后将这些模型及其CV数据导入H2O Server,以训练堆叠的Ensemble模型。这是此操作的代码片段:

要导入保留数据:

    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 Models。我觉得这很奇怪。

为克服此问题,我导入了成功的二进制模型。然后训练堆叠模型,对我来说效果很好。

我的问题是:

1. Since, mojo Model import is not working using ModelsHandler.importModel(), is there another API available or work around which can help me to import Mojo Model in H2O?
2. Can we convert, POJO or MOJO models into binary Model for import purpose?
3. As per last reply for h2o, binary models are not backward compatible. So, if I upgrade H2O later, my older trained models will not work for training new stacked ensemble models. Actually, it will fail at import step itself. 
    a. So, is there a way to use the binary models without having the backward compatibility issue?
    b. If binary models are the only way to go, then is my approach right for training stacked Ensemble models(using previously exported/saved models)?
    c. Am I likely to face any other issue with binary models in future which I dont for see now?

我主要关心的是摆脱向后兼容性问题。如果有任何解决方法,那将对我的工作有很大帮助。由于我使用的是Java代码,因此我不介意使用任何未直接公开的内部h2o api。

请注意,我并不是在谈论出于评分目的而加载MOJO模型。我了解我们可以根据以下链接轻松地使用Mojo模型进行评分: momentjs timezone

1 个答案:

答案 0 :(得分:0)

内联回答您的问题:

1。由于无法使用ModelsHandler.importModel()进行mojo模型导入,是否有另一个可用的API或可解决的方法来帮助我在H2O中导入Mojo模型?

否。设计MOJO的目的是促进将模型投入生产。

2。我们可以将POJO或MOJO模型转换为二进制模型以进行导入吗? 否。

3。根据对h2o的最新答复,二进制模型不向后兼容。因此,如果以后再升级H2O,我训练有素的旧模型将无法用于训练新的堆叠集成模型。实际上,它将在导入步骤本身失败。

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

a。因此,有没有一种方法可以使用二进制模型而不会出现向后兼容性问题?     否。

b。如果二进制模型是唯一的方法,那么我的方法是否适合训练堆叠的Ensemble模型(使用先前导出/保存的模型)? 是的。

c。将来我是否可能会遇到二进制模型的其他问题,而现在看不到了? 向后兼容性是主要问题。

请注意,H2O.ai将来可能支持将MOJO读取到H2O-3中,但目前尚无时间表。