#協調フィルタリング
機械学習を勉強し始めて割と序盤に引っかかった「recommend_system」ですが、せっかく勉強するので簡単にまとめておこうと思いました。
*コードの例とかは無いのでそのような意図の方は別の記事をお勧めします。
また、まとめるにあたって参考にさせていただいた記事も載せておきます。図を用いてあるなど、非常にわかりやすく書かれておりますのでこちらを読むことでも協調フィルタリングについての理解は深める事ができると思います。
Analyze IT.→協調フィルタリングについてまとめてみた。
株式会社Albert:→協調フィルタリングとは
hoxo_m(Slide Share)→協調フィルタリング入門
Jun Hong→A Survey of Collaborative Filtering Techniques(英文です。)
#>目次
#Recommend_Systemとは
recommend_Systemは顧客データ(購買履歴、行動、年齢他)を元に、顧客に推薦(レコメンド)することである。卑近な例で言えばamazonのECサイト(ショッピングサイト)などで導入されている。
大きく
- 協調フィルタリング
- 内容ベース
の二つに大別される事が多い。
似たように捉えられがちだが、もとにするデータから根本的に異なりそれぞれ一長一短がある。
##協調フィルタリングについて
協調フィルタリングとはレコメンドシステムのうちの1つであり、
最もわかりやすく取り掛かりとしてよく知られているのは、ほかのユーザーのデータをもとに新たな商品を推薦するシステムだ。
もう少し詳しく書くと、あなたの購入した商品をもとに傾向が似ているユーザー同士を膨大なデータからピックアップし、他のユーザーが購入しているが、あなたの購入していない(あるいは再購入しそうな)ものを「オススメ」するシステムである。amazonで言えば、「あなたへのオススメ」の他に「これを購入した人は、こちらも購入してます」といった表示がそれに近い。このシステムには少なくとも2名以上のユーザーが必要である。
###例1
ユーザー1、2、3が商品A,B,C,Dの中からいくつか選んだとする。(以下表の通り、数字は購入数)
商品A、C、Dはプログラミングの書籍、Bはビジネス書としよう。
ユーザー名 | 商品A | 商品B | 商品C | 商品D |
---|---|---|---|---|
ユーザー1 | 2 | 0 | 0 | 1 |
ユーザー2 | 2 | 1 | 1 | 1 |
ユーザー3 | 0 | 0 | 1 | 0 |
↓
ユーザー名 | 商品A | 商品B | 商品C | 商品D |
---|---|---|---|---|
ユーザー1 | 2 | 0(オススメ) | 0(オススメ) | 1 |
ユーザー2 | 2 | 1 | 1 | 1 |
ユーザー3 | 0 | 0 | 1 | 0 |
お分かりのとおりユーザー1,2は購入商品の傾向が非常に似ており、おそらくユーザー1には商品B,Cがレコメンドされるだろう。
何が凄いのか?というと、本屋など場所がカテゴライズされている実店舗では、目にする事がないであろうビジネス書の商品Bがお勧めされるという事である。プログラミングの商品を購入したい人であれば商品Cのみしか手が届かないであろうに、この協調フィルタリングは機会損失(言い換えればセレンディピティ・運命の巡り合わせ)に対応しているということになる。確かにとても有効なレコメンドシステムだと思う。
但し注意しなければならないこともある。そもそも膨大なユーザー数が必要であったり、データにばらつきがあると的確なレコメンドが提示されないなどの問題点もあるとのこと。
つまり、商品AとCは同じプログラミングの参考書なのにもかかわらず、商品Cを購入したユーザー3には商品A,Dがお勧めされないのだ。ユーザー3と似たような評価をもつユーザーがいないとお勧めされないという事だ。(このユーザー3をgray_sheepというらしい)
上記のようなデータをもとにした協調フィルタリングを
Memory-based Collaborating Filtering(CF)という。
その他に、モデルを作りそれをもとにレコメンドするModel-based CFや、良いところを取ったHybrid CF Algorithmsなどがある。
##内容ベースについて
協調フィルタリング(CF)の他に商品ベース(Contents-based)のレコメンドシステムがある。これらの違いは、協調フィルタリングが顧客の評価(買ったか買わないか、星いくつを付けたなど)をもとにオススメを予測するのに対して、内容ベースは顧客の購入した商品の特徴(カテゴリーや製作者、用途など)をもとに類似商品を提示する。こちらの方が直感的に理解しやすいだろう。
例2)
先と同じ例を用いる。ユーザー1、2、3が商品A,B,C,Dの中からいくつか選んだとする。(以下表の通り、数字は購入数)
商品A、C、Dはプログラミングの書籍、Bはビジネス書としよう。
ユーザー名 | 商品A | 商品B | 商品C | 商品D |
---|---|---|---|---|
ユーザー1 | 2 | 0 | 0 | 1 |
ユーザー2 | 2 | 1 | 1 | 1 |
ユーザー3 | 0 | 0 | 1 | 0 |
↓
ユーザー名 | 商品A | 商品B | 商品C | 商品D |
---|---|---|---|---|
ユーザー1 | 2 | 0 | 0(オススメ) | 1 |
ユーザー2 | 2 | 1 | 1 | 1 |
ユーザー3 | 0(オススメ) | 0 | 1 | 0(オススメ) |
ユーザー1に関してはプログラミングの書籍である商品A,Dの特徴から商品Cがレコメンドされるだろう。また先と違いユーザー3に関しても同様に商品A,Dがレコメンドされると考えられる。商品の特徴をもとにレコメンドを作成するため、類似商品や少数派のユーザーに対応できる。こちらもまた有効なレコメンドシステムである。
一方で商品Bは全く関係ないのでユーザー1に関してはレコメンドに表示されず、類似商品を超えた(関連性が薄い)レコメンドがなされないという問題点もある。それぞれ一長一短である。
<[例1](#例1)と比較>
これらを回避するため、Hybrid CFがあるが今回は本件とは関係ないので省略する。
#協調フィルタリングのやり方
##コードで実装する時の手順
実際に協調フィルタリングを実装する時の手順は4つに分類される。
- ユーザーの入力した評価(購入動向、星のなど)を取得する
- 類似度(similarity value)を計算する(cos類似度やユークリッド距離など)
- レコメンドしたいユーザーと類似度が高いユーザを見つける
- レコメンドする
といった流れだ。具体的な手法についてはコードなどが絡むため一旦割愛する。一例を知りたければこちらの方の記事を参照するといい。
##必要な知識
大きく**「統計学」と「プログラミング」**の2つの知識があれば基本的な実装は可能かと思う。「統計学」を読み解き、活用するにあたって「線形代数学」「微分積分学」などが必要であるが、大学の基本的な授業内容を抑えていれば十分に読み込める。(実際私もあまり苦労していない)
「プログラミング」に関しては数値計算に強い「Python」における知識があれば問題ないかと。関数や辞書型の取り扱いは勿論だが、pandasやnumpyといったPythonのライブラリを使えることは必要条件かと思われる。
研究やより高度な実装を進めていくにあたって「英語」が読めることは必要だがこのご時世ではgoogle翻訳もあるので不可欠とも言い難い。
#まとめ
協調フィルタリングはレコメンドシステムの一つであり、自身の評価動向が似ている別ユーザーの購入している商品をレコメンドするシステムである。
他者のデータをもとにしたレコメンドシステムであることから「協調」というのだろう。