Azureで機械学習したいなら、API化とかが簡単にできるAzure ML使うほうがいろいろ楽ですが、オーソドックスにMahoutを使う手順も確認してみます。とは言え普通のLinuxクラスタでMahout使うのと何も変わりません。
基本的にはここの通りやれば良い。
HDInsightクラスタの作成
詳しくはこちらをご覧下さい。2015年12月17日現在、利用できるMahoutのバージョンは0.9のようです。
また、各HDInsightのバージョンで利用できる各種ツールのバージョンはここで確認できます。
最新版の3.3を利用すれば0.9+が利用できるようになるようです。ニューラルネットとかに対応している?のでしょうかね。
データの準備
データは、MSがテスト用に用意していてくれているものを利用します。
テストデータのダウンロードと展開
コンソールにログインした状態で、
curl -O http://files.grouplens.org/datasets/movielens/ml-100k.zip
unzip ml-100k.zip
cd ml-100k
hadoop fs -put u.data /example/data/mahout/
サンプルでは、/example/data/を利用していますが、ここには別のファイルが既に存在しているので、読み込みエラーになるかと思います。
内容を覗いてみる
普通にcatすれば良いのですが、せっかくなのでHiveでテーブルを作成して内容を見れうようにしておきます。
CREATE EXTERNAL TABLE members(
userID string,
movieID string,
userRating string,
time string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
LOCATION 'wasb://<container>@<account>.blob.core.windows.net/example/data/mahout/';
<container>,<account>は適宜変更して下さい。
Mahoutの利用
コマンドの実行
では、Mahoutを利用してみます。recommenditembasedをSIMILARITY_COOCCURRENCEオプションで実行しています。
いわゆるレコメンドです。強調フィルタリング。
mahout recommenditembased \
-s SIMILARITY_COOCCURRENCE \
-i /example/data/mahout/u.data \
-o /example/data/output \
--tempDir /temp/mahouttemp
10万人の処理をするのに、1ノードで20分くらいかかります。この量であればHadoopでMahout使わない方が効率がいいかもしれません。
結果
結果は、/example/data/output/以下にpart-r-00000という名称で出力されます。
1 [234:5.0,347:5.0,237:5.0,47:5.0,282:5.0,275:5.0,88:5.0,515:5.0,514:5.0,121:5.0]
2 [282:5.0,210:5.0,237:5.0,234:5.0,347:5.0,121:5.0,258:5.0,515:5.0,462:5.0,79:5.0]
上記の場合、ID 1の会員さんへのオススメムービーはID 234のムービーで、スコアは5.0といった意味になります(オススメは複数あります)。
実際にECサイト等で利用する場合は、このファイルを取得し、RDB等に流し込んでユーザーを取得した後、ユーザーテーブルやムービーテーブルをJOINさせてレコメンドを見せる感じになります。