我在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,这是我最接近的事情找到的是名为MojoFrame的DriverlessAI类,但给出的示例是变换而不是预测。
我很确定EasyPredictModelWrapper
不支持多行输入 - 源代码都是RowData
类。如果确实如此,那将是很棒的,但它不一定是一个显示器。
我对底层模型实现不太确定:MojoFrame
和FrameBuilder
类倾向于暗示它在DriverlessAI中受支持,它可能使用或不使用相同的MOJO。此外,H2OFrame
类在Spark / R / Python评分的上下文中出现,所以虽然这是针对本机模型而不是生成的Java对象,但我希望模型格式可以支持它,并且可能的路线可能是扩展支持类。
我考虑过但尚未测试的选项:
EasyPredictModelWrapper
以接受框架(了解MOJO格式需要付出很多努力)有没有人使用生成的POJO或MOJO工件完成基于多行/帧的输入?
答案 0 :(得分:1)
H2O-3 MOJO / POJO是基于行的。 EasyPredictModelWrapper是一个方便的包装器,用于进行基于行的预测。
如果你想做多个预测,那么使用for循环就是一个很好的答案。
即使将来某个时候API扩展为接受某种框架,它也不会做出与for-loop不同的任何事情。
(请注意,这不应与无驱动AI MOJO混淆,后者不可互换且具有一些不同的属性。)
我对底层模型实现不太确定:MojoFrame和FrameBuilder类倾向于暗示它在DriverlessAI中受支持,它可能使用或不使用相同的MOJO。
尽管有一个共同的MOJO名称,H2O-3 MOJO和无人驾驶AI MOJO是不同的实现,不可互换。
他们分享的MOJO-ness品质是:
无人驾驶AI MOJO包括特征工程转换以及预测模型。
我的问题是:如何将数据帧传递给生成的模型对象?我已经在h2o-3 repo中查看了源代码
您不能使用当前的H2O-3 MOJO API。 H2O-3 MOJO API是基于行的API。当然,可以扩展API以执行某种for循环方法。
现在我想使用一个同时考虑所有行的更复杂的模型
我不知道"同时考虑所有行"手段。这不是H2O-3 MOJO API或EasyPredictModelWrapper所做的。基础数学是逐行的。即使你在数学周围放置一个便利函数来获取一帧值,它仍然会逐行计算结果,使用一个简单的理论上令人尴尬的并行方式逐个单独计算各行for循环,或者如果你需要并行速度的话,还有其他一些奇特的方式。
在H2O-3 MOJO API中,为行N计算的结果对行N-1或N + 1计算的结果没有影响(或者更一般地说,对于除N以外的任何行的结果)。< / p>
(注意,对于无人驾驶AI MOJO,由于结合了特征工程,上面的逐行讨论可能会有所不同。一个很好的例子是时间序列窗口计算。这样的讨论超出了范围这个问题和答案,但值得在此背景下指出。)