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

时间:2018-05-21 11:27:20

标签: h2o

我在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类。如果确实如此,那将是很棒的,但它不一定是一个显示器。

我对底层模型实现不太确定:MojoFrameFrameBuilder类倾向于暗示它在DriverlessAI中受支持,它可能使用或不使用相同的MOJO。此外,H2OFrame类在Spark / R / Python评分的上下文中出现,所以虽然这是针对本机模型而不是生成的Java对象,但我希望模型格式可以支持它,并且可能的路线可能是扩展支持类。

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

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

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

1 个答案:

答案 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品质是:

  • 生成的工件不需要编译(与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以外的任何行的结果)。< / p>

(注意,对于无人驾驶AI MOJO,由于结合了特征工程,上面的逐行讨论可能会有所不同。一个很好的例子是时间序列窗口计算。这样的讨论超出了范围这个问题和答案,但值得在此背景下指出。)