2015年10月7日水曜日

H2Oを使ったかんたん深層学習(Deep learning) モデル構築編

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






前回の私の記事「Wekaを使ったお手軽機械学習 予測(Predictive)編の終わりで、「データを整備して分類器を選択して学習させるよりも、Deep Learning(深層学習)を使った方が、よりお手軽で高い精度のモデルを作れるように見受けられます」とまとめました。
Wekaでは深層学習はできないので、僕も梅田の記事に続き、H2Oを使って深層学習を始めてみました。




本題に入る前に言わせていただきたいことが一つ。
H2Oを調べても、日本語の記事では、小難しいコードが並んでいる記事が多く、ハードルが高そうに見えますが…「H2OはGUIだけで機械学習ができます。」

追記:IPython Notebookにとても似ています。

▪︎ これからやること


アヤメの花弁とがく片の長さに関するデータがあるんだけど、ここからアヤメの種類を判別したい。アヤメのデータは随時手に入るから、作成したモデルで随時判断をしたい…、というのが、これからやることのシナリオです。

平たく整理すると、以下のことを実施します。
Wekaの記事と同じ流れです。


■ 執筆時のシステム仕様


・Java Runtime Environment 1.8.0_60
・H2O Slater (3.2.0.8)

■ H2Oのライセンス形態


H2O ver3のコミュニティー・エディションは、
Apache Lisence version 2.0で提供されています。

■ 分析の概要


今回は仕組み作りが要点となるため、分析内容は簡単なものを選択しました。
カリフォルニア大学アーバイン校が提供している、UCI Machine Learning Repositoryの中から、アヤメの分類に関するデータセットを利用します。含まれる属性は、アヤメの種別(3種類)と、sepal (がく片) とpetal (花弁) の長さと幅です。
このデータを使って、がく片と花弁から、アヤメの種別を判定する仕組みを構築します。

■ モデルの作成


1. H2Oのインストールと起動
H2Oのダウンロードサイトから安定版のH2Oをダウンロードします(執筆時点では、Simons version 3.2.0.8)。
ダウンロードサイトに書かれている通り、コマンドラインで以下の操作をします。


cd ~/Downloads
unzip h2o-3.2.0.8.zip
cd h2o-3.2.0.8
java -jar h2o.jar


ブラウザを開いて、以下のサイトにアクセスします。
公式サイトに記載されているポート番号にアクセスしてもアクセスエラーになってしまいますので、以下のURLにアクセスします。


※ 上記URLでページが表示できない場合は、54322, 54323 … とポート番号を1増やして試してみてください。


H2O FLOWという画面が立ち上がります。


2. データの読み込み
画面上部のツールバーから [Data] > [Upload File...]を選択します。


アップロードするファイルを尋ねられるので、UCI Machine Learning Repositoryから提供される、”Iris.data”をアップロードします。アップロードが完了すると、”Setup Parse”セルが作成されます。


”Setup Parse”セルは、読み込んだデータのフォーマット定義を行います。基本的には自動で設定してくれます。必要に応じて、区切り文字(Separator)やカラム名、型を修正しておきます。設定が完了したら、セル最下部にある”Parse”ボタンを押します。


Screen Shot 2015-08-30 at 22.08.41.png


“Parse”ボタンを押すと、”Job”セルが表示されます。”Parse Setup”で設定した内容が、コードに反映されていることを確認して、”View”ボタンを押します。
Screen Shot 2015-08-29 at 19.31.51.png


“View”ボタンを押すと、Jobによってパースされたhex形式のデータの要約が表示されます。
”Build Model..."ボタンを押して、このデータを使った分析モデルの作成を行っていきます。
Screen Shot 2015-08-29 at 19.41.46.png


“Build Model ..."ボタンを押すと、”Build Model”セルが表示されます。Select an algorithmから、分析に利用するモデルを選択することができます。今回は、この記事のお題通り、ディープラーニングを選択していきます。


