【问题标题】:H2O frame-based prediction using Java POJO/MOJO and EasyPredictModelWrapper使用 Java POJO/MOJO 和 EasyPredictModelWrapper 基于 H2O 帧的预测
【发布时间】: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 类的。如果可以的话,那就太好了,但它不一定是一个炫耀。

我不太确定底层模型实现:MojoFrameFrameBuilder 类往往暗示它在 DriverlessAI 中受支持,它可能使用或可能不使用相同的 MOJO。此外,H2OFrame 类不时出现在 Spark/R/Python 评分的上下文中,因此尽管这是针对本机模型而不是生成的 Java 对象,但它给了我希望模型格式可以支持它,并且一个可能的途径可能是扩展支持类。

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

  • 修改 EasyPredictModelWrapper 以接受 Frames(为了理解 MOJO 格式付出了很多努力)
  • 将输入列表重新规范化为单行(打破了基于框架的模型训练范式,这可能会破坏整个过程)

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

【问题讨论】:

    标签: h2o


    【解决方案1】:

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

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

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

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


    我对底层模型实现不太确定:MojoFrame 和 FrameBuilder 类往往暗示它在 DriverlessAI 中受支持,它们可能使用也可能不使用相同的 MOJO。

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

    他们共有的 MOJO 品质是:

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

    无人驾驶 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 之外的任何行的结果)。

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

    【讨论】:

      猜你喜欢
      • 2019-07-20
      • 2018-08-30
      • 2020-04-04
      • 2021-06-08
      • 2019-04-22
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多