How to use Mahout on Hadoop 「mahoutでK-means法を使ってみた 数値版」

Mahoutでビックデータを解析してみる。最近ビックデータという言葉をよく耳にするかと思います。Webサービスやカーナビシステムからは一日に大量のログ情報が発生します。

  • ユーザが利用したサービス、購入された商品、商品の評価...etc... 
  • 座標情報、渋滞、事故...etc...

例>Tポイントの会員データ分析から企業は何を知るのか
http://japan.zdnet.com/cio/sp_bigdata2011/35018019/

大量のデータを処理する際に用いられるApache Hadoopというフレームワークがあります。この上で動くApache Mahoutというライブラリを使うとビックデータを機械学習で調査、解析、予測ができます。

今回は2次元座標データをk-means法でクラスタリングしました。以下手順です。

使用したソフトウェア、バージョン
Hadoop 0.20.2
Mahout 0.6
Maven 3.0.4

 
インストールについての注意点
mvn install -DskipTests (test skipオプションをつけないと2時間くらいかかる
Mavenはプロキシ環境で使う場合別途設定が必要(設定ファイルのProxy部分のコメントアウトを消して書き直す
この記事では簡単なデータに対してK-means法で座標データに対してクラスタリングを行うという手順を紹介します。コマンドのみで紹介しますが、Javaでも書けます。

 

環境変数のセットアップ
export JAVA_HOME=/usr/local/jdk1.6.XX
export HADOOP_HOME=/usr/local/lib/hadoop
export PATH=$HADOOP_HOME/bin:$PATH
export PATH=$JAVA_HOME/bin:$PATH
export HADOOP_CONF_DIR=/usr/local/lib/hadoopfs/conf
export MAHOUT_HOME=/usr/local/src/mahout/mahout-distribution-0.6
--------------------


入力データ
スペース区切り、2次元以上も可能
3 2
4 1
6 1
5 13
(以下略)

--------------------


他のフォーマットに対応するにはorg.apache.mahout.clustering.conversion.InputDriverを直接編集またはコピーしてJavaを書き換え別の入力フォーマットにも対応可能だと思われる


Mahoutを使う

cd $MAHOUT_HOME
$bin/mahout \
org.apache.mahout.clustering.conversion.InputDriver \
-i path/to/hadoopfs/test/text -o /path/to/hadoopfs/test/vec

$hadoop fs -lsr path/to/hadoopfs/test/vec
-rw-r--r--   1 user group       3458 2012-09-25 13:38 path/to/hadoopfs/test/vec/part-m-00000

出力を確認する
$bin/mahout seqdumper -s path/to/hadoopfs/test/part-m-00000
--------------output--------------
MAHOUT_LOCAL is not set; adding HADOOP_CONF_DIR to classpath.
Running on hadoop, using HADOOP_HOME=/usr/local/lib/hadoop
HADOOP_CONF_DIR=/usr/local/lib/hadoop/conf
MAHOUT-JOB: /usr/local/src/mahout/mahout-distribution-0.6/examples/target/mahout-examples-0.6-job.jar
12/09/28 12:47:04 INFO common.AbstractJob: Command line arguments: {--endPhase=2147483647, --seqFile=path/to/hadoopfs/test/part-m-00000, --startPhase=0, --tempDir=temp}
Input Path: path/to/hadoopfs/test/part-m-00000
Key class: class org.apache.hadoop.io.Text Value Class: class org.apache.mahout.math.VectorWritable
Key: 2: Value: {1:3.0,0:1.0}
Key: 2: Value: {1:1.0,0:2.0}
Key: 2: Value: {1:11.0,0:3.0}
Key: 2: Value: {1:7.0,0:4.0}
Key: 2: Value: {1:1.0,0:5.0}
    ・
    ・
    ・
--------------------

Kmeansコマンド 先のコマンドのインプットとする。
-c 空のフォルダをしてするか、事前にCanopyでクラスタをつくりそれを指定(処理速度が上がる?)
-k  クラスタの数を数字で指定
-x Kmeansの繰り返し回数 安定したら繰り返し回数に達していなくても終了
-cl クラスタリングの繰り返しをしたぶんの履歴保存 -x 10 の場合1-10回分の履歴を保存

$bin/mahout kmeans \
-i path/to/hadoopfs/test/vec/ -o path/to/hadoopfs/test/kmeans \
-c path/to/hadoopfs/test/cano -k 3 -x 5 -cl

$hadoop fs -lsr path/to/hadoopfs/test/kmeans
drwxr-xr-x   - user group          0 2012-09-25 13:50 path/to/hadoopfs/test/kmeans/clusteredPoints
-rw-r--r--   1 user group       4579 2012-09-25 13:50 path/to/hadoopfs/test/kmeans/clusteredPoints/part-m-0
drwxr-xr-x   - user group          0 2012-09-25 13:50 path/to/hadoopfs/test/kmeans/clusters-1
-rw-r--r--   1 user group        736 2012-09-25 13:50 path/to/hadoopfs/test/kmeans/clusters-1/part-r-00000
drwxr-xr-x   - user group          0 2012-09-25 13:50 path/to/hadoopfs/test/kmeans/clusters-2
-rw-r--r--   1 user group        745 2012-09-25 13:50 path/to/hadoopfs/test/kmeans/clusters-2/part-r-00000
drwxr-xr-x   - user group          0 2012-09-25 13:50 path/to/hadoopfs/test/kmeans/clusters-3
-rw-r--r--   1 user group        754 2012-09-25 13:50 path/to/hadoopfs/test/kmeans/clusters-3-final/part-r-00000

結果を表示
クラスタの座標の表示
$bin/mahout clusterdump -s test/kmeans/clusters-3-final/part-r-00000
--------------output--------------
  クラスタID   n=クラスタに所属しているデータの数 cとrの詳細が不明・・・おそらく重心の座標?
Key: VL-358: Value: VL-358{n=49 c=[45.429, 95.755] r=[34.646, 71.014]}
Key: VL-359: Value: VL-359{n=7 c=[148.571, 4266.857] r=[108.861, 917.342]}
Key: VL-367: Value: VL-367{n=18 c=[197.167, 1964.111] r=[100.777, 318.566]}
--------------------

各値のクラスタの座標と所属しているクラスタ
$bin/mahout seqdumper -s test/kmeans/clusteredPoints/part-m-0
--------------output--------------
インプットされた順に並んでいます。
 クラスタID     インプットの数値
Key: 358: Value: 1.0: [1.000, 3.000]       
Key: 369: Value: 1.0: [4.000, 1443.000]       
Key: 369: Value: 1.0: [6.000, 944.000]       
Key: 358: Value: 1.0: [7.000, 122.000]       
Key: 358: Value: 1.0: [8.000, 38.000]       
--------------------

2次元データをクラスタ別にプロットする方法
http://blog.matake.jp/archives/%E3%82%A8%E3%82%AF%E3%82%BB%E3%83%AB%E3%81%A72%E6%AC%A1%E5%85%83%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E7%B5%90%E6%9E%9C%E3%82%92%E6%95%A3%E5%B8%83%E5%9B%B3%E3%81%A7%E6%8F%8F%E7%94%BB%E3%81%99%E3%82%8B

Mahoutにもクラスタ結果をグラフにするツールが含まれています。

試したいこと
-ビッグデータでやる。
-性能測定、スケールしてるか調査
http://bickson.blogspot.jp/2011_09_01_archive.html
-文書に対してのクラスタリングとその可視化 などなど
http://bigdatapartnership.com/clustering-with-mahout/