【研究課題レポート抜粋】Apache Mahout を用いたレコメンデーションエンジンの検討 | サイバーエージェント 公式エンジニアブログ
※このエントリは、社員のTossyさんによって作成された第5回研究課題レポートからの抜粋です。



はじめに
 近年、機械学習が非常に注目を集めている。機械学習を用いることによって、データから有用な規則、ルール、知識表現、判断基準などを抽出することができる。
機械学習を用いた例として、レコメンデーション、クラスタリング、分類、市場予測、評判分析、情報抽出、文字認識、ロボットなどが挙げられる。

 また、アメーバを含むインターネットサービスの普及により、解析対象データが急激に増加している。解析アルゴリズムは最低でも線形の計算量が必要だが、それでも昨今のデータ増加量が上回っている。
 世界で作成されたデータ量は、2009 年時点で0.8ZB にもなっており、2020 年には35ZB にも膨れ上がると予想されている(Degital Universe 2010)。
 このことにより、機械学習処理の並列分散は今後必須であると考えられる。

 この問題に対するアプローチの1 つとして、Apache Mahout[1] がある。
これは、Hadoop[2]上で機械学習を行うためのライブラリである。クラスタリングや、パターンマイニング、文字列データ処理、分類、行列演算などの様々な手法をサポートしており、スケーラブルであることを最優先しているため、百台超でも線形にスケールすることが確認されている。

 本レポートでは、Apache Mahout を調査し、レコメンデーションエンジンに応用できないかを検討した。具体的には、Apache Mahout のTaste という協調フィルタリングのライブラリを使用し、アメーバのタレントを対象とした簡易レコメンデーションエンジンを実装した。



Apache Mahout について
 本章では、Apache Mahout についての概要を述べる。
Apache Mahout は、Apache Software Foundation のオープンソースプロジェクトであり、大規模データセットのためのスケーラブルな機械学習ライブラリである。

 Apache Mahoutのゴールは、Apache ライセンスのもと、無料で使用できるスケーラブルな機械学習のライブラリ群を構築することである。多くの実装について、スケーラビリティを担保するためにHadoop を使用している。
 現在、Apache Mahout は以下の機能を実装している。

・Taste による協調フィルタリング

・Canopy クラスタリング

・K-Means, Fuzzy K-Means クラスタリング

・期待値最大化法

・平均シフトクラスタリング

・ディリクレ課程クラスタリング

・Latent Dirichlet Allocation

・Parallel FP growth algorithm

・連語抽出

・ロジスティック回帰

・単純ベイズ法, Complementary 単純ベイズ法

・サポートベクトルマシン

・パーセプトロン, Winnow

・ニューラルネットワーク

・ランダムフォレスト

・Restricted Boltzmann Machine

・特異値分解


レコメンデーションエンジン
 本章では、今回作成したレコメンデーションエンジンについて述べる。

(1)データについて
 本レポートで用いたデータは、アメーバのログインユーザによるタレントブログ閲覧のログの1日分(2011/02/25 分) を用いた。データフォーマットを以下に示す。



    誰が[TAB] どのタレントのブログを見たか

    誰が[TAB] どのタレントのブログを見たか






 Apache Mahout のTaste では、UserID とItemID をLong 型で扱うため、アメーバID のそれぞれに固有のシーケンス番号を割り当て、それを使用した。


(2)ItemSimilarityJob について
 ItemSimilarityJob は、Apache Mahout が提供しているアイテムベース協調フィルタリングのHadoop MapRedce ジョブである。ItemSimilarityJob は、全てのアイテムの類似度を計算する。
 入力として、UserID,ItemID(,preference value) のリストを受け取り、ItemID の各ペアの類似度を計算し、出力する。
 以下、使い方の例である。mahout-core-0.4-job.jar はApache Mahout のWeb サイトからダウンロードできる。


    hadoop jar mahout-core-0.4-job.jar org.apache.mahout.cf.taste.hadoop.similarity.item
    .ItemSimilarityJob -i input -o score -s SIMILARITY LOGLIKELIHOOD

 オプションの詳細は以下にまとめる。






-input (-i)入力ファイル、またはディレクトリ
-output (-o)出力ディレクトリ
-similarityClassname (-s)類似度を計算するクラス名、またはプリミティブの類似度を指定

(SIMILARITY_COOCCURRENCE,

SIMILARITY_EUCLIDEAN_DISTANCE,

SIMILARITY_LOGLIKELIHOOD,

SIMILARITY_PEARSON_CORRELATION,

SIMILARITY_TANIMOTO_COEFFICIENT,

SIMILARITY_UNCENTERED_COSINE,

SIMILARITY_UNCENTERED_ZERO_ASSUMING_COSINE)
-maxSimilaritiesPerItem (-m)アイテム毎の類似アイテム数の上限(デフォルト100)
-maxCooccurrencesPerItem (-o)アイテム毎の共起数の上限(デフォルト100)
-booleanData (-b)入力をpreference value 無しで扱うかどうか


(3)デモアプリ
 本レポートで簡易レコメンデーションエンジンを実装した。
 用いたアルゴリズムは、SIMILARITY_LOGLIKELIHOOD、SIMILARITY_TANIMOTO_COEFFICIENT、SIMILARITY_UNCENTERED_ZERO_ASSUMING_COSINE である。

まとめ
 本レポートでは、Apache Mahout のTaste による協調フィルタリングを用いて、タレントを対象とした簡易レコメンデーションエンジンを実装した。厳密な精度評価はしていないが、主観ではそこそこの精度が出ていると思う。
 今後は、引き続きApache Mahout を調査し、これを応用したアプリケーションを模索していきたい。


 参考文献
【1】Apache Mahaout 
http://mahout.apache.org/

【2】Apache Hadoop 
http://hadoop.apache.org/

【3】Mahaout Wiki 
https://cwiki.apache.org/con
uence/display/MAHOUT/Mahout+Wiki