使用 Java POJO/MOJO 和 EasyPredictModelWrapper 基于 H2O 帧的预测

H2O frame-based prediction using Java POJO/MOJO and EasyPredictModelWrapper

我已经在 R 中训练了一个线性模型并导出了一个我嵌入到 (Java) SpringBoot webapp 中的 POJO。使用 EasyPredictModelWrapper 包装 POJO 并实例化对象在教程中有详细描述:

hex.genmodel.GenModel rawModel = (hex.genmodel.GenModel) Class.forName(modelClassName).newInstance();
model = new EasyPredictModelWrapper(rawModel);

我可以assemble一个RowData对象:

RowData row = new RowData();
row.put("feature1", this.feature1);

并获得对该行的预测:

BinomialModelPrediction p = model.predictBinomial(row);

我还导出了与 MOJO 相同的模型 - 部署过程几乎相同。

我的用例是我收到需要评分的可变长度对象列表,因此我迭代列表并为每个对象构造一行,将其传递给包装器并接收预测。到目前为止一切顺利。

现在我想使用一个同时考虑所有行的更复杂的模型。在 R 中,这是将数据帧传递给模型的情况,而不是行(并接收数据帧)。

我的问题是:如何将数据框传递给生成的模型对象?我已经查看了 the h2o-3 repo, read the title of every SO post in the h2o tag and scrolled through the JIRA board until I got RSI, and the closest thing I've found is a DriverlessAI class called MojoFrame 中的源代码,尽管给出的示例是转换而不是预测。

我很确定 EasyPredictModelWrapper 不支持多行输入 - 源是关于 RowData class 的。如果它能实现就太好了,但它不一定是个亮点。

我不太确定底层模型的实现:MojoFrameFrameBuilder class 倾向于暗示它在 DriverlessAI 中受支持,它可能使用也可能不使用同样的魔力。此外,H2OFrame class 偶尔会在 Spark/R/Python 的评分上下文中出现,所以尽管这是针对原生模型而不是生成的 Java 对象,但它给了我希望模型格式可以支持它,并且可能的途径是扩展支持 classes.

我考虑过但尚未测试的选项:

有人用生成的 POJO 或 MOJO 工件完成多行/基于帧的输入吗?

H2O-3 MOJO/POJOs 是基于行的。 EasyPredictModelWrapper 是一个方便的包装器,用于进行基于行的预测。

如果您想进行多个预测,那么使用 for 循环是一个很好的答案。

即使将来某个时候 API 扩展为接受某种框架,它也不会做任何与 for 循环不同的事情。

(请注意,这不应与 Driverless AI MOJO 混淆,后者不可互换,并且具有一些不同的属性。)


I'm less sure about the underlying model implementation: the MojoFrame and FrameBuilder classes tend to imply that it's supported within DriverlessAI, which may or may not use the same MOJO.

尽管共享一个通用名称 MOJO,但 H2O-3 MOJO 和 Driverless AI MOJO 是不同的实现,不可互换。

他们共有的 MOJO 特质是:

  • 生成的工件不需要编译(不像 H2O-3 POJO,它是 Java 代码)
  • 支持 java 运行时
  • 低延迟,适合实时应用
  • 一次在一行上高效工作,因此适合流媒体应用程序

无人驾驶 AI MOJO 包括特征工程转换和预测模型。


My question is: how can I pass a dataframe to a generated model object? I've gone over the source in the h2o-3 repo

你不能使用当前的 H2O-3 MOJO API。 H2O-3 MOJO API 是基于行的 API。当然,可以扩展 API 来执行某种 for 循环方法。


Now I want to use a more sophisticated model that considers all the rows simultaneously

我不知道"considers all the rows simultaneously"是什么意思。这不是 H2O-3 MOJO API 或 EasyPredictModelWrapper 所做的。基础数学是逐行的。即使你在数学周围放置一个方便的函数来获取一帧值,它仍然会逐行计算结果,单个行以理论上令人尴尬的并行方式逐行计算,使用一个简单的for 循环,或其他一些奇特的方式,如果你需要并行性来提高速度。

在 H2O-3 MOJO API 中,第 N 行的计算结果对第 N-1 行或第 N+1 行的计算结果没有影响(或者,更一般地说,任何行的结果除了 N)。

(请注意,对于Driverless AI MOJOs,由于结合了特征工程,因此上述逐行讨论可能会有所不同。一个很好的例子是时间序列窗口计算。这样的讨论超出了这个问题和答案的范围,但在这种情况下值得指出。)