はじめに
業務でレコメンデーションを使う必要があり、Pythonのレコメンデーションライブラリについて調査を行ったので備忘録としてまとめました。なお、ライブラリの簡単な紹介が主で、アルゴリズムの解説等については言及していませんので、そちらに関しては必要に応じて別資料を参照をお願いします。
レコメンド周りはこれまで扱ったことはなかったのですが、この辺りも、真剣に勉強しなければと切に感じる今日この頃です。。
crab
HP: http://muricoca.github.io/crab/
GitHub: https://github.com/muricoca/crab
Pythonの協調フィルタリングの実装で最初に見つけたのがこのライブラリ。アイテムベースとユーザーベースの協調フィルタリングが計算できるとのことですが、GitHubのmasterの最終更新が4年前ということで、最近はあまり使われていないようです 。。他のライブラリの依存関係もあり、最近の環境ではうまく動きませんでした。
カンファレンスでの発表資料
http://conference.scipy.org/scipy2011/slides/caraciolo_crab_recommendation.pdf
python-recsys
HP: http://ocelma.net/software/python-recsys/build/html/index.html
GitHub: https://github.com/ocelma/python-recsys
特異値分解と近傍アルゴリズムを使った協調フィルタリングが可能です。計算したモデルをファイルとして保存・再利用ができたり、評価に関してもメソッドが充実しているため、精度を追求するのでなければこちらが一番簡単に利用できる印象です。
ただし、近年の主流である Nonnegative Matrix Factorization (NMF) を使った手法には対応していないため、そちらを使いたい場合は下記のninfaを使って実装する必要があるかと思います。
ちなみに、私は今回アイテム同士の類似度の算出も必要だったため、こちらを採用しました。
nimfa
HP: http://nimfa.biolab.si
GitHub: https://github.com/marinkaz/nimfa
近年の流行りであるNMF を使った手法は、レコメンデーションのライブラリとしては存在しないようですが、実装において肝になる行列の演算はライブラリとして提供されているので、こちらを使うことでそれほど困難なく実装は実現できそうです。実装アルゴリズムはかなり豊富で、Factorizationの実装だけでも10種類以上ありました。違いが。。 (ry
NMFに関する参考資料
[Matrix Factorization Techniques for Recommender Systems]
(http://www2.research.att.com/~volinsky/papers/ieeecomputer.pdf)
[非負値行列因子分解 NMF の基礎とデータ/信号解析への応用]
(http://www.kecl.ntt.co.jp/icl/signal/sawada/mypaper/829-833_9_02.pdf)
[Non-negative Matrix Factorization(非負値行列因子分解)]
(http://d.hatena.ne.jp/a_bicky/20100325/1269479839)
Spark + MLlib
MLlib - Collaborative Filtering
Spark + MLlib にもレコーメンデーションの実装はあるので、スケールアップで対応できない量のデータを分散処理をする場合はこちらを使うのがよいと思います。なお、MLlibでは Alternate Least Square という手法を使ってMatrix Factorizationが実装されており、PythonのAPIも提供されています。
参考資料
[Spark and Matrix Factorization]
(http://stanford.edu/~rezab/slides/reza_codeneuro.pdf)
[Spark の MLlib を使った Dataproc でのレコメンドシステムの実装]
(http://qiita.com/kndt84/items/b975ac9e6552f5289ec9)
まとめ
Pythonでレコメンデーションを実装する場合、手軽に利用したいたいということであれば、python-recsysを使うのが一番手っ取り早いかと思います。ただし、最近の流行りであるNMFには対応していないので、NMFを使いたい場合は、nimfaを使うことで実装するのがよいかと思います。
また、スケールアップで対応できない量のデータを扱う場合は、Spark + MLlibにレコーメンデーションの実装があり、PythonのAPIも提供されているので、こちらを使うのがよいと思います。こちらに関しては、別途検証を行っていますので、また別記事で紹介予定です。