レコメンドアルゴリズムのまとめ
概要
具体例(ユースケース)
など
アルゴリズム(概要)
参考URL
https://blog.brainpad.co.jp/entry/2017/02/03/153000
※レコメンドアルゴリズムの全体像が説明されており、非常にわかりやすい
コンテンツベースフィルタリング(内容ベースフィルタリング)
- アイテムやユーザの属性情報(メタ情報)のみを使ってレコメンドする
- 新商品や新規ユーザなど、まだ評価やログが溜まっていない状況において有効
- ニュースなど、アイテムの寿命が非常に短い場合、これに頼らざるを得ない場合も多い
- 単純なカテゴリ情報以外にも、テキスト情報などを取り込めれば、よりリッチなレコメンドができる
協調フィルタリング
ユーザの利用履歴を使ってレコメンドする。以下のとおり「近傍ベース」と「モデルベース」に分けられる。
よく「協調フィルタリング」と言われるのは、いわゆる近傍ベースの方。
近傍ベース(ユーザ・アイテム行列をそのまま推定に利用)
- アイテムベース(似たアイテムを推薦)
- ユーザーベース(似たユーザの関心が高いアイテムを推薦)
モデルベース(ユーザ・アイテム行列をモデル構築に利用して推定)
- 行列因子分解
- 確率的(NB、BNなど)
- 分類・回帰
ポピュラリティ推薦
いわゆる人気ランキング
教師あり学習
ユーザベクトル×アイテムベクトルを説明変数として、クリック有無などを予測する
アルゴリズム(詳細) ※詳細は別記事で整理予定
協調フィルタリング(近傍ベース)
- ユーザベースなら「ユーザ×アイテム」、アイテムベースなら「アイテム×ユーザ」の行列を作る
- 予測したい対象のユーザベクトル or アイテムベクトルの類似ベクトルN個を抽出
- アイテムベースなら、そのままそのN個をレコメンド
- ユーザベースなら、N人の評価を参考に、その人がまだ評価していないアイテムの評価値を推定し、推定評価値が高いアイテムを上位からレコメンド
アルゴリズムの課題・工夫点
「アイテム」を推薦するのが目的だが、そのアイテムをどうベクトル化するか?
- 属性情報(カテゴリーなど)
- テキスト情報(Word2Vecなど)
- ユーザの行動ログ(を文章と見立てててWord2Vecでベクトル化)
ユーザ×アイテムの評価行列は、ほとんどが欠損しているため、それをどう埋めるか?
- Matrix Factorization
- Label Propagation
コールドスタート問題
- https://eczine.jp/article/detail/2865
- 行動ログを元に推薦する場合、ログが溜まっていないユーザやアイテムはレコメンドの対象にならない
- コンテンツベースフィルタリングや、ポピュラリティ推薦などを使う
類似度指標の選定
- ユークリッド距離、コサイン距離、Jacard係数などから選定
バイアスの考慮(e.g.ユーザごとの評価バイアス(甘め/辛め)など)
- 事前に評価行列を中心化する
- 具体的には、評価値から各ユーザの評価平均値を引いて、すべての評価値を「ユーザの平均値からの差」の表現に直す
欠損値の多いベクトル同士の類似度の算出と調整
- 欠損のある2ユーザの類似度は「2ユーザが共通して評価している作品のみで算出する(pairwise)」という方法がシンプル
- だが、2ユーザがともに評価している作品の評価値のみしか計算に使えないため、使えるデータが少なくなるという欠点がある
- この欠点への対処としては、平均値で補完するなどの、いわゆる欠損値の対処手法を適用することになる
評価方法の検討
- レコメンドの良し悪しをどうやって評価するか?
- 各種評価指標は後述
リソースの効率的利用(e.g.行列やスパース行列を用いた効率的な計算など)
- 整理中
分散処理
- 整理中
クリックベイト問題(ニュース記事推薦)
- PV数を稼ぎたい目的で過度に扇情的なタイトルを付け、ユーザが騙されたと感じる問題
- 結果的に、ニュースアプリ全体の満足度低下を招く
フィルタバブル問題(ニュース記事推薦)
評価方法
https://blog.brainpad.co.jp/entry/2017/08/25/140000
オンライン評価
ABテスト
- CTR
- CVR
オフライン評価
レーティング精度(回帰)
- MAE
- RMSE
ゲイン有無精度(分類)
- Precision@N
- Recall@N
ランキング精度
- PR-AUC (ROC-AUC) :予測上位の感度を見たいので、PR-AUCの方が指標として適切と言われる
- MRR(Mean Reciprocal Rank):
- MAP(Mean Average Precision):適合値が出現する度にprecisionを計算し、それを平均する
- nDCG(normalized Discounted Cumulative Gain):評価値を予測順に並べて、いろいろ計算する
★ランキングの評価指標としては、まずROC曲線とPR曲線がポピュラー。
レコメンドの評価ではPR曲線をよく利用することを覚えておくと良い。
その他、MAPとnDCGが有名かなという印象。
カバレッジ精度
- カタログカバレッジ:1回のレコメンドでどのくらい多くのアイテムをレコメンドできたか
- 適合カタログカバレッジ:適合アイテムのみに対象を絞ったカタログカバレッジ
- ユーザカバレッジ:全対象ユーザのうち、1回のレコメンドでどのくらい多くのユーザに対してレコメンドできたか
- 適合ユーザカバレッジ:適合ユーザのみに対象を絞ったユーザカバレッジ
その他精度
- 目新しさ(Novelty)
- セレンディピティ(Serendipity)
- 多様性(Diversity)
★レコメンドの目的の一つが「ユーザを長期間魅了し続けること(LTVを上げる)」だった場合、利用履歴にあるユーザの嗜好と近いからと言って、あまり同じような商品ばかりをレコメンドしていてもユーザは飽きてしまうかもしれない。
ここでアイテムに対する意外性や出会いのようなものが必要、という考えが出てくる。
詳細は別途調査予定。
参考URL
https://yolo-kiyoshi.com/2019/10/31/post-1324/
Kaggle Job Recommendation Challengeのデータを使って協調フィルタリングとWord2Vecで精度比較している
https://www.slideshare.net/recruitcojp/ss-56150629
リクルートのレコメンド紹介スライド。
ユーザが接触したアイテムを「文章」に見立てて、Word2Vecを活用している。
①アイテムベクトルの作り方
- ユーザの行動ログを文章と見立てててWord2Vecでベクトル化したものを「アイテムベクトル」として、各アイテムの類似度を予め計算しておく ※Hadoopでコサイン類似度を計算
- ユーザの直近行動10アイテムに対して、類似度の高いアイテムを推薦
②ユーザベクトルの作り方
- ユーザがこれまで接触したアイテムを、①のベクトルを元に合成してユーザベクトルとみなす
- その合成ベクトルとの類似度が高いアイテムを推薦
https://blog.brainpad.co.jp/entry/2017/08/25/140000
各種評価指標をわかりやすく説明している
参考コンペ / サンプルデータ
https://www.kaggle.com/c/job-recommendation/overview
- 求人と求職のマッチング予測コンペ
- ユーザがアイテムにアクションしたかどうか、という1/0データ
https://signate.jp/competitions/45
- ユーザーの行動履歴データを元にその後それぞれのユーザーが高い関心度を示す商品を予測するコンペ
- データとして与えられるのは人材、旅行、不動産、アパレルの計4業種におけるユーザーの行動履歴データ
- ユーザのアイテム対するアクションレベルに応じてレーティング(閲覧:1点, クリック:2点, CV:3点)
- 映画作品レビューサイトのレーティングデータ
- 少なくとも20作品を評価しているユーザのみ対象
- ユーザがアイテムに5段階でレーティング
https://www.codexa.net/collaborative-filtering-k-nearest-neighbor/
- 「Anime Recommendations Database(アニメお勧めデータベース)」という、myanimelist.netの76,000ユーザーのアニメのレビューデータ
- ユーザがアイテムに10段階でレーティング
https://www.kaggle.com/netflix-inc/netflix-prize-data
https://www.kaggle.com/c/santander-product-recommendation/overview
- Santander Bankの24種のProduct(金融サービス)のうち、どれを新規利用するか?を予測
https://www.kaggle.com/c/instacart-market-basket-analysis/overview
- ユーザーが次に注文する商品を、以前購入した商品から予測する(レコメンドする)