こんにちはmiyoshiです。ミイダスHRサイエンス研究所ではエンジニアとして推薦エンジンの開発やコンピテンシデータの分析を行っています。今回は簡単な例を元に推薦システムにおけるimplicit feecbackデータの意味とnegative samplingの重要性について紹介します。

Explicit feedbackとimplicit feedback 

推薦システムでは、ユーザーのアイテムに対する行動データを取り扱います。行動データには大きく分けてexplicit feedbackタイプのデータとimplicit feedbackタイプのデータの2種類があります。explicit feedbackの代表例はAmazonの様なECサイトにおける星5つといったユーザの好き/嫌いの評価データ、implicit feedbackの代表例はECサイトにおけるアイテムの閲覧や購買のイベントデータです。explicit feedbackにおいてシステムがユーザの興味/関心の対象に加えて嫌いといったnegativeな評価をデータとして得られるのに対して、implicit feedbackタイプのデータはユーザが興味のある対象しか得られないのが特徴です。興味がなかった対象の情報が得られない反面、データ数はexplicit feedbackデータと比べて低コストで大量に得られるのも特徴です。
今回はこのimplicit feedback形式のデータの持つ「興味があるものしかデータとして得られない」点に注意しないことによって起こる問題について例を交えて示したいと思います。

ミニ職業紹介システム

デモンストレーションのために、以下の様な簡単な転職斡旋システムを考えます。

  • システムは、ユーザにポジションリストを提示します。
  • ユーザは興味をもったポジションをクリック(閲覧)し、さらに興味を持ったポジションに応募をします。
  • ユーザは住んでいる都道府県及び現在の職種の属性を持っています。
    • 職種は営業,事務,販売,企画,技術の5職種
  • ユーザに紹介されるポジションは勤務地の都道府県及び職種(同じく5種類)の属性を持っています。

ユーザーの行動について以下を仮定します。

  • ユーザーは、自分が住んでいる都道府県以外のポジションには興味がないので提示されても閲覧せずにスルーします
  • ユーザーは、自分が住んでいる都道府県と同じ勤務地のポジションに関して
    • 自分と違う職種の場合には閲覧するが応募はしません
    • 自分と同じ職種の場合には10%の確率で興味を持ち応募します

推薦システムはユーザの行動を事前に知らないものとします。

推薦システム学習の目標は、ユーザの閲覧、応募の行動データからモデルを学習し、適切な並び順(ユーザの応募確率が高い順)でユーザ毎にポジションを提示するモデルを得ることです。

推薦システムの性能の数値評価には、 大局的指標としてROC-AUC と 局所的ランキング指標としてnDCGを用います。

局所的ランキング指標とは各ユーザにリストを提示したときにどれだけ適合度の高いイベント(今回の例では応募 > 閲覧 > スルー)をリスト上位に持ってきているかを評価し、それを全ユーザで平均をとる形の指標です。一方大局的指標はユーザ単位に分けずに全イベントに関して評価値が応募 > 閲覧となっているかを評価するものです。

ROC-AUCは2値分類モデルの評価指標でPositiveとNegative に分類する際の閾値を変更した際の 真陽性率(TPR, True Positive Rate) と偽陽性率(FPR, False Positive Rate)のプロット図の範囲を示すもので、モデルの出力確率でサンプルを並べたときに上位側にPositveサンプル(今回の例だと応募)、下位側にNegativeサンプル(閲覧)がきれいに分かれて並ぶと1.0となります。

nDCGは2値に限らず複数のラベルに対して重み付けを用いた評価が可能な指標で、今回の例では、各ユーザに提示したリストを評価したときに、応募 > 閲覧 > スルーの順でリストの並び順が揃ったときに1.0となります。

Implicit feedbackを考慮しない場合

得られたイベントデータ

  • 入力
    • ユーザ都道府県、職種特徴量
    • ポジション都道府県、職種特徴量
  • 出力
    • 閲覧(=0) or 応募(=1)

