入力データを用意する
サンプルデータを確認する
前回はセグメンテーション分析の理論編として,
今回は,
なお,
今回利用するサンプルデータは,
- サンプルデータ
- ※1)
- ARFF形式は,
おもにWEKAで利用されるファイルフォーマットで, CSV形式にカラム名やデータ型などの情報を付加することができます。くわしい情報はワイカオ大学のページに記載されています。
今回のデータは,
- 1行が顧客1人のデータを意味する
- カンマ区切りで,
左から 「R (最終購買日)」「F (購買頻度)」「M (購入金額)」を表す
(省略) @DATA 顧客1の最終購買日, 顧客1の購買頻度, 顧客1の購買金額 顧客2の最終購買日, 顧客2の購買頻度, 顧客2の購買金額 顧客3の最終購買日, 顧客3の購買頻度, 顧客3の購買金額 (省略)
今回のデータはR,
ARFF形式をVector形式へ変換する
MahoutでK-Meansを実行する場合,
サンプルデータはARFF形式なので,
hadoop fs -put gihyo-mahout-kmeans-sample.arff . mahout arff.vector --input gihyo-mahout-kmeans-sample.arff --output gihyo-mahout-kmeans-sample.vector --dictOut gihyo-mahout-kmeans-sample.dict
arff.
- --input ⇒ 入力ファイル
- --output ⇒ 出力ファイル
- --dictOut ⇒ dictionaryファイルの出力先
生成されたVectorファイルは,
mahout seqdumper -i gihyo-mahout-kmeans-sample.vector mahout vectordump -i gihyo-mahout-kmeans-sample.vector
なお,
K-Meansをコマンドラインから実行する
kmeansコマンドを実行する
それでは,
MahoutのK-Means実装は,
mahout kmeans
kmeansコマンドのおもなパラメータとして以下があります。
- --input(-i) ⇒ 入力元
- --output(-o) ⇒ 出力先
- --distanceMeasure(-dm) ⇒ 距離計算方法の指定。デフォルト値はユークリッド平方距離
- --numCluster(-n) ⇒ 生成するクラスタの数
- --clusters(-c) ⇒ 初期クラスタ
- --convergenceDelta ⇒ 収束閾値。クラスタ重心の1回の移動距離が閾値以下になった場合,
計算を終了する - --maxIter ⇒ クラスタ重心点の最大計算回数
- --overwrite(-ow) ⇒ 出力先にファイルがすでにあった場合に上書きを行う
- --clustering ⇒ clusteredPointsの出力。clusteredPointsには,
各要素がどのクラスタに属するかが記載されている - --method ⇒ mapreduceを指定した場合はMapReduceによる計算,
sequentialを指定した場合はローカルマシンによる計算を行う。デフォルト値はmapreduce
今回は,
- クラスタ重心点の最大計算回数 ⇒ 50回
- 生成するクラスタの数 ⇒ 10個
- クラスタの初期座標 ⇒ ランダム
- clusteredPointsの出力 ⇒ 有り
- 距離計算方法 ⇒ ユークリッド距離
以下のコマンドを入力してみてください。
mahout kmeans --input gihyo-mahout-kmeans-sample.vector --output gihyo-kmeans-output --maxIter 50 --numClusters 10 --clusters gihyo-kmeans-null-cluster --clustering -dm org.apache.mahout.common.distance.EuclideanDistanceMeasure
今回は出力先にhdfsを利用しているので,
hadoop fs -lsr gihyo-kmeans-output
以下のような出力が表示されたでしょうか?
-rw-r--r-- 1 yamakatu supergroup 194 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/_policy drwxr-xr-x - yamakatu supergroup 0 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusteredPoints -rw-r--r-- 1 yamakatu supergroup 46560 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusteredPoints/part-m-0 drwxr-xr-x - yamakatu supergroup 0 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusters-0 -rw-r--r-- 1 yamakatu supergroup 194 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusters-0/_policy -rw-r--r-- 1 yamakatu supergroup 359 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusters-0/part-00000 (省略) -rw-r--r-- 1 yamakatu supergroup 359 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusters-0/part-00009 (省略) drwxr-xr-x - yamakatu supergroup 0 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusters-20-final -rw-r--r-- 1 yamakatu supergroup 194 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusters-20-final/_policy -rw-r--r-- 1 yamakatu supergroup 332 2013-06-01 11:41 /user/yamakatu/gihyo-kmeans-output/clusters-20-final/part-00000 (省略)
MahoutのKmaensコマンドは,
最終結果には,
--clusteringパラメータにより生成されるgihyo-kmeans-output/
- ※2)
- 今回はクラスタの初期座標をランダムで実行しているため,
必ずしも20回で終了するとは限りません。
K-Meansの実行結果を確認する
次に,
生成されたクラスタは,
mahout clusterdump
clusterdumpコマンドのおもなパラメータとして,
- --input(-i) ⇒ 入力元
- --output(-o) ⇒ 出力先
- --outputFormat(-of) ⇒ 出力フォーマット。デフォルトのTEXT以外にCSV,
GRAPH_ ML (GraphML形式) を指定可能 - --pointsDir(-p) ⇒ clusteredPointsの指定
- --dictionary(-d) ⇒ dictionaryファイル指定
今回は,
mahout clusterdump --input gihyo-kmeans-output/clusters-20-final --output ~/gihyo-kmeans-dump.text
次に,
cat ~/gihyo-kmeans-dump.text
VL-959{n=103 c=[22.165, 82.806, 27.854] r=[12.907, 11.927, 15.057]} VL-969{n=98 c=[73.776, 85.929, 26.561] r=[14.760, 9.117, 15.672]} (省略)
ここで表示される出力結果は,
- VL-x ⇒ クラスタ
- n ⇒ そのクラスタに属する要素の数
- c ⇒ そのクラスタの重心
- r ⇒ そのクラスタの半径
クラスタ数を10で実行していますので,
各クラスタに属する要素を同時に出力したい場合は,
mahout clusterdump --input gihyo-kmeans-output/clusters-20-final --output ~/gihyo-kmeans-dump.text -p gihyo-kmeans-output/clusteredPoints
clusteredPointsの内容だけを確認したい場合は,
mahout seqdumper --input gihyo-kmeans-output/clusteredPoints