H2OモデルのJavaによる実装

Javaによる予測モデルの実装

H2Oを使えばWeb上から簡単にモデリングできる事をご紹介しましたが、
更に作成したモデルをPOJO(Plain Old Java Object)としてエクスポートすることができます。
これにより作成したモデルをJava上で動作させることができますので、予測モデルをバッチ処理などに組み込みたい場合は非常に便利です。

実装の手順としてPOJOファイルを使用したサンプルを作成しました。

POJOファイルの作成

H2O Flowで作成したモデルですがWEB UI上からダウンロードする事ができます。
Model作成後の画面で「Download POJO」をクリックするとjavaファイルとしてダウンロードできますので、任意のディレクトリに保存してください。

今回はDeepLearning_model_TIBCO_1489641113699_1.javaという名前で保存しています。

h2o-genmodel.jarの入手

http://localhost:54321/3/h2o-genmodel.jar
からダウンロードできますのでこれも先ほどダウンロードしたPOJOファイルと同じディレクトリに保存します。

main.javaの作成

同じディレクトリにmain.javaとして下記コードを記載したファイルを作成します。

import java.io.*;
import hex.genmodel.easy.RowData;
import hex.genmodel.easy.EasyPredictModelWrapper;
import hex.genmodel.easy.prediction.*;
import hex.genmodel.MojoModel;

public class main {
  // モデルの指定
  private static String modelClassName = "DeepLearning_model_TIBCO_1489641113699_1";

  public static void main(String[] args) throws Exception {
    hex.genmodel.GenModel rawModel;
    rawModel = (hex.genmodel.GenModel) Class.forName(modelClassName).newInstance();
    EasyPredictModelWrapper model = new EasyPredictModelWrapper(rawModel);

    // 予測に使うデータ(Setosaに近いデータです)
    RowData row = new RowData();
    row.put("C1", "5.0");
    row.put("C2", "3.4");
    row.put("C3", "1.5");
    row.put("C4", "0.2");

    model = new EasyPredictModelWrapper(rawModel);

    // 予測
    MultinomialModelPrediction p = model.predictMultinomial(row);

    // 結果出力
    System.out.println("Species will be " + p.label);
    System.out.print("Class probabilities: \n");
    for (int i = 0; i < p.classProbabilities.length; i++) {
      if (i > 0) {
        System.out.print("\n");
      }
      System.out.print(p.classProbabilities[i]);
    }
    System.out.println("");
  }
}

これで準備はOKです。

コンパイル

javac -cp h2o-genmodel.jar -J-Xmx2g -J-XX:MaxPermSize=128m DeepLearning_model_TIBCO_1489641113699_1.java main.java

実行

java -cp .;h2o-genmodel.jar main

Species will be Iris-setosa
Class probabilities:
0.9999219016198672
7.809838013280072E-5
1.1767060238448459E-33

予測元データはSetosaのイメージでしたが、予測もSetosaでした。
確率は99.99パーセントという事ですのでかなり自信を持った予測でしたね。

POJOファイルとh2o-genmodel.jarを使用する事で割と簡単に実装できることが分かりました。