1

H2Oのスパークリングウォーターを使ってモデルを作成しました。そして今、それを巨大なSpark DF(スパースベクトルが取り込まれた)に適用したいと思います。私はpythonとpyspark、pysparklingを使用しています。基本的に、内部で model.predict() 関数を使用してマップ ジョブを実行する必要があります。しかし、データを H2O コンテキストにコピーすることは大きなオーバーヘッドであり、オプションではありません。私がやろうと思っているのは、h2o モデルから POJO (Java クラス) モデルを抽出し、それを使用してデータフレームでマップを行うことです。私の質問は次のとおりです。

  1. より良い方法はありますか?
  2. Java クラスの pyspark ラッパーの作成方法。そこからメソッド .score(double[] data, double[] result) を 1 つだけ使用する予定です。
  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

score0ただし、回避策として、関数の適切な形状を公開するモデルの周りに Java ラッパーを作成します。

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

も参照してくださいhex.ModelUtils: https://github.com/h2oai/sparkling-water/blob/master/core/src/main/scala/hex/ModelUtils.scala (Spark によって公開された Py4J ゲートウェイを介して直接呼び出すことができます)

于 2016-03-07T21:23:26.597 に答える