1

我使用 H2O 的苏打水创建了模型。现在我想将它应用于巨大的 Spark DF(填充稀疏向量)。我使用 python 和 pyspark,pysparkling。基本上我需要在里面使用 model.predict() 函数来做地图工作。但是将数据复制到 H2O 上下文中是巨大的开销,而不是一种选择。我想我要做的是,从 h2o 模型中提取 POJO(Java 类)模型,并用它在数据框中进行映射。我的问题是:

  1. 有没有更好的办法?
  2. 如何为 java 类编写 pyspark 包装器,我打算只使用一种方法 .score(double[] data, double[] result)
  3. 如何最大限度地重用 Spark ML 库中的包装器?

谢谢!

4

1 回答 1

2

在这种情况下,您可以:

1)使用h2o.predict(H2OFrame)方法生成预测,但您需要转换RDDH2OFrame. 这不是完美的解决方案……但是,在某些情况下,它可以提供合理的解决方案。

2) 切换到 JVM 并通过 Spark 的 Py4J 网关直接调用 JVM 这目前还不是完全可行的解决方案,因为该方法score0需要在 H2O 端接受非原始类型并且也是可见的(现在它受到保护),但在最少的想法:

model = sc._jvm.water.DKV.getGet("deeplearning.model")
double_class = sc._jvm.double
row = sc._gateway.new_array(double_class, nfeatures)
row[0] = ...
...
row[nfeatures-1] = ...
prediction = model.score0(row)

我为这种情况创建了 JIRA 改进https://0xdata.atlassian.net/browse/PUBDEV-2726

但是,解决方法是围绕模型创建一个 Java 包装器,该包装器将公开正确的score0函数形状:

class ModelWrapper extends Model {
   public double[] score(double[] row) {
     return score0(row)
   }
}

另请参阅hex.ModelUtilshttps ://github.com/h2oai/sparkling-water/blob/master/core/src/main/scala/hex/ModelUtils.scala (同样,您可以通过 Spark 公开的 Py4J 网关直接调用它们)

于 2016-03-07T21:23:26.597 回答