Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Pythonでのレコメンデーション実装についての備忘録

More than 5 years have passed since last update.

はじめに

業務でレコメンデーションを使う必要があり、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
非負値行列因子分解 NMF の基礎とデータ/信号解析への応用
Non-negative Matrix Factorization(非負値行列因子分解)

Spark + MLlib

MLlib - Collaborative Filtering

Spark + MLlib にもレコーメンデーションの実装はあるので、スケールアップで対応できない量のデータを分散処理をする場合はこちらを使うのがよいと思います。なお、MLlibでは Alternate Least Square という手法を使ってMatrix Factorizationが実装されており、PythonのAPIも提供されています。

参考資料
Spark and Matrix Factorization

Spark の MLlib を使った Dataproc でのレコメンドシステムの実装

まとめ

Pythonでレコメンデーションを実装する場合、手軽に利用したいたいということであれば、python-recsysを使うのが一番手っ取り早いかと思います。ただし、最近の流行りであるNMFには対応していないので、NMFを使いたい場合は、nimfaを使うことで実装するのがよいかと思います。

また、スケールアップで対応できない量のデータを扱う場合は、Spark + MLlibにレコーメンデーションの実装があり、PythonのAPIも提供されているので、こちらを使うのがよいと思います。こちらに関しては、別途検証を行っていますので、また別記事で紹介予定です。

kndt84
センサーデータいじりしてます。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away