Mahoutを使って協調フィルタリングをやってみる。
Mahoutを使うことで基本的に一切の予備知識無しで、機械学習技術を利用することができる。
本記事では、Mahoutのインストール方法から紹介するが、Hadoopはすでにインストール済みとする。
環境
- OS
- Linux version 2.6.32-279.el6.x86_64 (mockbuild@c6b9.bsys.dev.centos.org) (gcc version 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC) ) #1 SMP Fri Jun 22 12:19:21 UTC 2012
- Mahout
- Hadoop
Mahoutのインストール
$ cd /usr/local
$ wget http://archive-primary.cloudera.com/cdh/3/mahout-0.5-cdh3u6.tar.gz
$ tar zxvf mahout-0.5-cdh3u6.tar.gz
$ ln -s mahout-0.5-cdh3u6 mahout
$ rm mahout-0.5-cdh3u6.tar.gz
$ vim ~/.bashrc
---
# JAVA
export JAVA_HOME=/usr/local/jdk1.7
# Hadoop/Mahout
export HADOOP_HOME=/usr/local/hadoop
export MAHOUT_HOME=/usr/local/mahout
export HADOOP_CONF_DIR=$HADOOP_HOME/conf
---
$ source ~/.bashrc
$ /usr/local/mahout/bin/mahout
協調フィルタリング
入力ファイルの準備をした後、mahoutコマンドにオプションを指定して実行するだけで結果が得られる。
ちなみに入力データは以下。
# 入力ファイルのフォーマットは User ID,Item Id,Rating
$ vim input.txt
1,100,5
1,200,3
1,300,3
2,100,5
2,200,5
2,400,3
2,900,4
3,200,4
3,300,5
3,700,4
4,200,5
4,400,4
4,600,5
4,900,5
5,100,5
5,200,3
5,400,4
5,500,6
5,700,5
6,100,3
6,200,4
6,400,2
6,700,3
7,100,4
7,700,5
7,800,5
7,900,5
$ /usr/local/hadoop/bin/hadoop fs -mkdir /user/test/mahout
$ /usr/local/hadoop/bin/hadoop fs -mkdir /user/test/mahout/input
$ /usr/local/hadoop/bin/hadoop fs -ls /user/test/mahout
$ /usr/local/hadoop/bin/hadoop fs -put input.txt /user/test/mahout/input
$ /usr/local/hadoop/bin/hadoop fs -ls /user/test/mahout/input
$ /usr/local/mahout/bin/mahout recommenditembased --help
$ /usr/local/mahout/bin/mahout recommenditembased --input /user/test/mahout/input --tempDir /user/test/mahout/temp --output /user/test/mahout/output --similarityClassname SIMILARITY_PEARSON_CORRELATION
Running on hadoop, using HADOOP_HOME=xxx
HADOOP_CONF_DIR=xxx
MAHOUT-JOB: xxx
15/06/16 16:40:06 INFO common.AbstractJob: Command line arguments: {--booleanData=false, --endPhase=2147483647, --input=/user/test/tmp/mahout/input, --maxCooccurrencesPerItem=100, --maxPrefsPerUser=10, --maxSimilaritiesPerItem=100, --minPrefsPerUser=1, --numRecommendations=2, --output=/usr/test/tmp/mahout/output, --similarityClassname=SIMILARITY_PEARSON_CORRELATION, --startPhase=0, --tempDir=/user/test/tmp/mahout/temp}
15/06/16 16:40:08 INFO hdfs.DFSClient: Created HDFS_DELEGATION_TOKEN token 4383157 for test on xxx
15/06/16 16:40:08 INFO security.TokenCache: Got dt for xxx
15/06/16 16:40:08 INFO input.FileInputFormat: Total input paths to process : 1
15/06/16 16:40:08 WARN snappy.LoadSnappy: Snappy native library is available
15/06/16 16:40:08 INFO util.NativeCodeLoader: Loaded the native-hadoop library
15/06/16 16:40:08 INFO snappy.LoadSnappy: Snappy native library loaded
15/06/16 16:40:08 INFO mapred.JobClient: Running job: job_201502041505_1343701
15/06/16 16:40:09 INFO mapred.JobClient: map 0% reduce 0%
15/06/16 16:40:20 INFO mapred.JobClient: map 100% reduce 0%
...
# 出力データのフォーマットは User Id\t[Item Id:おすすめ度合い, ...]
$ /usr/local/hadoop/bin/hadoop fs -ls /user/test/mahout/output/
Found 110 items
-rw-r--r-- 3 test test 0 2015-06-18 15:31 /user/test/mahout/output/_SUCCESS
drwxrwxrwx - test test 0 2015-06-18 15:29 /user/test/mahout/output/_logs
-rw-r--r-- 3 test test 4 2015-06-18 15:30 /user/test/mahout/output/part-r-00000.snappy
-rw-r--r-- 3 test test 4 2015-06-18 15:30 /user/test/mahout/output/part-r-00001.snappy
-rw-r--r-- 3 test test 28 2015-06-18 15:30 /user/test/mahout/output/part-r-00002.snappy
-rw-r--r-- 3 test test 4 2015-06-18 15:30 /user/test/mahout/output/part-r-00003.snappy
-rw-r--r-- 3 test test 26 2015-06-18 15:30 /user/test/mahout/output/part-r-00004.snappy
-rw-r--r-- 3 test test 24 2015-06-18 15:30 /user/test/mahout/output/part-r-00005.snappy
-rw-r--r-- 3 test test 24 2015-06-18 15:30 /user/test/mahout/output/part-r-00006.snappy
-rw-r--r-- 3 test test 28 2015-06-18 15:30 /user/test/mahout/output/part-r-00007.snappy
-rw-r--r-- 3 test test 4 2015-06-18 15:30 /user/test/mahout/output/part-r-00008.snappy
-rw-r--r-- 3 test test 4 2015-06-18 15:30 /user/test/mahout/output/part-r-00009.snappy
-rw-r--r-- 3 test test 4 2015-06-18 15:30 /user/test/mahout/output/part-r-00010.snappy
...
$ /usr/local/hadoop/bin/hadoop fs -cat /user/test/mahout/output/*
2 [700:3.9172406]
4 [700:4.19286]
5 [900:4.375]
6 [900:2.375]
7 [400:4.6099067]
出力結果を表にすると以下のようになる。