2015年6月16日火曜日

h2oでanomaly detectionを動かしてみる ~前編~

データアナリティクス・グループの梅田です。





今回は、機械学習ライブラリの調査の一環で、機械学習エンジン「h2o」によるディープラーニングを用いたanomaly detection(異常検知)を取り上げてみます。

h2oでディープラーニングを動かす方法については、Enterprise Zinの以下のページに紹介記事があります。オープンソースの統計システムである「R」からh2oを呼び出し、h2oのWebインターフェース上で画像分類問題を解かせる例が解説されています。

意志決定のためのデータサイエンス講座:【第五回】H2Oでディープラーニングを動かしてみよう!
http://enterprisezine.jp/article/detail/6539

この例では、50,000件の学習用データでモデルを構築した後、10,000件の検証用データを与えて予測を行わせており、教師付き学習に該当すると言えます。一方で、連載記事の1つ前の回では、ディープラーニングではオートエンコーダという仕組みを使って教師なし学習を行うことが説明されています。

意志決定のためのデータサイエンス講座:【第四回】今、最も熱いディープラーニングを体験してみよう 4/4ページ
http://enterprisezine.jp/article/detail/6471?p=4

じゃあh2oでディープラーニングの教師なし学習も試してみよう、と思ったところ、anomaly detection向けの教師なし学習を行ってくれそうなAPIがあったのですが、日本語の解説記事が見当たりませんでした。そこで、我流で動かしてみることにします。前編でAPIの内容を確認し、後編でデータを与えて動かしてみます。

以下、h2oをWebインターフェースではなくRコードで動かす前提で記載します。

anomaly detectionを行うには、「autoencoder=T」を指定してディープラーニングのモデルを構築します。

# コード例(モデル構築)
setwd("path") # "path"の部分に作業用ディレクトリへのパスを指定する
library(h2o)
localH2O = h2o.init(nthreads = -1)
testdata_csv <- "testdata.csv"
testdata <- h2o.importFile(localH2O, path = testdata_csv)
dl_model<-h2o.deeplearning(x=seq(2,ncol(testdata)), y=1,
data=testdata, classification=T,
hidden=c(20,20,20), activation="Rectifier",
autoencoder=T, ignore_const_cols=T)

このモデルと、対象データを指定して、h2o.anomalyを実行します。結果はファイルなどにエクスポートしておくとよいです。

# コード例(異常検知)
anomaly_detect <- h2o.anomaly(data=testdata,model=dl_model)
h2o.exportFile(data=anomaly_detect,path="anomaly_detect.csv")

h2o.anomalyは、対象データの各行の「Reconstruction.MSE」の値を1列に収めたデータオブジェクトを返します。
MSEとはmean squared error(平均二乗誤差)のことです。オートエンコーダでは、入力を再現できるように出力を調整していますが、「Reconstruction.MSE」とは、入力と再現出力との平均二乗誤差を意味するのだと思います。入力データ内で、周囲と傾向が違う値(突出した値、外れ値)があると、その部分の誤差値が周囲と違ってくるということだと思います。(我流なので推測です)


次回の後編では、ある程度規則的な値に異常値を混入させたテストデータを用意し、h2o.anomalyに与えて、異常検知がどれ位できるのか実証してみます。


注記:
h2oは2015年5月頃からv3.0系がリリースされ、その時点で細かい仕様が変更されています。
現時点では、参考記事の内容に従ってh2oを導入すると、CRANからh2o v2.8.4.4がダウンロードされ、記載どおりの手順でインストール・実行できるはずですが、将来はCRANから入手できるバージョンが引き上げられるかもしれません。
h2o.init実行時に表示される「H2O cluster version」の値が3以上だった場合で、実行時にエラーメッセージが表示された場合は、バージョン間の仕様の違いについて確認してみてください。

追記(2015/10/01):
9月に追記した記事の中で、v3.0系の変更点について、少し触れていますので、よければご参照ください。

0 件のコメント:

コメントを投稿