推薦システム — 空欄を埋めて「おすすめ」を作る

通販サイトの「この商品を買った人はこちらも」、動画サービスの「あなたへのおすすめ」。その正体は、まだ評価していない商品の点数を予測することです。ユーザー×アイテムの巨大な表には空欄だらけ。その空欄を上手に埋める2つの発想 — 協調フィルタリングと内容ベース — を動かして体感します。

1. 評価行列 — 空欄を埋めるのが推薦

推薦の舞台は、行がユーザー、列がアイテム、マスがその人の評価(★1〜5)という表です。実際にはほとんどのマスが空欄(?)。「あなた」がまだ観ていない作品に何点を付けそうかを予測できれば、点が高そうな作品を薦められます。

下の表の「?」のマスをクリックしてみてください。予測が計算されて埋まります。どうやって埋めているのかは、次の節で分解します。

評価行列 — 「?」をクリックして予測
点滅している「?」のマスをクリック
マスの色は評価の高さ(赤=低い〜緑=高い)。右のパネルに「予測に使った似たユーザー」と、その重みつき平均が出ます。似ていない人の意見は自動的に軽く扱われます。
POINT — おすすめ=空欄予測 推薦は「未知の評価を予測して、高そうな順に並べる」問題に落ちる。評価だけでなく「クリックした/買った/最後まで観た」といった行動も、同じ表の値として使える。

2. 似たユーザーを探す — 協調フィルタリング

空欄を埋める1つ目の発想が協調フィルタリング。「あなたと好みが似た人を見つけ、その人たちの評価を平均する」だけです。SF好き同士なら、片方が高評価した未知の作品を、もう片方も気に入る可能性が高い、という素朴で強力なアイデアです。

下は「あなた」と各ユーザーの似ている度(評価パターンの近さ)を棒で表したもの。近い人ほど長い棒。使う人数 k を変えると、予測に混ぜる「ご近所さん」の数が変わります。

ご近所さん探し — 似ている度で重みづけ平均
対象は「あなた ×〈恋愛〉」の空欄。似ている度が高い上位 k 人(枠つき)の評価を、似ている度で重みづけして平均します。似ていない人まで入れると予測がぼやけるので、近い人だけ使うのがコツです。
予測あなた,商品 = ( Σ似た人 u 似ている度u × 評価u,商品 ) ÷ ( Σu 似ている度u ) 似ている度は「評価パターンの近さ」。コサイン類似度や相関係数で測ることが多い

3. 内容ベース — アイテムの特徴で薦める

2つ目の発想は内容ベース。ユーザーではなくアイテムそのものの特徴(ジャンル・タグ)に注目します。「あなたが好きだった作品のタグ」を集めてプロフィールを作り、タグがよく重なる別の作品を薦めます。他人のデータが要らないのが強みです。

下で左の作品をクリックして「好き ♥」にすると、あなたの好みプロフィールが更新され、右の候補が特徴の重なりで採点されます。重なったタグが光ります。

タグの重なりで採点 — 内容ベース推薦
左の作品をクリックで「好き ♥」を切り替え
好きな作品のタグを足し合わせたものが「あなたの好み」。候補作品は、あなたの好みタグと重なるほど高得点。★が付いた方が今のおすすめです。好みを変えるとおすすめも入れ替わります。
注意 — 内容ベースは「似た物ばかり」になりがち タグの重なりだけで薦めると、SF好きにはSFしか出てこないタコツボ化が起きる。協調フィルタリングは「似た人が好きだった意外な物」を運んでくれるので、実務では両方を組み合わせる(ハイブリッド推薦)。

4. コールドスタート — データが無いと薦められない

推薦の最大の弱点がコールドスタート問題。登録したての新規ユーザーは評価が空っぽで「似た人」を探せず、協調フィルタリングが効きません。新登場のアイテムも、まだ誰も評価していないので表から予測できません。

下で状況を切り替えて、どの手法が使える/使えないかを見てください。データが無い所では、内容ベースや単純な人気順が助けになります。

コールドスタート — 効く手法・効かない手法
赤くハイライトされた行/列が「データが無い」部分。○=使える/△=部分的/✕=使えない。新規ユーザーには内容ベースや人気順、新規アイテムにはタグを使う内容ベースが効きます。

5. まとめ — おすすめを作る2つの発想

一歩先へ — 行列分解とニューラル推薦 実サービスの表は数百万×数百万で、空欄が99%以上。そこで行列分解が活躍する。巨大な表を「ユーザーの好みベクトル × アイテムの特徴ベクトル」の積に圧縮し、空欄を一気に埋める。これは前レッスンの埋め込み(ベクトル化)と同じ発想で、現代のニューラル推薦(two-tower モデルなど)へ直結している。