我尝试使用H2O Java API构建堆叠集成模型。
为此,我训练了两个模型
- 一个GBM模型
- 一个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中,但目前没有时间表。