H2O 堆叠集成预测 ArrayIndexOutOfBoundsException

H2O Stacked Ensemble Prediction ArrayIndexOutOfBoundsException

使用 R 的 h2o 包,我使用禁用了 StackedEnsemble 的 AutoML 创建了一组基础模型。因此,模型集仅包含 AutoML 默认生成的基础模型(GLM、GBM、XGBoost、DeepLearning 和 DRF)。使用这些基础模型,我能够使用 h2o.stackedEnsemble 函数(即具有默认参数的 GLM)手动成功训练默认堆叠集成。我将模型导出为 MOJO,关闭 H2O 集群,重新启动 R,初始化新的 H2O 集群,导入堆叠集成 MOJO,并在新验证集上成功生成预测。

到目前为止一切顺利。

接下来,我按照完全相同的过程做了完全相同的事情,但这次我做了一个改变:我用基础模型之间的所有成对交互训练了堆叠集成 .交互是通过将基本模型 ID 列表提供给交互 metalearner_parameter 自动创建的。该模型似乎可以毫无问题地进行训练,并且(如上所述)能够将其导出为 MOJO,重新启动 h2o 集群,重新启动 R,然后导入 MOJO。但是,当我尝试在上面使用的同一验证集上生成预测时,出现以下错误:

DistributedException from localhost/127.0.0.1:54321: 'null', caused by java.lang.ArrayIndexOutOfBoundsException

DistributedException from localhost/127.0.0.1:54321: 'null', caused by java.lang.ArrayIndexOutOfBoundsException
    at water.MRTask.getResult(MRTask.java:660)
    at water.MRTask.getResult(MRTask.java:670)
    at water.MRTask.doAll(MRTask.java:530)
    at water.MRTask.doAll(MRTask.java:549)
    at hex.Model.predictScoreImpl(Model.java:2057)
    at hex.generic.GenericModel.predictScoreImpl(GenericModel.java:127)
    at hex.Model.score(Model.java:1896)
    at water.api.ModelMetricsHandler.compute2(ModelMetricsHandler.java:491)
    at water.H2O$H2OCountedCompleter.compute(H2O.java:1658)
    at jsr166y.CountedCompleter.exec(CountedCompleter.java:468)
    at jsr166y.ForkJoinTask.doExec(ForkJoinTask.java:263)
    at jsr166y.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:976)
    at jsr166y.ForkJoinPool.runWorker(ForkJoinPool.java:1479)
    at jsr166y.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:104)
Caused by: java.lang.ArrayIndexOutOfBoundsException

Error: DistributedException from localhost/127.0.0.1:54321: 'null', caused by java.lang.ArrayIndexOutOfBoundsException

当我将具有交互作用的堆叠集成导出为 MOJO 时,我也将其导出为二进制文件。当我改为为具有交互的堆叠集成导入二进制文件时,它能够在验证集上生成预测而不会出错。

我是 运行 R 4.1.2,这一切都是使用 h2o_3.36.0.1

完成的

有人对解决这个问题有什么建议吗?

编辑(更多信息):用于训练和验证模型的数据集都包含连续的预测变量和目标,所以我不认为这与单热编码有关,因为其他人可能会遇到此错误.

遗憾的是,H2O-3 目前不支持将带有交互的 GLM 导出为 MOJO。有一个错误允许 GLM 与交互一起导出,但 MOJO 无法正常工作 - 交互被缺失值替换。这应该在下一个版本 (3.36.0.2) 中修复 - 它首先不允许导出该 MOJO。

除了在 R 中编写堆叠集成(基本模型预测预处理(例如,交互创建),然后将其提供给 h2o.glm)之外,您可以做的事情不多。现在有一个未维护的包 h2oEnsemble 可能对此有所帮助。您还可以使用另一种更灵活的元学习器模型,例如 GBM。