2011年7月11日月曜日

"Elastic MapReduce"で"Mahout"使ってリコメンデーション

スズキです。

"Mahout"とはJavaで記述された機械学習ライブラリで、
リコメンデーション処理などを"Hadoop"上で実行することも可能です。

"Hadoop"上でってことなら、当然、AWSの"Elastic MapReduce"でも
実行することができるはずです。

ということで、"Elastic MapReduce"で"Mahout"使って
リコメンデーションしてみました。

ちなみに、"Mahout"のリコメンデーションに関しては、
@daisuke_mさんのブログで丁寧に紹介されており必読です!
(とくに、下記の記事はリコメンデーションのイメージをつかむのに最適です!)
レコメンデーションの簡単な原理を視覚的に把握してから実際に計算してみる

まずは、S3の適当な場所に"Mahout"のJarとリコメンデーションに利用するデータを
配置します。

配置するJarはコチラからダウンロードした"mahout-core-0.5-job.jar"となります。

リコメンデーションに利用するデータは下記のようなデータで、
ユーザーIDと、そのユーザーが購入した!?商品をカンマで区切って並べた形になっています。

▼ vote.txt
1,1
1,2
1,3
1,4
1,5
2,2
2,4
2,6
2,8
3,3
3,6
3,9
4,4
4,8
5,5
6,2
6,4
6,6
6,8
6,10
7,4
7,8
7,2
7,6
8,6
8,2
8,8
9,8
9,6
10,10

必要ファイルのS3への配置が終わったら、
実際に"AWS Management Console"で"Elastic MapReduce"を利用します。


そして、S3に配置したファイルを指定する形で、
リコメンデーションで使うクラスや引数などを指定します。


入力項目は下記の通りです。

Jar Location
s3n://emr.suz-lab.com/jar/mahout-core-0.5-job.jar
Jar Arguments
org.apache.mahout.cf.taste.hadoop.item.RecommenderJob
-Dmapred.output.dir=s3n://emr.suz-lab.com/output/aws77
-Dmapred.input.dir=s3n://emr.suz-lab.com/input/aws77/vote.txt
--similarityClassname SIMILARITY_COOCCURRENCE
--booleanData true

基本的にHadoopを利用するときと同じですが、
ファイル入出力部分の対象がS3になっているので、注意が必要です。

ここでは、"--similarityClassname"に"SIMILARITY_COOCCURRENCE"を利用していますが、
他にも、
SIMILARITY_COOCCURRENCE
SIMILARITY_EUCLIDEAN_DISTANCE
SIMILARITY_LOGLIKELIHOOD
SIMILARITY_PEARSON_CORRELATION
SIMILARITY_TANIMOTO_COEFFICIENT
SIMILARITY_UNCENTERED_COSINE
SIMILARITY_UNCENTERED_ZERO_ASSUMING_COSINE
SIMILARITY_CITY_BLOCK
と指定でします。
(違いは全くわかってないので、どこかでまとめて勉強します。。。)

そして、起動するインスタンスのタイプや数を指定して、実際に実行します。



実行結果は、出力先(s3n://emr.suz-lab.com/output/aws77)に
"part-r-00000"というファイル名で、書き出されました。
(データが多く、インスタンスも複数起動していると、複数ファイル書き出されるはずです)

▼ part-r-00000
1 [6:8.0,8:8.0,10:2.0,9:1.0]
2 [10:4.0,3:3.0,1:2.0,5:2.0,9:1.0]
3 [2:5.0,8:5.0,4:4.0,1:1.0,5:1.0,10:1.0]
4 [2:8.0,6:8.0,10:2.0,1:1.0,5:1.0,3:1.0]
5 [1:1.0,2:1.0,3:1.0,4:1.0]
6 [3:3.0,1:2.0,5:2.0,9:1.0]
7 [10:4.0,3:3.0,1:2.0,5:2.0,9:1.0]
8 [4:11.0,10:3.0,3:2.0,1:1.0,5:1.0,9:1.0]
9 [2:8.0,4:7.0,10:2.0,3:1.0,9:1.0]
10 [2:1.0,4:1.0,6:1.0,8:1.0]

まとめると下記のような感じでしょうか?
他のユーザーの購入動向から、おすすめ商品が計算されているのが、
何となくわかるのでは、と思います。

ユーザー  購入済み商品   おすすめ商品      おすすめ度
1       : 1,2,3,4,5   -> 6,8         ( 8.0)
2       : 2,4,6,8     -> 10          ( 4.0)
3       : 3,6,9       -> 2,5         ( 5.0)
4       : 4,8         -> 2,6         ( 8.0)
5       : 5           -> 1,2,3,4     ( 1.0)
6       : 2,4,6,8,10  -> 3           ( 3.0)
7       : 2,4,6,8     -> 10          ( 4.0)
8       : 2,6,8       -> 4           (11.0)
9       : 6,8         -> 2           ( 8.0)
10      : 10          -> 2,4,6,8     ( 1.0)

ということで、次は#AWS77データでを使ってリコメンデーションしてみます!
--------
http://www.suz-lab.com

0 コメント: