使用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.6.0.1 完成的
有人对解决这个问题有什么建议吗?
编辑(更多信息(:用于训练和验证模型的数据集都包含连续的预测因子和目标,所以我不认为这与一个热编码有关,因为其他人可能会出现这种错误。
不幸的是,H2O-3目前不支持将具有交互的GLM导出为MOJO。有一个错误允许GLM与交互一起导出,但MOJO无法正常工作——交互被缺失的值所取代。这应该在下一个版本(3.36.0.2(中得到修复——它首先不允许导出该MOJO。
除了在R中编写堆叠的集合(基本模型预测预处理(例如,交互创建(,然后将其提供给h2o.glm(之外,没有什么可以做的了。现在有一个未维护的包h20Ensemble可能会对此有所帮助。您还可以使用另一种更灵活的metalearner模型,例如GBM。