2015年10月22日木曜日

H2Oを使ったかんたん深層学習(Deep learning) 組み込み編

データアナリティクス・グループ(DAG)の新村です

I'm Kazuki Niimura of Unirita Inc., Data Analytics Group.

I'm surprised that this blog is more access from Ukraine than access from Japan at this month. Bot access? It seemed so sad.


BTAIM, Thank you access from Ukraine. This blog is Japanese only. Because our business is mainly in Japan. but Writing team are glad your access and please enjoy our articles.

今回は前回の記事に引き続き、H2Oで作成したモデルをJavaプログラムに組み込んでいきます。


■ これからやること


アヤメの花弁とがく片の長さに関するデータがあるんだけど(以下略)
簡単に言うと、以下のことを実施します。
  1. Irisデータから予測モデルの作成(前回のテーマ)
  2. 作成した予測モデルのJavaプログラムへの組み込み(今回のテーマ)
環境は前回記事から変わっていません。それでは早速始めていきます。


■ Javaプロジェクトへの組み込み


モデルのダウンロード

H2OはFlow上で作成したモデルをPOJO (Plain Old Java Object) として出力することができます。前回記事の最後で、モデルの詳細を確認しましたが、同セルからPOJOをダウンロードすることができます。


ダウンロードしたPOJOをエディタで開いてみると、モデルがJavaのコードとして表記されていることが確認できます。



呼び出しクラスの作成


Maven3を使ってMaven Quickstart Archetypeでプロジェクトを作成します。
プロジェクトを作成したら、"src/java/<package>/"に、ダウンロードしたPOJOファイルをインポートします。

インポートが完了したら、src/java/<package>/ にPOJO呼び出し用クラス"PojoExecution"を作成します。コードは以下の通りです。

13行目のメンバ変数"modelClassName"は、パッケージ名も含めたPOJOのクラス名を指定します。上記サンプルコードの場合は、"jp.co.uniria.da"というパッケージ名の後に、"IrisDeeplearning"というPOJOのクラス名が続いて、"jp.co.unirita.da.IrisDeeplearning"と定義されています。

30行目の"model.predictMultinomial(row)"は、与えられた引数(row)の予測を行っています。今回はディープラーニングを使った予測のため"predictMultinomial"メソッドを使って引数を渡していますが、ここは、利用しているモデルによってメソッドと引数を変更する必要があります。
どのメソッドを適用すればよいのかは、ダウンロードしたPOJOの"getModelCategory()"メソッドの戻り値の中で使っているメソッドから確認することができます。今回のサンプルコードでは戻り値に、"hex.ModelCategory.Multinomial"が定義されています。

Jarファイルの出力と実行

pom.xmlを以下のとおりに定義します。

30行目からのプラグイン"maven-assembly-plugin"は、コンパイルしたJarファイルをコマンドラインから実行できるようにするためのプラグインです。

65行目からのライブラリは、H2Oのモデルを実行するためのライブラリです。POJOを出力したH2Oと同一バージョンを利用するようにしてください。

設定が完了したら、プロジェクトフォルダ上で、以下のコマンドを実行します。

h2o-iris-deeplearning user $ mvn package

パッケージングされてjarファイルになったプロジェクトが、"<project root>/target/"ディレクトリに出力されているので、これを実行します。引数はスペースで区切って、key=value の形で設定します。

h2o-iris-deeplearning user $ cd target/
target user $ java -jar iris-prediction-1.0-jar-with-dependencies.jar "sepal length"="5.57091678078844" "sepal width"="3.09644861465126" "petal length"="1.23725924762744" "petal width"="0.113236009159561"
Prediction Result: Iris-setosa

分析結果が表示されました。



■ おわりに


H2Oで出力されるPOJOを使って簡単なJavaアプリケーションを作成してみました。
今回利用したコードは、データアナリティクスグループのbitbucketで公開しています。
https://bitbucket.org/daunirita/h2o-iris-deeplearning

作成したモデルに対して新しいデータを適用して分析結果を見る場合は、この方法を使うとで、容易に現行のアプリケーションとの連携が図れると思います。
非常に負荷の大きなアプリケーションで、分析モデルを使う場合は、H2OのApache Sparkプラグインである"Sparking Water"があるので、こちらを採用したほうがいいかもしれません。

H2Oを使って機械学習を実施し、Javaアプリケーションを組み込む方法を、2回にわたって紹介してきました。
機械学習を行う上では、他執筆者が書いているように、精度の高い予測モデルを作るためのチューニングが一番難しい作業となります(チューニングについてはCauseraのMachine Learningを受講すると作業がはかどると思います)。
しかし、モデルを作るためのツールとモデルを実装する仕組みは、かなり整備されて、統計学に明るくない人間でも触れる環境が揃ってきたので、既存のアプリケーションに組み込んで新たな価値を生み出してみてはいかがでしょうか。

2 件のコメント:

  1. ディープラーニングの勉強をしています。
    MVN PACKAGE
    で下記のエラーが出てしまう。
    対応方法がありましたら、お知らせください?

    [ERROR] /C:/Users/yasut/sample/src/main/java/jp/co/unirita/da/IrisDeeplearning.java:[21,32] パッケージhex.genmodel.annotationsは存在しません
    [ERROR] /C:/Users/yasut/sample/src/main/java/jp/co/unirita/da/IrisDeeplearning.java:[23,2] シンボルを見つけられません
    シンボル: クラス ModelPojo

    返信削除
  2. 自己解決しました。理由は、H2Oのバージョンが合っていませんでした。合わせたら、うまくいきました。

    返信削除