Mahout 0.8からTestForestによる分析結果の出力がよりくわしく出力されるように
前回は理論編として、
解説の前に、
ただし、
今回は、
サンプルデータをダウンロードする
今回利用するサンプルデータは、
- 1行が1顧客のデータ
- 各行はカンマ区切りで各商品の購入有無を記載
(Y:ある、 N:ない)
顧客Aの商品1の購入有無, 顧客Aの商品2の購入有無, … 顧客Aの商品1000の購入有無 顧客Bの商品1の購入有無, 顧客Bの商品2の購入有無, … 顧客Bの商品1000の購入有無 顧客Cの商品1の購入有無, 顧客Cの商品2の購入有無, … 顧客Cの商品1000の購入有無 (省略)
今回は1000個の商品数を対象とするので、
また、
descriptorファイルを作成する
今回利用するDecisionForestは、
descriptorファイルを作成するには、
Describeクラスは、
hadoop fs -put gihyo-mahout-df-sample-learning.csv . hadoop jar $MAHOUT_HOME/mahout-core-0.7-job.jar org.apache.mahout.classifier.df.tools.Describe -p gihyo-mahout-df-sample-learning.csv -f gihyo-mahout-df-sample.info -d 999 C L
Describeクラスのパラメータには、
- --path (-p)⇒入力データ
(学習データ) を指定 - --file (-f)⇒describeファイルの出力先を指定
- --descriptor (-d)⇒入力データの各列を説明
- --regression (-r)⇒回帰問題を解く場合はこのオプションを付加
--descriptor (-d)オプションでは、
- N⇒数値
- C⇒カテゴリ
(性別など) - L⇒ラベル
(分類先クラス) - I⇒無視
(利用しない)
たとえば、
-d N N C I L
同じ種類が連続する場合は、
-d 2 N C I L
今回のサンプルデータでは、
-d 999 C L
モデルを作成する
descriptorファイルが無事に作成できた後は、
モデルの作成は、
hadoop jar $MAHOUT_HOME/mahout-examples-0.7-job.jar org.apache.mahout.classifier.df.mapreduce.BuildForest -d gihyo-mahout-df-sample-learning.csv -ds gihyo-mahout-df-sample.info -sl 32 -t 25 -o gihyo-mahout-df-sample.model
BuildForestクラスのおもなパラメータには、
- --data (-d)⇒入力データ
(学習データ) を指定 - --dataset (-ds)⇒作成したdescriptorファイルを指定
- --selection (-sl)⇒一つの決定木で利用する説明変数の数
(CSVファイルの列数) を指定 (ランダム抽出) - --partial (-p)⇒指定した場合、
学習データのうち、 一部のデータのみを利用 - --nbtrees (-t)⇒作成する決定木の数を指定
- --output (-o)⇒モデルの出力先
--selection (-sl)の値は、
モデルの精度を評価する
無事モデルが生成されたら、
本来、
モデルの評価は、
hadoop jar $MAHOUT_HOME/mahout-examples-0.7-job.jar org.apache.mahout.classifier.df.mapreduce.TestForest -i gihyo-mahout-df-sample-learning.csv -ds gihyo-mahout-df-sample.info -m gihyo-mahout-df-sample.model -a -mr -o gihyo-mahout-df-sample-test
TestForestのおもなパラメータには、
- --input (-i)⇒入力データ
(テストデータ) を指定 - --dataset (-ds)⇒作成したdescriptorファイルを指定
- --model (-m)⇒作成したモデルを指定
- --output (-o)⇒出力先を指定
- --analyze (-a)⇒付加した場合、
分析結果を出力 - --mapreduce (-mr)⇒付加した場合、
MapReduceで実行
--analyze (-a) オプションを指定した場合、
======================================================= Summary ------------------------------------------------------- Correctly Classified Instances : 989 98.9% Incorrectly Classified Instances : 11 1.1% Total Classified Instances : 1000 ======================================================= Confusion Matrix ------------------------------------------------------- a b <--Classified as 796 4 | 800 a = N 7 193 | 200 b = Y
各欄の出力は、
- Summary
- Correctly Classified Instances⇒正解数と正解率
- Incorrectly Classified Instances⇒誤答数と誤答率
- Total Classified Instances⇒全データ件数
- Confusion Matrix
- 列⇒今回分類されたクラス
- 行⇒テストデータに記載されたクラス
上記の出力の場合、
- ラベルNのクラスに分類されるべき800件のデータのうち、
796件が正しくNに分類され、 4件が誤ってYに分類された - ラベルYのクラスに分類されるべき200件のデータのうち、
193件が正しくYに分類され、 7件が誤ってNに分類された
モデルを視覚化する
作成したモデルは、
hadoop jar $MAHOUT_HOME/mahout-core-0.7-job.jar org.apache.mahout.classifier.df.tools.ForestVisualizer --dataset gihyo-mahout-df-sample.info --model gihyo-mahout-df-sample.model Tree[1]: 120 = N | 47 = N | | 783 = N | | | 893 = N | | | | 215 = N | | | | | 987 = N | | | | | | 274 = N | | | | | | | 270 = N (省略)
ForestVisualizerのおもなパラメータには、
- --dataset (-ds)⇒作成したdescriptorファイルを指定
- --model (-m)⇒作成したモデルを指定
モデルを用いて分類する
次は分類です。分類も、
hadoop fs -put gihyo-mahout-df-sample-classified.csv . hadoop jar $MAHOUT_HOME/mahout-examples-0.7-job.jar org.apache.mahout.classifier.df.mapreduce.TestForest -i gihyo-mahout-df-sample-classified.csv -ds gihyo-mahout-df-sample.info -m gihyo-mahout-df-sample.model -mr -o gihyo-mahout-df-sample-classified
分類結果は、
hadoop fs -cat gihyo-mahout-df-sample-classified/gihyo-mahout-df-sample-classified.csv.out 1.0 0.0 1.0 0.0 0.0 (省略)
出力は、
今回の分類先クラスのラベルはYとNでしたが、
descriptorファイルの中身を確認する
Mahoutのバージョンが0.
hadoop fs -cat gihyo-mahout-df-sample.info [{"values":["N","Y"],"label":false,"type":"categorical"}, … {"values":["N","Y"],"label":true,"type":"categorical"}]
学習データの各列に対応して、
- values⇒値のパターン
- label⇒ラベルかどうか
- type⇒descriptorファイル作成時に指定した型
今回利用した学習データは、
そのため、
プログラム内部からDecisionForestを利用するには
プログラム内部からMahoutのDecisionForestを利用する場合、
org.apache.mahout.classifier.df.data.Dataset.getLabelString(double code)
逆に、
org.apache.mahout.classifier.df.data.Dataset.labelCode(String label)
ラベルの一覧は、
org.apache.mahout.classifier.df.data.Dataset.labels()
このように、
次回は、