入力データを用意する
サンプルデータを確認する
前回はセグメンテーション分析の理論編として、
今回は、
なお、
今回利用するサンプルデータは、
今回のデータは、
- 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/
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
CanopyクラスタリングをK-Meansの前処理として実行する
canopyコマンドを実行する
前回でもとりあげたように、
Mahoutでは、
mahout canopy
canopyコマンドのおもなパラメータとして、
- --input(-i) ⇒ 入力元
- --output(-o) ⇒ 出力先
- --distanceMeasure(-dm) ⇒ 距離計算方法の指定。デフォルト値はユークリッド平方距離
- --t1 ⇒ t1値
- --t2 ⇒ t2値
- --overwrite(-ow) ⇒ 出力先にファイルが既にあった場合に上書きを行う
- --clustering ⇒ clusteredPointsファイルの出力。clusteredPointsファイルには各要素がどのクラスタに所属するか記載されている
- --method ⇒ mapreduceを指定した場合はMapReduceによる計算、
sequentialを指定した場合はローカルマシンによる計算を行う。デフォルト値はmapreduce
以下のコマンドを入力し、
mahout canopy --input gihyo-mahout-kmeans-sample.vector --output gihyo-canopy-output --t1 33 --t2 40 --clustering -dmorg.apache.mahout.common.distance.EuclideanDistanceMeasure
今回の入力データは、
K-Means同様、
mahout clusterdump --input gihyo-canopy-output/clusters-0-final --output ~/gihyo-canopy-dump.text
今回の著者の環境では、
ただし、
Canopyクラスタリングの結果を利用してK-menasを実行する
次に、
Canopyクラスタリングの結果をK-Meansの初期値とする場合、
mahout kmeans --input gihyo-mahout-kmeans-sample.vector --output gihyo-kmeans-canopy-output --maxIter 50 --clusters gihyo-canopy-output/clusters-0-final --clustering -dmorg.apache.mahout.common.distance.EuclideanDistanceMeasure
これまでと同様、
このように、
ライブラリ呼び出しでK-MeansとCanopyクラスタリングを実行するには
ライブラリを利用してMahoutのK-MeansとCanopyクラスタリングを実行するには、
- K-Means
- ⇒org.
apache. mahout. clustering. kmeans. KMeansDriverクラス - Canopyクラスタリング
- ⇒org.
apache. mahout. clustering. canopy. CanopyDriverクラス
これらは、
次回は、