2015年8月27日木曜日

Wekaを使ったお手軽機械学習 予測(Predictive)編

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



前回の記事に引き続き、機械学習ソフトウェアの"Weka"を使って作成したモデルをJavaプログラムに実装していきたいと思います。



■ これからやること


機械学習によるモデルの作成からシステムへの組込まで、情報活用する際の一連の流れを本ブログでは説明していきたいと思います。
  1. モデルの作成(前回記事) 
  2. モデルの検証(前回記事) 
  3. Javaプログラムへのモデルの組み込み(今回のテーマ) 

■ 前回のあらすじ


UCI Machine Learning Repositoryの中から、アヤメの分類に関するデータセットを利用して、アヤメの分類モデルを作成しました。このモデルでは、petal (花弁) の長さと幅からアヤメの種類を95%の精度で分析することが可能です。

今回は、このモデルにデータ(花弁の長さと幅)を与えることで、種類を返すJavaのサンプルプログラムを作っていきます。

■ ライブラリの読み込み


まずは、Wekaのライブラリをプロジェクトに読み込ませます。MVN RepositoryにWekaのライブラリが公開されているので、これを読み込みます。

私は、普段はMavenを使っているので、以下の内容をpom.xmlに追記してライブラリをロードしました。


■ テストの作成


まずは、テストを作っていきます。

作りたいプログラムは、これまでに作成したモデルを読み込んで、Map型の引数で与えられた花弁の長さと幅から、アヤメの種類を戻り値として返すものです。

ですので、テストでは、モデル操作をするクラス(ModelImport)を実行して、戻ってきた値が、期待通りの分類になっているかどうか確認しています。


■ モデルを使って予測


プログラムの作成に取り掛かります。

コードの大半は、Wekaの冒頭で読み込んだatff形式と同等のデータを作る為の処理に当てられています。FastVector型のdataAttribs変数に属性情報をセットして、Instances型のdataModelに、属性情報とデータを合わせてセットします。

データのインスタンスが作成されたら、classModel.distributionForInstance()で、wekaで作成したモデルにデータを渡して分析結果を取得します。distributionForInstanceメソッドは、分類の数、つまり今回の場合は、Iris-setosa、Iris-versicolor、Iris-virginicaの3つのアヤメの種類毎に、サポート・ベクター・マシンの分類結果を、シグモイド関数の解(0~1)として返します。

最後に得られたシグモイド関数の解のうち、最も大きい(1に近い)配列の番号をループで取り出して、classAttribute().value()メソッドで、分類名に変換して戻します。

この辺の数値の動きは、無理に文章を理解しようとするのではなく、実際にプログラムをデバッグモードで実行して、数値を追いかけた方が分かりやすいかもしれません。



■ 完成品


ここまでざっくりと紹介してきましたが、完全版のソースコードを、データアナリティクスグループのGit Repositoryにて公開しています。
https://bitbucket.org/daunirita/weka-predictor


同プログラムをダウンロードして、”WekaExecutionTest”を実行するか、パッケージングして引数(ex. “PetalLength=1.23 PetalWidth=0.15”)付で実行すると、モデルによる予測値を取得することができます。

■ 終わりに


今回は、Courseraの機械学習コースの内容に近い内容で、極力お手軽に機械学習ライブラリを扱ってみました。

しかし、最近では、Wekaでやったようなデータを整備して分類器を選択して学習させるよりも、Deep Learning(深層学習)を使った方が、よりお手軽で高い精度のモデルを作れるように見受けられます。

もし、基礎的なレベルの内容ではなく、手っ取り早く機械学習を使ってみたいと思っているようでしたら、梅田が紹介している、H2OなどDeep Learningができるライブラリを採用することをお勧めします。

0 件のコメント:

コメントを投稿