サナギわさわさ.json

サナギさんとキルミーベイベーとプログラミングが好きです

協調フィルタリングのメモ

レコメンドエンジンを作りたくなったので、協調フィルタリングについて簡単に調べました。今回はメモリベースの協調フィルタリングにのみ言及します。数学的な式などは省いており、概念的なメモだけです。
参考リンク: http://japan.zdnet.com/web/sp_08ec/20375385/
http://d.hatena.ne.jp/EulerDijkstra/20130407/1365349866
http://www.kamishima.net/archive/recsysdoc.pdf

協調フィルタリングとは

ユーザーの行動履歴からレコメンド内容を決める手法。
ユーザーの行動履歴のみからレコメンドを行えるのでアイテムの詳細情報を事前インプットしておく必要がない。そのため人が想定しないレコメンドができ、また半自動化ができる。
ユーザーベース協調フィルタリングとアイテムベース協調フィルタリングに分類される。

ユーザーベース協調フィルタリング

ユーザーの行動履歴を基に類似ユーザーを判定し、類似ユーザーがチェックしたアイテムをレコメンドする。

アイテムベース協調フィルタリング

ユーザーの行動履歴を基に類似アイテムを判定し、レコメンドする。

ユーザーベース協調フィルタリングには以下の欠点があるため、アイテムベース協調フィルタリングの方が用いられるケースは多い。(たぶん)

ユーザーベース協調フィルタリングの主な欠点

  • ユーザーが1人増えるごとにユーザー数ぶんの類似度計算を行う必要があり、処理が重くなる (アイテムベースの場合は事前にアイテム同士の類似度計算を行っておく事で処理を軽くできる)
  • 対象となるユーザーの履歴が溜まっていない場合にレコメンドができない
  • アイテムベースと比較して外れ値に影響されやすい。

類似度計算の代表的手法

  • ユークリッド距離
  • ピアソン相関係数(相関を取るのでデータが正規化されていない場合に有効)
  • コサイン類似性(アイテムベース類似性で良く使われる)

アイテムベースにしてもユーザーベースにしてもデータ量は非常に大きくなるので、類似度計算は最大のボトルネックになる。

レコメンドの精度を上げるために

以下の工夫が代表的。どんなサービスかによって細かいチューニングの方法は変わる。

  • 履歴を複数種類抽出し、それぞれに重み付けを行う(閲覧・興味・購入など)
  • 異なる履歴から複数種類のレコメンドを算出し、場面によって使い分ける(例:閲覧ベースレコメンドと興味ベースレコメンド)
  • アイテムの類似度をそのままレコメンド率に用いるのではなく、類似度上位10個の中からそれぞれ10%ずつ出すなどの平滑化処理を行う
  • 外れ値の除外(同一ユーザーからの大量アクセス・レコメンド機能を介したアクセスなどは除外するのが一般的)
  • メモリベースとコンテンツベースのハイブリッド (評価が十分に集まっていないアイテムに対してもレコメンドを出したい場合などに特に有効)