【发布时间】:2022-01-05 17:49:20
【问题描述】:
使用 R 的 h2o 包,我使用 AutoML 创建了一组基础模型,并禁用了 StackedEnsemble。因此,模型集仅包含 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$1.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 完成的
有人对解决这个问题有什么建议吗?
编辑(更多信息):用于训练和验证模型的数据集都包含连续的预测变量和目标,所以我不认为这与单热编码有关,因为其他人可能会遇到此错误。
【问题讨论】: