我在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中,这是一种将数据case传递给模型的情况,而不是一行(并接收数据返回)。
我的问题是:如何将数据文件传递给生成的模型对象?我已经检查了h2o-3回购中的源代码,读取了h2o
标记中每个SO帖子的标题,并在JIRA董事会中滚动,直到得到RSI为止,我找到的最接近的东西是一个名为MojoFrame的DriverlessAI类,不过给出的示例是一个转换而不是一个预测。
我确信EasyPredictModelWrapper
不支持多行输入--源完全是关于RowData
类的。如果是这样的话,那就太好了,但这不一定是一场表演。
对于底层模型实现,我不太确定:MojoFrame
和FrameBuilder
类倾向于暗示在DriverlessAI中支持它,这可能使用或不使用相同的MOJO。此外,H2OFrame
类不时出现在Spark/R/Python的评分上下文中,因此尽管这是针对本地模型而不是生成的Java对象,但它给了我希望模型格式能够支持它,可能的途径可能是扩展支持类。
我已经考虑过但尚未测试的选项:
EasyPredictModelWrapper
以接受框架(为理解MOJO格式所做的大量努力)有没有人用生成的POJO或MOJO工件进行基于多行/帧的输入?
发布于 2018-05-21 14:12:18
H2O-3 MOJO/MOJO是基于行的。EasyPredictModelWrapper是一个用于进行基于行的预测的方便包装器。
如果您想做一个以上的预测,那么使用for-循环是一个很好的答案。
即使将来API扩展到接受某种框架,它也不会做任何与for循环不同的事情。
(请注意,这不应与无人驾驶的AI MOJOs混淆,后者不可互换,而且确实有一些不同的属性。)
对于底层模型实现,我不太确定: MojoFrame和FrameBuilder类倾向于暗示在DriverlessAI中支持它,这可能使用或不使用相同的MOJO。
尽管有一个共同的名字MOJO,H2O-3 MOJOs和无人驾驶的AI MOJOs是不同的实现,不能互换。
他们的共同特点是:
无人驾驶的AI MOJOs包括特征工程转换以及预测模型。
我的问题是:如何将数据文件传递给生成的模型对象?我已经检查了h2o-3回购的源头。
您不能使用当前的H2O-3 MOJO API。H2O-3 MOJO API是基于行的API。当然,我们可以扩展API来执行某种循环方法。
现在,我想使用一个更复杂的模型,它同时考虑所有行。
我不知道“同时考虑所有行”是什么意思。这不是H2O-3 MOJO或EasyPredictModelWrapper所做的。基本的数学是逐行的。即使你在数学上放了一个方便的函数来获得一个值的框架,它仍然会逐行地计算结果,每个行以一种理论上令人尴尬的并行方式单独计算,使用简单的for循环,或者其他一些花哨的方法,如果你需要速度的并行性。
在H2O-3 MOJO API中,为N行计算的结果对为行N1或N+1计算的结果没有影响(或者,更普遍地说,对于N以外的任何行的结果)。
(请注意,对于无人驾驶的AI MOJOs,由于功能工程是合并的,可能上面的逐行讨论可能是不同的。一个很好的例子是时间序列加窗计算。这种讨论超出了这一问题和答案的范围,但在这方面值得指出)。
https://stackoverflow.com/questions/50447863
复制相似问题