【发布时间】:2018-10-31 01:15:09
【问题描述】:
我已经在 R 中训练了一个线性模型并导出了一个 POJO,我已经将它嵌入到一个 (Java) SpringBoot webapp 中。使用 EasyPredictModelWrapper 包装 POJO 并实例化一个对象在教程中有很好的描述:
hex.genmodel.GenModel rawModel = (hex.genmodel.GenModel) Class.forName(modelClassName).newInstance();
model = new EasyPredictModelWrapper(rawModel);
我可以组装一个RowData 对象:
RowData row = new RowData();
row.put("feature1", this.feature1);
并获得该行的预测:
BinomialModelPrediction p = model.predictBinomial(row);
我还导出了与 MOJO 相同的模型 - 部署过程几乎相同。
我的用例是我收到一个需要评分的可变长度对象列表,因此我迭代列表并为每个对象构造一行,将其传递给包装器并接收预测。到目前为止一切顺利。
现在我想使用一个更复杂的模型来同时考虑所有行。在 R 中,这是将数据帧传递给模型的情况,而不是一行(并接收返回的数据帧)。
我的问题是:如何将数据框传递给生成的模型对象?我已经查看了the h2o-3 repo 中的源代码,阅读了h2o 标签中每个 SO 帖子的标题,并滚动浏览了JIRA board,直到我得到 RSI,我发现最接近的东西是一个名为 DriverlessAI 的类MojoFrame,尽管给出的示例是变换而不是预测。
我相当确定 EasyPredictModelWrapper 不支持多行输入 - 源代码都是关于 RowData 类的。如果可以的话,那就太好了,但它不一定是一个炫耀。
我不太确定底层模型实现:MojoFrame 和 FrameBuilder 类往往暗示它在 DriverlessAI 中受支持,它可能使用或可能不使用相同的 MOJO。此外,H2OFrame 类不时出现在 Spark/R/Python 评分的上下文中,因此尽管这是针对本机模型而不是生成的 Java 对象,但它给了我希望模型格式可以支持它,并且一个可能的途径可能是扩展支持类。
我考虑过但尚未测试的选项:
- 修改
EasyPredictModelWrapper以接受 Frames(为了理解 MOJO 格式付出了很多努力) - 将输入列表重新规范化为单行(打破了基于框架的模型训练范式,这可能会破坏整个过程)
有没有人使用生成的 POJO 或 MOJO 工件完成多行/基于帧的输入?
【问题讨论】:
标签: h2o