機械学習プラットフォームのOSS「H2O.ai」を使ってランダムフォレスト分析してみる

今回は「[H2O.ai](https://www.h2o.ai/)」という機械学習分析プラットフォームを試しに使ってみます。
自分でモデルをプログラム実装しなくても様々なモデルを試せるのでうまく使えると便利そうです。

(H2Oというと、WebサーバソフトウェアのH2Oというのがありますが、これとは別ものなのでご注意ください。)

サービスだと[DataRobot](https://www.datarobot.com/jp/product/)とか機械学習プラットフォームとして有名ですね。
これと類似のカテゴリのものだと思います。


# インストール

H2O.aiのサーバをまずは動かします。

Javaで実装されているので以下からjarを落としてきて動かすだけで済むようです。
https://h2o-release.s3.amazonaws.com/h2o/master/4275/index.html

適当にサーバにjdkをインストール後、インストールします。

```shell-session
$ wget https://h2o-release.s3.amazonaws.com/h2o/master/4275/h2o-3.19.0.4275.zip
$ gunzip h2o-3.19.0.4275.zip
$ cd h2o-3.19.0.42785
$ java -jar h2o.jar
```

これでデフォルト54321ポートで管理画面が起動します。


# データの準備

分析処理を少し試すため、Kaggleで公開されている「[タイタニック号の事故での生存予測問題](https://www.kaggle.com/c/titanic)」のデータを使ってみます。
train.csvとtest.csvを入手しておきます。


# 画面から事前準備

http\://ホスト名:54321/にアクセスすると以下のような画面が表示されます。

![h2oai1.png](https://qiita-image-store.s3.amazonaws.com/0/45851/cf408fa0-6360-851a-5d57-54fde68aaf7e.png)


対応しているモデルとしては以下の辺りがあるようです。

![h2oai2.png](https://qiita-image-store.s3.amazonaws.com/0/45851/f3b6615c-5990-50fd-207c-8b577ba28afe.png)


まずは訓練データのインポートから。

importFilesから先程準備したtrain.csvのデータをインポートします。
csvの配置先のパスを指定してインポートできます。

![h2oai3.png](https://qiita-image-store.s3.amazonaws.com/0/45851/16f433e8-6272-1d06-cc9c-056e7d16425f.png)


次に、ファイルの内容をParse処理します。

勝手に各カラムがどういったタイプのデータであるとか判定してパース処理してくれます。
自動判定された型が違う場合には修正を、特定のカラムを処理の対象外にしたい場合はタイプの部分をInvalidとすることも可能です。
一旦、今回は自動設定されたままの状態で進めてみます。

![h2oai4.png](https://qiita-image-store.s3.amazonaws.com/0/45851/8ca53830-3045-55ac-c56c-16ee7f999f54.png)


パースが完了すればこんな感じで結果が表示され、何件のデータがあるか、数値系のカラムであれば最大・最小がどうであるかといった統計情報も含めて表示されます。

![h2oai5.png](https://qiita-image-store.s3.amazonaws.com/0/45851/00d48b63-afff-e8f4-c3e5-eeca3bc5801f.png)

これでまずは事前準備が完了です。

# モデルをBuild

上部のメニューのgetFramesからBuild Modelを実行します。

アルゴリズムを選択します。
今回は試しに「Distributed Random Forest」を選択。
training_frameとして先程インポート・パースしたtrain.hexを選択。response_columnとして最終的に予測させたいターゲットとなるSurvivedを指定。
あとはひとまずデフォルトのままで進みます。
本来なら検証用のデータセットもあるのが望ましいと思います。
今回のようにtrain.csvという感じで1データ・セットしかない場合でもそのデータを分割してトレーニング用、検証用と扱いをわける処理もH2O.ai上で簡単にできるようです。

![h2oai6.png](https://qiita-image-store.s3.amazonaws.com/0/45851/bf9a9769-a1be-53b7-06c4-a2488f8e57ec.png)

しばらくするとBuildジョブが完了します。
![h2oai7.png](https://qiita-image-store.s3.amazonaws.com/0/45851/5c8cc0d6-4f84-a3db-3ceb-7bad24e8e069.png)



結果を見ると、各変数の重要度としてどれが高いか(今回だと性別がより効いてきそうだというのが)わかります。

ひとまずこれでモデルは完成。

# テストデータに対して予測値を算出

先程のtrain.csvをインポートした時と同様にtest.csvをインポートします。

上部のメニューのScore→Predictから予測処理の実行ができます。

![h2oai8.png](https://qiita-image-store.s3.amazonaws.com/0/45851/bd046383-8b55-47b6-1294-64b310343347.png)


Modelは先程作成したランダムフォレストのモデルを選択。
Frameとして予測させたいデータが登録されているtest.hexを選択します。
あとはPredictを実行して結果を確認。

![h2oai10.png](https://qiita-image-store.s3.amazonaws.com/0/45851/f5aabb4f-0888-dc8c-2e61-9e5170b9ccf7.png)

生存率のフラグが各乗客毎にどのような数値になりそうかの予測値が導かれています。
1により近い数値が出ているデータが生存すると予測されているものになっているのかと思います。(あまり細かいデータの見方までは把握しきれてないので今後の課題)

予測結果のデータはダウンロードも可能。

![h2oai9.png](https://qiita-image-store.s3.amazonaws.com/0/45851/a8eceabb-ce73-35fb-3d9a-2838f444edf9.png)


# まとめ
とりあえず何の調整もせずに動かすだけなら非常に手間かからず便利に実行できます。
今回は試せてないですが、モデルを自分で選択するのではなく、AutoMLということでトレーニングデータとかを読み込ませてやれば自動で複数のモデルで分析処理をかけてくれる機能もあります。
モデルの選択とか検討する場合には非常に便利じゃないでしょうか。