をもとに閲覧(=0) or 応募(=1)を分類する二値分類のモデルをLightGBMで学習してみます。イベントデータをtrain/validation/testにsplitして学習し、testデータに対して分類精度の評価としてROC-AUCを出すと0.91という非常に高い値が出ました。テストデータに対して高い精度で閲覧するか応募するかが見分けられているのでモデルとしては一見良さそうに見えます。

しかしこのモデルの挙動を詳しくみてみると、推薦システムとして問題があることがわかります。例として、長野県に住んでいる技術職のユーザに対して、全都道府県、全職種のポジションを推定応募確率(prediction)でソートした結果のTop10をみてみます。


ポジション都道府県ポジション職種アクションprediction
沖縄県技術スルー0.112
徳島県技術スルー0.112
岡山県技術スルー0.112
東京都技術スルー0.112
広島県技術スルー0.112
千葉県技術スルー0.112
山口県技術スルー0.112
埼玉県技術スルー0.112
群馬県技術スルー0.112
山形県技術スルー0.112
香川県技術スルー0.112


理想的には長野に住む技術職のこのユーザには、長野県の技術職のポジションがトップで推薦されるべきなのですが、技術職は推薦できていても長野県のポジションは推薦できていません。

これは長野県に住むユーザが長野県以外のポジションに興味がなくスルーしてしまい、長野以外の県に興味がない事を明示的に示すデータが存在しなかったためだと考えられます。
このモデルの局所的ランキングのnDCGでの評価は0.27でした。

Negative sampling

上記の様な問題を防ぐ方法の一つがnegative samplingの付加です。ユーザが「興味がないポジションをスルーする」行動の仮想的なイベントサンプルとしてnegative samplingを学習対象データに付加して学習をします。具体的には適当に選んだユーザと適当に選んだポジションの組み合わせでnegative samplingを作ります。negative sampleには「スルー」というアクションを仮に与えます。

前回のモデルは2値分類だったのですが、今回はモデルの出力値が、

応募イベント > 閲覧イベント > スルーイベント

となる様に順序付けたランキング学習をおこないます。具体的には、LightGBMのLambdaMartを使って学習します。前回と同様に長野の技術職のユーザに推薦を行った結果のTop10は以下の様になりました。
(LambdaMartとは勾配ブースティングの最適化対象のLossをnDCGなどの評価指標に設定可能なランキング学習のアルゴリズムです。詳しくはLinkが参考になります。)

ポジション都道府県ポジション職種アクションprediction
長野県技術応募0.569
長野県企画閲覧0.076
山梨県技術スルー0.030
福井県技術スルー0.009
岐阜県技術スルー-0.134
静岡県技術スルー-0.153
長野県販売閲覧-0.210
長野県営業閲覧-0.378
山梨県企画スルー-0.463
長野県事務閲覧-0.467
福井県企画スルー-0.484

さきほどの結果と異なり、正しく長野県の技術職のポジションをトップに推薦できています。

さきほどと同様にテストデータに対して、応募vs閲覧のROC-AUCを算出するとnegative sampleを利用しなかった時と同じく0.91という値となりました。局所的ランキング指標のnDCGでの評価結果は0.95という高い値となりました。

ランキング結果の提示内容が良かった時と悪かった時でROC-AUCが共に高い値を出してしまった反面、nDCG値には良い結果と悪い結果が適切に値に反映されており、ランキング評価の指標として適切であることがわかります。

最後に

今回紹介した例では極端に簡易化した例であったため、Implicit feedbackの持つ問題点(興味がないデータがスルーされていることとそのデータを使った時の問題点)が明確でしたが、実際のデータでは得られたデータがImplicit feedbackであることに一見気づかないままモデルを学習してしまうことがあります。扱っているデータの性質を見分けることと適切な評価方法を設定することが重要です。
今回利用したcodeは 追って公開予定です。

参考文献