Mahoutで体感する機械学習の実践

第7回 DecisionForestを用いて顧客の購買予測を行う

この記事を読むのに必要な時間:およそ 4 分

Mahout 0.8からTestForestによる分析結果の出力がよりくわしく出力されるように

前回は理論編として,決定木とRandomForestについて解説しました。今回は実践編として,RandomForestのMahout実装であるDecisionForestを用いて,実際に顧客の購買予測を行ってみます。

解説の前に,2013年7月25日に,Mahoutのバージョン0.8がリリースされたことに触れておきます。バージョン0.8のDecisionForestは,バージョン0.7と比較し,後述するTestForestによる分析結果でκ統計量と信頼度も出力されるように改良されています。細かい不具合への対応やパフォーマンス改善も行われているので,これからMahoutを導入される方はバージョン0.8をお勧めします。

ただし,バージョン0.8が内部で利用しているHadoopはバージョン1.1.2へ変更されており,バージョン0.7が利用していたバージョン0.20とは異なります。バージョン0.7からバージョン0.8へ移行される方はご注意ください。

今回は,これまでに引き続きバージョン0.7の実行例を示しますが,すべての操作はバージョン0.8でも動作します。

サンプルデータをダウンロードする

今回利用するサンプルデータは,CSV形式で記載さており,以下のような構造になっています。

  • 1行が1顧客のデータ
  • 各行はカンマ区切りで各商品の購入有無を記載(Y:ある,N:ない)
顧客Aの商品1の購入有無, 顧客Aの商品2の購入有無, … 顧客Aの商品1000の購入有無
顧客Bの商品1の購入有無, 顧客Bの商品2の購入有無, … 顧客Bの商品1000の購入有無
顧客Cの商品1の購入有無, 顧客Cの商品2の購入有無, … 顧客Cの商品1000の購入有無
(省略)

今回は1000個の商品数を対象とするので,CSVファイルの列数は1000列で構成されています。

また,モデルの構築に利用する学習データと,分類時に利用する分類データで,顧客数はそれぞれ以下のようになっています。

descriptorファイルを作成する

今回利用するDecisionForestは,入力データにCSV形式を利用します。CSV形式は,前々回で利用したARFF形式と異なり,各列の値の型や,分類クラスを表す列の指定を定義できません。そのため,まず最初にこれらを定義するdescriptorファイルを作成する必要があります。

descriptorファイルを作成するには,mahout-core-0.7-job.jar※1に実装されている,org.apache.mahout.classifier.df.tools.Describeクラスを利用します。

Describeクラスは,以下のようにhadoopコマンドから実行します。

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⇒無視(利用しない)

たとえば,入力ファイルの列が5列で,数値,数値,カテゴリ,無視,ラベルの順に並んでいる場合,以下のように表記します。

-d N N C I L

同じ種類が連続する場合は,以下のように,連続する数をその種類の前に記入することで,表記を省略できます。

-d 2 N C I L

今回のサンプルデータでは,1000列のうち,先頭からの999列が「Y」「N」のカテゴリ値,そして最後の1列がラベルになります。そのため,以下のように表記しています。

-d 999 C L
※1)
以後,0.8を利用されている場合,0.7を0.8と適宜読み替えてください。

モデルを作成する

descriptorファイルが無事に作成できた後は,descriptorファイルと学習データを利用してモデルを作成します。

モデルの作成は,mahout-examples-0.7-job.jarに実装されている,org.apache.mahout.classifier.df.mapreduce.BuildForestクラスを利用します。BuildForestクラスも,先ほど同様,以下のようにhadoopコマンドから実行します。

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)の値は,説明変数がn個の場合,√nが推奨値です。よって今回は,--selection (-sl)の値を32で実行しています。

著者プロフィール

やまかつ(山下勝司)

開発/インフラ/統計,機械学習/プロジェクトマネージメントをこなす器用貧乏。最近はビッグデータ,Hadoop,機械学習あたりに夢中。

株式会社マーズフラッグ 先端研究開発本部所属。

趣味は妻と子供と過ごすこと。

Twitter:@yamakatu
Facebook:http://www.facebook.com/katsushi.yamashita.9

コメント

コメントの記入