なお、H2Oで利用できる分析モデルとその概要は以下のとおりです。
Deep Learning(深層学習)特徴抽出(どの説明変数を使うべきか)をニューラルネットワークを使って抽象化してから分類を行う分析モデルです。分類対象の特徴を定義できないときに有効な手法です。処理時間は他の手法よりかかりますが、マシンリソースが十分にあって、何から手を付けていいか分からない場合には非常に有効な手法です。
Distributed RF(分散ランダムフォレスト)ランダムにサンプリングした属性から作成される複数の決定木を統合した分析モデルです。属性の数が多く、かつ特徴が明確な場合、高速な分析を実現できます。学習データに対してオーバーフィッティングしやすい特徴があるので予測に利用する場合は注意が必要です
Gradient Boosting Machine(勾配ブースティングマシン):決定木による分類から得られる重みを使って逐次学習を行った結果を利用する分析モデルです。逐次学習の回数が多いほど、学習データにフィッティングしていきます。
Generalized Linear Model(一般化線形モデル):線形回帰を使った分析モデルです。回帰問題(予測結果が数字)の場合に利用する分析モデルです。
k-means(k平均法):与えられたクラスタ数kに分類する教師なし学習の分析モデルです。集合から分類を見出したい場合に利用する分析モデルです。
Naive Bayes(ナイーブベイズ):分類に利用される分析モデルです。最適化されたモデルの精度は、他のモデルに一歩劣ると言われていますが、トレーニングデータが少なくても、他のモデルよりも高い精度を発揮することができるモデルです。
Principal Component Analysis(主成分分析):属性(次元)の類似性を見つけるための分析モデルです。多くの属性を持っていると分析時間が多くなるため、このモデルを使って次元を削減します。


Screen Shot 2015-08-29 at 19.46.43.png


Deeplearningを選択すると、設定画面が開かれます。
あまり計算量を必要とするデータではないので、精度は悪くても動かすことを優先で深く考えずに設定していきます。


今回設定したのは、以下の項目です。
nfolds(交差検証の分割数):交差検証の設定を行います。”0”だと実行しません。数値の目安はスタージェスの公式を使って出すのが望ましいという話ですので、今回は”10”としてみました。
response_column(目的変数):分類対象となるカラムを設定します。今回は、アヤメの種類なので”Class”を指定します。
hidden(隠れ層の設定):ニューロンの数と層の数を指定します。今回は5属性のデータセットなので、5属性+バイアスで6*6の隠れ層を設定してみました。
variable_importances(重要度):チェックを入れると、各属性の重要度を表示してくれます。


設定が完了したら、セルの最下部にある”Build Model”ボタンを押して、ビルドを開始します。


Screen Shot 2015-08-30 at 23.07.54.png


モデルの実行セルが生成されます。モデルの作成が完了したら、”View”ボタンを押してモデルの詳細を確認します。


Screen Shot 2015-08-30 at 23.10.46.png


トレーニングフレームで作成されたモデルの詳細が表示されます。注目すべき項目は以下のとおりです。
VARIABLE IMPORTANCES(重要度):ゼロに近いほど、その属性の結果に与える影響度は小さくなります。データ量等の状況にもよりますが、極端に低い属性は、ignoreしてしまった方が処理が早くなります。
SCOREING HISTORY - MSE(平均平方誤差):学習の繰り返し回数(epochs)と平均平方誤差(MSE)の比較表です。平均平方誤差はゼロに近いほど精度の高いモデルと言えます。


Screen Shot 2015-08-30 at 23.13.34.png


また、交差検証を行った結果も表示されます。”TRAINING METRICS”と”CROSS VALIDATION METRICS”では、分類のエラー率が表示されます。
結果を見ると、トレーニングマトリクスに比べて、交差検証マトリクスの方がエラー率が高くなっているので、若干、トレーニングセットに対してオーバフィットしたモデルと言えそうです。


Screen Shot 2015-08-30 at 23.14.16.png


このように、H2O FLOWを使うと、データの読み込みから分析モデルの作成までをフローに則って、簡単に作ることができます。



1 件のコメント:

  1. とても参考になりました!ありがとうございます。
    ただ、画像が来ているのが少し残念です。

    返信削除