[Hadoop]Hadoop上でMahoutを使って「このアイテムを見た人は、こちらのアイテムも見ています」というレコメンドをやってみる

2012年4月19日

前回はHadoopのインストールで、今回がいきなり実用的な内容で、ちょっと基礎を飛ばしてますが、気にしない。

レコメンドというと、パッと思いつくのはAmazonのレコメンドではないでしょうか。

商品を見ていると、「この商品を買った人はこれも一緒に買っています。」といった感じの物ですね。

今回はこのレコメンドを簡単に実装する方法を探ってみます。

まず、解析後に欲しいデータとして

あるアイテム(item1)に対して、関連するアイテム(item2,item3,item4)をひもづけるデータです。

データベースに入れて使える状態で言うと

(ユーザが今開いたアイテムのID), (ユーザが開いたアイテムに関連するアイテムのID)
item1, item2
item1, item3
item2, item4

というキーバリューのペアです。

この結果を得るために必要な情報ですが

ユーザ毎にアクセスしたアイテムの一覧を、解析にかける元データとします。

ユーザID, アイテムID
user1, item1
user1, item2
user1, item4
user2, item1
user2, item5
user3, item3

というキーバリューのペアです。

このデータから解析結果を導き出すのですが

Hadoop界隈には、便利な機械学習ライブラリがあります。

Mahoutというライブラリで、様々な解析をするジョブがたくさん入っています。

今回はこの中のItemSimilarityJobという機能を使います。

ItemSimilarityJobには解析方法として

SIMILARITY_COOCCURRENCE
SIMILARITY_LOGLIKELIHOOD
SIMILARITY_TANIMOTO_COEFFICIENT
SIMILARITY_CITY_BLOCK
SIMILARITY_COSINE
SIMILARITY_PEARSON_CORRELATION
SIMILARITY_EUCLIDEAN_DISTANCE

というオプションが指定できます。

今回はSIMILARITY_COSINEという、コサイン関数による類似アイテムの解析を実行します。

とりあえず、ItemSimilarityJobのオプションを見てみましょう。

とすれば、オプションの一覧が表示されます。

このオプションの中で今回設定する物は、

–input
–output
–similarityClassname
–booleanData

です。

inputは、解析する元データ

outputは解析結果の保存場所

similarityClassnameは解析方法

booleanDataは、元データにレートがあるかどうか

今回の元データには、レートがないので、booleanDataにはtrueを指定

similarityClassnameにはSIMILARITY_COSINEを指定します。

では、元データを準備してみましょう。

○user-item.tsv(実際に使った物はもっとでかい)

このファイルを、HadoopのHDFS上に送り込みます。

これでhadoopのHDFS上にファイルが送信されました。

このファイルをItemSimilarityJobで解析するようにコマンドオプションを組み立ててみます。

このコマンドを実行すると、outputに解析結果ファイルが作成されます。

という感じで、できあがります。

一つ目のアイテムIDに対して、二つ目が関連するアイテムID、最後にそのアイテムのレート(おすすめ度?)となります。より近いアイテムほど数値が高くなります。

なので、おすすめとして表示する時にはレートでソートして表示するのが良いかもしれません。