Apache Mahout を使って簡単なレコメンド処理を試してみた | SiTest (サイテスト) ブログ

メニューボタン閉じるボタン

Apache Mahout を使って簡単なレコメンド処理を試してみた

レコメンドエンジンは、Amazonのオススメ商品機能が有名です。
AmazonがWeb業界でこれだけの影響力がある理由としては、レコメンドエンジンを最初にビジネスとして展開させたことの要因が大きいと思われます。
そこで、今回はApache Mahout を使って簡単なレコメンド処理を試してみました。

  • ■ 実行してみる

Apache Mahout による簡単なレコメンド処理は、入力データをコンバートした DataModel をレコメンド処理をコンバートした Recommender に設定して、recommend メソッドにレコメンド対象のユーザーIDと対象となるレコメンドアイテム数を指定します。

今回はCSV ファイルを入力データとするFileDataModelとGenericItemBasedRecommenderを使用してみます。

入力 CSV ファイルフォーマットは、以下のようになります。

ユーザーID, アイテムID, 評価の値

GenericItemBasedRecommender はコンストラクタ内で指定する Similarity によって類似性の計算方法を設定できます。
Mahout には複数の Similarity が用意されています。

EuclideanDistanceSimilarity : ユークリッド距離
UncenteredCosineSimilarity : コサイン類似度
CityBlockSimilarity : マンハッタン距離
PearsonCorrelationSimilarity : ピアソン相関

などが挙げられます。

言語解析などは、作成したデータの行列が疎名行列になり情報を密にするためSVD(特異値分解)などのアルゴリズムが使用されます。

また、協調フィルタリングではSlope One 等のアルゴリズムが使用されます。
これらのSVDやSlope One 等の本格的なアルゴリズムを使用するには、Recommender(SVDRecommender や SlopeOneRecommender)を使用します。

それでは、単純な例を実行してみます。

実行例 (ユーザーID=1 のレコメンドアイテムを出力)
コマンドを叩くと以下の結果が出てきました。

result : 4, 3.6665667

アイテムID=4 がレコメンドされたアイテムです。

入力ファイルのデータが単純すぎたため
1アイテムしか出力されませんでした。

入力ファイル例

1,2,5
2,2,5
1,3,5
1,5,2
2,1,4
2,4,3
2,5,1
1,1,4
・・・

大規模の入力データを使うと 類似性 による違いが出てきます。

実行例2(ユークリッド距離 EuclideanDistanceSimilarity)

情報: Processed 55131 user
result : 149, 2.2220574
result : 143, 2.2179555
result : 133, 2.2135546
result : 137, 2.2050555
result : 145, 2.205735

実行例3(コサイン類似度 UncenteredCosineSimilarity)

情報: Processed 55131 users
result : 114, 4.388584
result : 117, 4.3185726
result : 129, 4.2214856
result : 138, 4.219598
result : 148, 4.108547

実行例4(マンハッタン距離 CityBlockSimilarity)

情報: Processed 55131 users
result : 117, 3.3547886
result : 129, 3.259705
result : 148, 3.1355408
result : 114, 3.1283574
result : 150, 3.1052058

■ 最後に

このようにApache Mahoutを利用すれば、レコメンドエンジンなどの複雑なアルゴリズムを組む必要がなく、大規模なデータもHadoopやSparkの環境下にて動かせば、簡単に実現できます。一度試してみては如何でしょうか。