2.1.5 評価の詳解

位置づけ

評価とは、推薦システムが本当に良い推薦を出しているかを測るための枠組みである。推薦モデルを作るだけでは不十分である。候補検索、ランキング、再ランキング、UI 表示、ログ収集まで含めて、ユーザー体験とビジネス成果が改善しているかを確認する必要がある。

推薦システムの評価は、大きく次の 3 つに分けて考えると理解しやすい。

  1. ビジネス指標
  2. モデル評価指標
  3. 推薦リストの品質指標

ビジネス指標は、推薦がサービスの成果にどれだけ貢献したかを見る。モデル評価指標は、アルゴリズムが正解に近い推薦を出しているかを見る。推薦リストの品質指標は、精度だけでは測れない多様性、新規性、公平性、カバレッジなどを見る。

Hulu のような動画配信サービスでは、主なフィードバックはレーティングではなく視聴の有無である。unique_viewed_series には、各 profile_id が 25% 以上視聴した series_idlast_viewing_date が記録されている。このため、評価でも「ユーザーが星 5 を付けたか」ではなく、「将来 25% 以上視聴された作品を推薦できたか」「推薦経由で視聴が増えたか」「長期的な継続利用につながったか」を中心に考える必要がある。

評価で最初に決めるべきこと

評価指標を選ぶ前に、何を良い推薦とみなすのかを決める必要がある。ここが曖昧だと、指標だけが増えて意思決定できなくなる。

Hulu の推薦であり得る目的は、例えば次のようなものである。

  • ホーム画面で次に見る作品を見つけやすくする
  • 視聴開始率を上げる
  • 25% 以上視聴率を上げる
  • 完走率を上げる
  • 総視聴時間を増やす
  • 翌日以降の再訪率を上げる
  • 解約率を下げる
  • TVOD のレンタルまたは購入を増やす
  • 新作や独占配信作品の発見を促す
  • ロングテール作品にも適切な露出を与える
  • キッズプロフィールで安全な推薦を行う

これらはすべて「良い推薦」に見えるが、互いに衝突することがある。

例えば、視聴開始率を最大化すると、有名作品や派手なサムネイルの作品が上がりやすい。一方、完走率を最大化すると、短尺作品や気軽に見られる作品が上がりやすい。総視聴時間を最大化すると、長尺作品やシリーズ作品が有利になる。TVOD 購入率を上げようとすると、SVOD の満足度と衝突する可能性がある。

したがって、評価では「どの指標を主指標にし、どの指標をガードレールにするか」が重要である。

例えば:

  • 主指標: 推薦枠からの 25% 以上視聴率
  • ガードレール: 解約率、低評価、再生直後離脱率、推薦リスト多様性、キッズ安全性
  • 診断指標: CTR、Coverage、NDCG@K、ジャンル別性能、コールドスタート作品性能

主指標は意思決定に使う中心指標である。ガードレール指標は、主指標が良くても悪化してはいけない指標である。診断指標は、なぜ良くなったか、なぜ悪くなったかを理解するための指標である。

ビジネス指標

ビジネス指標は、推薦が実際のサービス成果にどれだけ影響したかを見る指標である。機械学習モデルの精度が上がっても、ユーザー体験や収益に効いていなければ、プロダクトとしては成功とは言えない。

CTR

CTR は Click Through Rate の略で、表示された推薦のうち、クリックまたは詳細ページ閲覧された割合である。

CTR=クリック数インプレッション数\text{CTR} = \frac{\text{クリック数}} {\text{インプレッション数}}

Hulu では「クリック」を何と定義するかを明確にする必要がある。動画配信では、ユーザーがカードを選択して詳細ページに行く場合もあれば、直接再生する場合もある。ホーム画面でフォーカスしただけなのか、詳細を開いたのか、再生ボタンを押したのかで意味が違う。

例えば、次のように分けられる。

  • インプレッション: 作品カードが画面に表示された
  • フォーカス: TV デバイスで作品カードにカーソルが当たった
  • クリック: 作品カードまたは詳細ページを開いた
  • 再生開始: 実際に再生が始まった
  • 有効視聴: 25% 以上視聴した

CTR は推薦の入口の反応を見るには有用である。しかし、CTR だけを最適化するのは危険である。クリックされやすい作品が、必ずしも満足度の高い作品とは限らないからである。

具体例:

ある推薦モデル A と B があるとする。

モデル インプレッション クリック CTR 25% 以上視聴
A 100,000 8,000 8.0% 4,000
B 100,000 10,000 10.0% 3,500

CTR だけを見ると B が良い。しかし、25% 以上視聴数は A の方が多い。B はクリックを誘発するが、再生後に離脱されやすい推薦かもしれない。この場合、Hulu の推薦として本当に良いのは A の可能性がある。

CVR

CVR は Conversion Rate の略で、クリック後に目的行動が発生した割合である。

CVR=コンバージョン数クリック数\text{CVR} = \frac{\text{コンバージョン数}} {\text{クリック数}}

動画推薦では、コンバージョンを何にするかで意味が変わる。

例えば:

  • 詳細ページから再生開始した
  • 25% 以上視聴した
  • 50% 以上視聴した
  • 完走した
  • マイリストに追加した
  • TVOD をレンタルまたは購入した
  • 次エピソードを視聴した

Hulu の unique_viewed_series を使う場合、自然なコンバージョン定義の 1 つは「推薦後、一定期間内にその series_id を 25% 以上視聴したか」である。

ただし、CVR の分母をクリック数にすると、クリックされなかった推薦の価値を評価できない。例えば、ホーム画面で作品名を見て、後で検索して視聴した場合、推薦の影響をどう扱うかが難しい。したがって、推薦経由の評価では、インプレッションからの有効視聴率も見るべきである。

Effective Watch Rate=推薦表示後に 25% 以上視聴された数インプレッション数\text{Effective Watch Rate} = \frac{\text{推薦表示後に 25\% 以上視聴された数}} {\text{インプレッション数}}

総視聴時間

SVOD では、総視聴時間は重要な指標になりやすい。ユーザーがサービス内で価値を得ていることの代理指標だからである。

推薦枠経由の総視聴時間は、次のように定義できる。

Watch Time=eEte\text{Watch Time} = \sum_{e \in \mathcal{E}} t_e

ここで E\mathcal{E} は推薦に起因するとみなす視聴イベント集合、tet_e は視聴イベント ee の視聴時間である。

ただし、総視聴時間も万能ではない。長尺作品を推薦すれば増えやすく、短尺作品やニュース、子ども向け短編、バラエティなどが不利になる可能性がある。また、ユーザーが満足して短時間で目的を達成したケースを低く評価してしまうこともある。

そのため、総視聴時間は次のような指標とセットで見るのがよい。

  • 視聴開始率
  • 25% 以上視聴率
  • 完走率
  • 再訪率
  • 連続視聴率
  • ユーザーあたり視聴日数
  • 短尺作品と長尺作品を分けた評価

リテンションと解約率

サブスクリプション型サービスでは、短期クリックよりも長期継続が重要である。良い推薦は、ユーザーが「見るものがある」と感じる状態を作り、継続利用に寄与する。

リテンションは、ある時点で利用したユーザーが、後日また利用した割合である。

Retentiond=基準日に利用し、d 日後にも利用したユーザー数基準日に利用したユーザー数\text{Retention}_{d} = \frac{\text{基準日に利用し、}d\text{ 日後にも利用したユーザー数}} {\text{基準日に利用したユーザー数}}

解約率は、一定期間内に解約したユーザーの割合である。

Churn Rate=期間中に解約したユーザー数期間開始時点のユーザー数\text{Churn Rate} = \frac{\text{期間中に解約したユーザー数}} {\text{期間開始時点のユーザー数}}

推薦の改善がリテンションや解約率に効くかを見るには、長めの A/B テストが必要になる。CTR や再生開始率は数日で差が出ることがあるが、解約率や継続率は短期間では判断しにくい。

TVOD での収益指標

Hulu の item_information_table には service_type があり、SVOD と TVOD を区別できる。TVOD は都度課金制なので、推薦評価では購入またはレンタルに関する指標も重要になる。

TVOD の売上は、例えば次のように定義できる。

Revenue=o=1NPriceo\text{Revenue} = \sum_{o=1}^{N} \text{Price}_o

EC で使われる GMV に近い指標として、取引金額の合計を見ることができる。

GMV=o=1NPriceo×Quantityo\text{GMV} = \sum_{o=1}^{N} \text{Price}_o \times \text{Quantity}_o

動画レンタルでは多くの場合 Quantityo=1\text{Quantity}_o=1 なので、実質的には購入またはレンタル金額の合計になる。

ただし、TVOD 収益だけを上げようとすると、SVOD ユーザーの満足度を下げる可能性がある。月額で見放題を期待しているユーザーに TVOD 作品を出しすぎると、「有料作品ばかり出る」と感じるかもしれない。したがって、TVOD の評価では収益と同時に、SVOD 視聴率、離脱率、非表示率、苦情率などもガードレールにする必要がある。

モデル評価指標

モデル評価指標は、アルゴリズムがユーザーの嗜好をどれだけ正しく捉えているかを見るための指標である。オフラインで高速に比較できるため、モデル開発では最初に使うことが多い。

ただし、Hulu のような暗黙的フィードバック推薦では、星評価予測の RMSE や MAE よりも、上位 K 件のランキング指標が重要になる。

RMSE と MAE

RMSE は Root Mean Squared Error の略で、予測値と正解値の二乗誤差の平均の平方根である。

RMSE=1Nn=1N(yny^n)2\text{RMSE} = \sqrt{ \frac{1}{N} \sum_{n=1}^{N} (y_n - \hat{y}_n)^2 }

MAE は Mean Absolute Error の略で、絶対誤差の平均である。

MAE=1Nn=1Nyny^n\text{MAE} = \frac{1}{N} \sum_{n=1}^{N} |y_n - \hat{y}_n|

これらは星評価のような明示的フィードバックに向いている。例えば、ユーザーが作品に 1 から 5 の評価を付けるなら、予測値 y^n\hat{y}_n と実際の評価 yny_n の誤差を測ればよい。

しかし、Hulu の主なログが unique_viewed_series のような暗黙的フィードバックである場合、RMSE や MAE は中心的な評価指標にはなりにくい。理由は、未視聴が「嫌い」を意味しないからである。

例えば、あるプロフィールが「インターステラー」を視聴し、「TENET」を未視聴だとする。このとき、「TENET」に対する正解値を 0 と置いて RMSE を計算すると、モデルが「TENET も好きそう」と高く予測した場合に誤差が大きくなる。しかし、そのユーザーは単にまだ見ていないだけかもしれない。

このため、暗黙的フィードバックでは「未観測を真の 0 とみなす」評価には注意が必要である。

Precision@K

Precision@K は、推薦上位 KK 件のうち、正解アイテムがどれだけ含まれているかを見る指標である。

Precision@K=Ru(K)YuK\text{Precision@K} = \frac{ |\mathcal{R}_u^{(K)} \cap \mathcal{Y}_u| }{K}

ここで Ru(K)\mathcal{R}_u^{(K)} はユーザー uu への上位 KK 件推薦、Yu\mathcal{Y}_u は評価期間中に実際に視聴された正解集合である。

ワークド例:

プロフィール P001 に対して上位 5 件を推薦したとする。

  1. インターステラー
  2. TENET
  3. 名探偵コナン
  4. 韓国恋愛ドラマ A
  5. 世界の果てまでイッテQ

評価期間中に P001 が 25% 以上視聴した作品が次だったとする。

  • インターステラー
  • 名探偵コナン
  • SPY x FAMILY

推薦上位 5 件と正解集合の共通部分は、「インターステラー」と「名探偵コナン」の 2 件である。

Precision@5=25=0.4\text{Precision@5} = \frac{2}{5} = 0.4

Precision@K は、推薦枠の密度を測る指標である。上位枠に外れが少ないかを見たいときに有用である。

ただし、正解アイテムが多いユーザーと少ないユーザーで解釈が変わる。評価期間に 1 作品しか見なかったユーザーは、Precision@10 の最大値が 0.10.1 になる。したがって、Precision@K だけで評価すると、アクティブ度の違いに影響されやすい。

Recall@K

Recall@K は、正解アイテムのうち、推薦上位 KK 件でどれだけ捕捉できたかを見る指標である。

Recall@K=Ru(K)YuYu\text{Recall@K} = \frac{ |\mathcal{R}_u^{(K)} \cap \mathcal{Y}_u| }{|\mathcal{Y}_u|}

先ほどの例では、正解集合は 3 件で、上位 5 件に含まれていた正解は 2 件である。

Recall@5=230.667\text{Recall@5} = \frac{2}{3} \approx 0.667

Recall@K は、ユーザーが実際に見た作品をどれだけ漏らさず推薦できたかを測る。候補検索の評価では特に重要である。ランキング評価でも、上位 KK 件に正解を入れられているかを見るために使う。

ただし、Recall@K は順位の細かい違いを見ない。1 位に正解がある場合と、5 位に正解がある場合を同じように扱うことがある。上位順位を重視したい場合は NDCG@K や MAP@K を併用する。

HitRate@K

HitRate@K は、上位 KK 件に正解が 1 件でも入っているかを見る指標である。

HitRate@K=1UuU1[Ru(K)Yu]\text{HitRate@K} = \frac{1}{|\mathcal{U}|} \sum_{u \in \mathcal{U}} \mathbf{1} \left[ \mathcal{R}_u^{(K)} \cap \mathcal{Y}_u \ne \emptyset \right]

ユーザーが「何か 1 つでも見たいものを見つけられたか」を見るには分かりやすい指標である。

ただし、上位 KK 件に 1 件だけ正解がある場合と、5 件正解がある場合を区別しない。そのため、HitRate@K は単独では粗い指標である。

MAP@K

MAP@K は Mean Average Precision@K の略で、ユーザーごとの AP@K を平均した指標である。関連アイテムが上位に来るほど高くなる。

ユーザー uu の AP@K は次のように定義できる。

AP@K(u)=1min(Yu,K)k=1KPrecision@k(u)relu(k)\text{AP@K}(u) = \frac{1}{\min(|\mathcal{Y}_u|, K)} \sum_{k=1}^{K} \text{Precision@k}(u) \cdot \operatorname{rel}_u(k)

ここで relu(k)\operatorname{rel}_u(k) は、順位 kk の推薦アイテムが正解なら 1、そうでなければ 0 である。

MAP@K は全ユーザーの AP@K 平均である。

MAP@K=1UuUAP@K(u)\text{MAP@K} = \frac{1}{|\mathcal{U}|} \sum_{u \in \mathcal{U}} \text{AP@K}(u)

ワークド例:

上位 5 件のうち、正解が 1 位と 3 位にあるとする。

順位 kk 正解か Precision@k
1 1 1/1 = 1.000
2 0 1/2 = 0.500
3 1 2/3 = 0.667
4 0 2/4 = 0.500
5 0 2/5 = 0.400

正解位置である 1 位と 3 位だけを使う。

AP@5=12(1.000+0.667)=0.8335\text{AP@5} = \frac{1}{2} \left( 1.000 + 0.667 \right) = 0.8335

MAP@K は、正解を上位に置けているかを評価できる。ただし、関連度が 0 か 1 の二値であることが多く、「25% 視聴」と「完走」と「マイリスト追加」のような強弱を扱うには NDCG@K の方が向いている。

NDCG@K

NDCG@K は Normalized Discounted Cumulative Gain@K の略で、上位に関連度の高いアイテムを置けているかを見る指標である。

DCG@K は次のように定義される。

DCG@K=k=1K2relk1log2(k+1)\text{DCG@K} = \sum_{k=1}^{K} \frac{2^{rel_k}-1}{\log_2(k+1)}

理想的な並びの DCG を IDCG@K とすると、NDCG@K は次である。

NDCG@K=DCG@KIDCG@K\text{NDCG@K} = \frac{\text{DCG@K}}{\text{IDCG@K}}

NDCG の良い点は、関連度に段階を持たせられることである。Hulu の暗黙的フィードバックでも、単なる視聴有無ではなく、行動の強さに応じて関連度を設計できる。

例えば:

行動 関連度 relrel
表示されたが無反応 0
詳細ページ閲覧 1
再生開始 2
25% 以上視聴 3
完走または次エピソード視聴 4

このように置くと、単にクリックされた作品より、深く視聴された作品を上位に出すモデルが高く評価される。

ただし、関連度設計には注意が必要である。完走率は短尺作品に有利であり、視聴時間は長尺作品に有利である。どの行動をどれだけ重く見るかは、プロダクト目的に合わせて決める必要がある。

Hulu の unique_viewed_series でオフライン評価する方法

unique_viewed_series は、プロフィールごとに 25% 以上視聴したシリーズを持つ。これを使うと、過去の履歴から未来の視聴を予測する形でオフライン評価ができる。

重要なのは、ランダム分割ではなく時系列分割を使うことである。推薦は未来を予測するシステムなので、未来の視聴情報を学習に混ぜてはいけない。

例えば、次のように分割する。

  • 学習期間: 2025-10-01 から 2025-12-31
  • 検証期間: 2026-01-01 から 2026-01-31
  • テスト期間: 2026-02-01 から 2026-02-28

学習期間の unique_viewed_series からユーザー特徴量を作り、検証期間またはテスト期間に視聴された series_id を正解集合 Yu\mathcal{Y}_u とする。

手順は次のようになる。

  1. 学習期間以前の視聴履歴だけでプロフィール表現を作る
  2. 評価時点で公開中の作品だけを推薦候補にする
  3. is_blacklist=true の作品や配信期間外の作品を除外する
  4. 各プロフィールに上位 KK 件を推薦する
  5. 評価期間中に 25% 以上視聴された作品集合と照合する
  6. Recall@K、NDCG@K、MAP@K、Coverage などを計算する

このとき、publish_start_atpublish_end_at を必ず考慮する必要がある。評価時点で配信されていなかった作品を推薦候補に含めると、現実には出せない推薦を評価してしまう。また、評価期間中に配信終了した作品も、表示可能だった時点を考える必要がある。

Leave-One-Out 評価

推薦の論文や実装例では、Leave-One-Out 評価が使われることがある。これは、ユーザーごとに最後の 1 件をテスト正例として残し、それ以前の履歴で推薦する方法である。

例えば、あるプロフィールの視聴履歴が時系列で次のようだったとする。

  1. インターステラー
  2. TENET
  3. ダークナイト
  4. オッペンハイマー

Leave-One-Out では、最初の 3 件を入力履歴にし、最後の「オッペンハイマー」を当てられるかを評価する。

この方法はシンプルで、ユーザーごとに正解数が 1 つになるため、HitRate@K や NDCG@K を計算しやすい。

ただし、Hulu のようなサービスでは注意もある。ユーザーは評価期間中に複数作品を見ることがあるため、最後の 1 件だけを正解にすると情報を捨てる。また、最後に見た作品がたまたま家族の別メンバーの視聴だった場合、そのプロフィールの本来の嗜好とずれる可能性もある。

実務では、Leave-One-Out だけでなく、一定期間内の全視聴を正解集合にする評価も併用した方がよい。

Negative Sampling 評価の注意点

推薦評価では、全作品をランキングする代わりに、正解 1 件とランダム負例 99 件を並べて、その中で正解が上位に来るかを見る方法がある。これは計算が軽く、研究用途ではよく使われる。

しかし、実務評価では注意が必要である。ランダム負例が簡単すぎると、モデル性能を過大評価するからである。

具体例:

SF 映画好きのプロフィールに対して、正解が「オッペンハイマー」だとする。負例 99 件を全カタログからランダムに選ぶと、幼児向けアニメ、料理番組、韓国恋愛ドラマ、ライブニュースなどが多く混ざるかもしれない。この場合、モデルは「SF 映画らしい作品」を選ぶだけで高いスコアを取れる。

しかし、本当に難しいのは次のような比較である。

  • オッペンハイマー
  • インターステラー
  • TENET
  • ダークナイト
  • メッセージ
  • ブレードランナー 2049

このような近い候補の中で何を上位にすべきかが、ランキングの実力である。

したがって、オフライン評価では次のような候補集合を使い分けるとよい。

  • 全候補評価: 評価時点で推薦可能な全作品を対象にする
  • ランダム負例評価: 計算を軽くするための簡易評価
  • 人気負例評価: 人気作品を負例に含める
  • 同ジャンル負例評価: 正解に近いジャンルから負例を選ぶ
  • 候補検索結果評価: 実際の候補検索で出た候補をランキングする

最も現実に近いのは、実際の推薦パイプラインと同じ候補集合で評価することである。

表示バイアスと位置バイアス

推薦ログには、ユーザーの純粋な嗜好だけでなく、過去の推薦システムが何をどこに表示したかの影響が含まれる。

代表的なバイアスは次の 2 つである。

  • 表示バイアス: 表示されなかった作品は視聴される機会がない
  • 位置バイアス: 上位に表示された作品ほどクリックまたは視聴されやすい

例えば、作品 A が 1 位に表示され、作品 B が 20 位に表示されたとする。A の視聴率が高かったとしても、A が本当に好まれたのか、単に目立つ位置にあったのかは分からない。

この問題を無視すると、評価は過去のランキングを再現するモデルを高く評価しやすい。人気作品や既に上位露出されている作品がさらに有利になり、新作やロングテール作品は不利になる。

表示確率を pu,ip_{u,i} とし、観測されたラベルに逆確率重みを付ける考え方がある。

wu,i=1pu,iw_{u,i} = \frac{1}{p_{u,i}}

この重みを使うと、表示されにくかったのに反応された作品を大きく評価できる。

ただし、実務で pu,ip_{u,i} を正確に知るのは難しい。したがって、評価ログには少なくとも次の情報を残すべきである。

  • どの profile_id
  • いつ
  • どの画面で
  • どの棚に
  • どの series_id
  • 何位に
  • どのモデルまたはルールで
  • 表示したか

unique_viewed_series だけでは、視聴された作品は分かるが、表示されたのに視聴されなかった作品は分からない。ランキング評価を厳密に行うには、インプレッションログが重要である。

カバレッジ

カバレッジは、推薦システムがどれだけ広いアイテム集合を推薦しているかを見る指標である。

アイテムカバレッジは次のように定義できる。

Coverage=uURu(K)I\text{Coverage} = \frac{ |\bigcup_{u \in \mathcal{U}} \mathcal{R}_u^{(K)}| }{|\mathcal{I}|}

ここで I\mathcal{I} は推薦可能な全作品集合である。

例えば、推薦可能作品が 10,000 件あり、全ユーザーへの上位 10 推薦を集めたときに 1,000 件しか一度も推薦されていなければ、Coverage は次である。

Coverage=100010000=0.1\text{Coverage} = \frac{1000}{10000} = 0.1

Coverage が低い場合、推薦が人気作品に集中している可能性がある。これは短期精度には良くても、長期的には発見性を損なう可能性がある。

Hulu では、単純な全体 Coverage だけでなく、次のように分解して見るとよい。

  • genre 別 Coverage
  • sub_genre 別 Coverage
  • service_type 別 Coverage
  • 新作 Coverage
  • ロングテール作品 Coverage
  • contents_provider_name 別 Coverage
  • media_type 別 Coverage

ただし、Coverage は高ければ高いほど良いわけではない。ユーザーに合わない作品まで無理に露出すれば、推薦品質は下がる。Coverage は関連性とセットで見る必要がある。

多様性

多様性は、推薦リスト内の作品がどれだけ互いに異なるかを見る指標である。教科書の式は、アイテム間類似度を使うリスト内多様性である。

Diversity=11K(K1)ijsim(i,j)\text{Diversity} = 1 - \frac{1}{K(K-1)} \sum_{i \ne j} \operatorname{sim}(i,j)

ここで sim(i,j)\operatorname{sim}(i,j) は作品 ii と作品 jj の類似度である。avg_fingerprintavg_mood_tag があるなら、作品間 cosine 類似度を使える。

sim(i,j)=viTvjvivj\operatorname{sim}(i,j) = \frac{\mathbf{v}_i^{\mathsf{T}}\mathbf{v}_j} {\|\mathbf{v}_i\|\|\mathbf{v}_j\|}

具体例:

上位 5 件がすべて「名探偵コナン」の劇場版であれば、ユーザーがコナン好きでもリスト内多様性は低い。一方、上位 5 件に「名探偵コナン」「SPY x FAMILY」「インターステラー」「世界の果てまでイッテQ」「海外ドラマ A」が並ぶと、多様性は高くなる。

ただし、多様性も高ければ高いほど良いわけではない。ユーザーが明確に「アニメを見たい」状態なのに、無理に映画、ニュース、ライブ、ドキュメンタリーを混ぜると関連性が下がる。

評価では、次の 2 種類を分けるとよい。

  • リスト内多様性: 1 つの推薦リスト内で似た作品が並びすぎていないか
  • ユーザー内多様性: あるユーザーに長期的に同じような作品ばかり出していないか

ホーム画面の 1 つの棚では同ジャンルに寄せ、ページ全体では多様性を持たせる、という設計もあり得る。その場合、棚単位とページ単位で評価を分ける必要がある。

新規性

新規性は、ユーザーにとってどれだけ馴染みが薄い作品を推薦できているかを見る指標である。人気作品ばかり推薦すると、ユーザーは既に知っている作品ばかりを見ることになる。新規性は、発見体験を測るために重要である。

よく使われる新規性の定義に、人気度の逆数または自己情報量を使う方法がある。

作品 ii の視聴確率を p(i)p(i) とすると、新規性を次のように定義できる。

Novelty(i)=log2p(i)\text{Novelty}(i) = -\log_2 p(i)

人気作品ほど p(i)p(i) が大きく、新規性は小さくなる。ロングテール作品ほど p(i)p(i) が小さく、新規性は大きくなる。

推薦リストの新規性は平均で表せる。

Novelty@K(u)=1KiRu(K)log2p(i)\text{Novelty@K}(u) = \frac{1}{K} \sum_{i \in \mathcal{R}_u^{(K)}} -\log_2 p(i)

ただし、人気がない作品を出せばよいわけではない。新規性が高くても関連性が低ければ、ユーザーにとってはノイズになる。新規性は NDCG や視聴率と一緒に見る必要がある。

セレンディピティ

セレンディピティは、ユーザーにとって意外だが、実際には満足につながる推薦を指す。単なる新規性とは違う。知らない作品を出すだけではなく、「自分では探さなかったが、見てみたら良かった」と感じる推薦である。

セレンディピティを数式で厳密に定義するのは難しいが、直感的には次の 2 条件を満たす推薦である。

  • ユーザーの過去嗜好から見て当たり前すぎない
  • それでも実際に視聴または満足につながる

例えば、SF 映画好きのプロフィールに対して、またノーラン作品を推薦するのは関連性は高いが意外性は低い。一方、科学ドキュメンタリーや宇宙開発を扱う実話ドラマを推薦し、それが視聴されればセレンディピティが高い可能性がある。

評価では、次のような代理指標が使える。

  • ユーザー履歴との距離が一定以上ある
  • 人気度が高すぎない
  • それでも 25% 以上視聴または完走された
  • 視聴後に関連作品をさらに見た

公平性

公平性は、推薦による露出が特定の提供者、ジャンル、作品群、ユーザー群に過度に偏っていないかを見る観点である。

Hulu のデータでは、contents_provider_namegenresub_genrecountries_of_originservice_type などを使って、アイテム側の露出公平性を評価できる。

例えば、提供者 gg の露出比率を次のように定義する。

Exposure(g)=uUk=1K1[g(iu,k)=g]d(k)uUk=1Kd(k)\text{Exposure}(g) = \frac{ \sum_{u \in \mathcal{U}} \sum_{k=1}^{K} \mathbf{1}[g(i_{u,k}) = g] \cdot d(k) }{ \sum_{u \in \mathcal{U}} \sum_{k=1}^{K} d(k) }

ここで iu,ki_{u,k} はユーザー uu の順位 kk の推薦作品、d(k)d(k) は順位に応じた露出重みである。上位ほど見られやすいため、例えば次のような割引を使える。

d(k)=1log2(k+1)d(k) = \frac{1}{\log_2(k+1)}

公平性で注意すべきなのは、「全グループを完全に同じ割合で出す」ことが常に正しいわけではない点である。作品数、品質、契約、ユーザー嗜好、配信状況が異なるため、単純な均等配分は関連性を壊す可能性がある。

実務では、次のようにガードレールとして見ることが多い。

  • 特定提供者だけに露出が集中していないか
  • 新作が十分に露出されているか
  • ロングテール作品の露出が極端に低くないか
  • TVOD が過剰露出されていないか
  • キッズ向けで不適切な作品が露出していないか

キャリブレーション

キャリブレーションは、推薦リストの分布がユーザーの嗜好分布とどれだけ合っているかを見る考え方である。

例えば、あるプロフィールの過去視聴が次の分布だったとする。

ジャンル 過去視聴比率
アニメ 50%
洋画 30%
バラエティ 20%

推薦上位 10 件がすべてアニメなら、関連性は高いかもしれないが、過去嗜好分布に対しては偏っている。一方、推薦がアニメ 5 件、洋画 3 件、バラエティ 2 件なら、嗜好分布に近い。

分布のズレは KL ダイバージェンスなどで測れる。

DKL(PQ)=cP(c)logP(c)Q(c)D_{\text{KL}}(P \| Q) = \sum_{c} P(c) \log \frac{P(c)}{Q(c)}

ここで P(c)P(c) はユーザーの過去嗜好分布、Q(c)Q(c) は推薦リストのカテゴリ分布である。

ただし、過去視聴分布に合わせすぎると、ユーザーの興味が固定化される。キャリブレーションは多様性や新規性とバランスを取る必要がある。

オフライン評価

オフライン評価は、過去ログを使ってモデルを比較する段階である。高速に多くのモデルを試せるため、開発初期に重要である。

Hulu でのオフライン評価は、次のような流れになる。

  1. 評価対象日を決める
  2. その日以前の unique_viewed_series だけで特徴量を作る
  3. 評価対象日時点で推薦可能な作品集合を作る
  4. 候補検索とランキングを実行する
  5. その後の評価期間に 25% 以上視聴された作品を正解にする
  6. Recall@K、NDCG@K、MAP@K、Coverage、Diversity を計算する

オフライン評価の長所は、コストが低く、A/B テスト前に多くの候補をふるい落とせることである。

一方、短所もある。

  • 過去の露出バイアスを含む
  • 表示されなかった作品の反応が分からない
  • UI 変更の影響を測れない
  • 推薦がユーザー行動を変える効果を測れない
  • 長期満足や解約率を直接測りにくい

したがって、オフライン評価で良いモデルをそのまま本番採用するのではなく、A/B テストで確認する必要がある。

A/B テスト

A/B テストは、実際のユーザーをランダムに複数グループへ分け、異なる推薦ロジックを出し分けて比較する方法である。

例えば:

  • Control: 現行推薦モデル
  • Treatment: 新しいランキングモデル

ランダム割当によって、ユーザー属性や曜日効果などの影響を平均的にそろえ、新モデルの因果効果を推定する。

評価する指標は、事前に決めておくべきである。後から都合の良い指標だけを見ると、誤った判断につながる。

Hulu の A/B テストであり得る指標は次である。

  • 推薦枠 CTR
  • 推薦枠からの再生開始率
  • 推薦枠からの 25% 以上視聴率
  • 推薦枠からの総視聴時間
  • セッションあたり視聴数
  • 翌日再訪率
  • 7 日後リテンション
  • TVOD 購入率
  • 解約率
  • 非表示率や低評価率
  • キッズ安全性違反数

A/B テストでは、主指標とガードレールを分ける。

具体例:

  • 主指標: 推薦枠からの 25% 以上視聴率
  • ガードレール: 総視聴時間、解約率、非表示率、TVOD 過剰露出、ページ表示速度
  • 診断指標: CTR、NDCG proxy、ジャンル別視聴率、Coverage

新モデルが主指標を改善しても、非表示率が大きく上がるなら採用すべきではない。短期的にクリックされても、ユーザーが不快に感じている可能性がある。

統計的有意性と実用的有意性

A/B テストでは、差が偶然かどうかを判断する必要がある。これが統計的有意性である。

例えば、Control の 25% 以上視聴率が 4.00%、Treatment が 4.05% だったとする。差は 0.05 ポイントである。この差が偶然の揺れなのか、本当にモデル改善によるものなのかを確認する必要がある。

一方、統計的に有意でも、実用的に意味が小さい場合がある。巨大なトラフィックでは、非常に小さな差でも有意になるからである。

したがって、A/B テストでは次の両方を見る。

  • 統計的有意性: 偶然ではなさそうか
  • 実用的有意性: 採用する価値があるほど大きい差か

また、複数指標を同時に見る場合、多重検定の問題がある。20 個の指標を見れば、偶然良く見える指標が出やすい。主指標を事前に決めることが重要である。

継続的モニタリング

推薦システムは、一度リリースして終わりではない。作品カタログ、ユーザー嗜好、季節性、キャンペーン、配信権利、UI、競合環境が変化するため、継続的に監視する必要がある。

モニタリングすべき項目は次のようなものである。

  • 推薦枠 CTR
  • 再生開始率
  • 25% 以上視聴率
  • 総視聴時間
  • Coverage
  • Diversity
  • 新作露出
  • TVOD 露出比率
  • is_blacklist=true の混入
  • 配信期間外作品の混入
  • キッズ不適切作品の混入
  • モデルスコア分布
  • 特徴量欠損率
  • avg_fingerprintavg_mood_tag の欠損率
  • 推薦 API レイテンシ
  • エラー率

特に動画配信では、配信開始と配信終了があるため、カタログ状態の変化に強く影響される。publish_start_atpublish_end_atis_blacklist の扱いを監視しないと、表示してはいけない作品が推薦に混ざる可能性がある。

セグメント別評価

全体平均だけを見ると、特定のユーザー群での悪化を見落とすことがある。推薦評価ではセグメント別に分解することが重要である。

Hulu で見るべきセグメント例は次である。

  • 新規プロフィール
  • 長期利用プロフィール
  • 視聴履歴が少ないプロフィール
  • 視聴履歴が多いプロフィール
  • キッズプロフィール
  • SVOD 中心ユーザー
  • TVOD 反応ユーザー
  • アニメ中心ユーザー
  • 映画中心ユーザー
  • 国内ドラマ中心ユーザー
  • 海外ドラマ中心ユーザー
  • ライブ視聴ユーザー
  • 週末中心ユーザー
  • モバイル中心ユーザー
  • TV デバイス中心ユーザー

例えば、全体の NDCG@10 が改善していても、新規プロフィールでは悪化しているかもしれない。これは、新モデルが履歴の多いユーザーに過度に最適化され、コールドスタートに弱くなったことを示す。

また、TV デバイスでは上位数件しか見られないが、モバイルではスクロールされやすい、という UI 差もある。デバイス別に評価しないと、実際の体験を誤解する可能性がある。

LLM を使った推薦評価

LLM は推薦評価にも使える。ただし、ユーザー行動ログの代替ではなく、補助的な評価者として使うのが現実的である。

LLM 評価が向いているのは、次のような観点である。

  • 推薦理由文が自然か
  • 視聴履歴と推薦作品の意味的なつながりがあるか
  • 同じような作品ばかり並んでいないか
  • キッズ向けに不適切な説明がないか
  • 作品説明やタグの品質に問題がないか
  • 新作やロングテール作品のメタデータが十分か

例えば、次のような評価プロンプトを作れる。

ユーザーの視聴履歴:
- インターステラー
- TENET
- ダークナイト

推薦リスト:
1. オッペンハイマー
2. メッセージ
3. 名探偵コナン
4. 韓国恋愛ドラマ A

視聴履歴との意味的関連性、多様性、意外性の観点で 1 から 5 で評価せよ。

ただし、LLM の評価は実ユーザー行動とは異なる。LLM が「関連している」と判断しても、ユーザーが実際に再生するとは限らない。逆に、LLM が低く評価した作品でも、実ユーザーには刺さることがある。

したがって、LLM 評価は次の用途に限定して考えるのがよい。

  • オフラインでの品質チェック
  • 推薦理由文のレビュー
  • アノテーション補助
  • コールドスタート作品の初期評価
  • 明らかに不自然な推薦リストの検出

本番採用の判断は、行動ログと A/B テストを中心に行うべきである。

評価指標の組み合わせ方

推薦評価では、単一の指標で全てを決めるのは危険である。複数の指標を役割ごとに分ける必要がある。

おすすめの構成は次である。

役割 指標例 意味
主指標 25% 以上視聴率、総視聴時間、リテンション 意思決定の中心
精度指標 Recall@K、NDCG@K、MAP@K モデルのランキング性能
発見性指標 Coverage、Novelty、Serendipity 人気偏重を避ける
リスト品質 Diversity、Calibration 似た作品の出しすぎを避ける
公平性 提供者別露出、ジャンル別露出 露出の偏りを見る
安全性 ブラックリスト混入率、配信期間外混入率、キッズ違反率 出してはいけない推薦を防ぐ
システム指標 レイテンシ、エラー率、欠損率 運用品質を見る

例えば、新しいランキングモデルを評価するとき、次のような判断があり得る。

指標 結果 判断
NDCG@10 +3.0% 良い
25% 以上視聴率 +1.2% 良い
総視聴時間 +0.3% ほぼ横ばい
Coverage -20.0% 悪い
非表示率 +8.0% 悪い

この場合、ランキング精度は上がっているが、人気作品に寄りすぎ、ユーザーの不満も増えている可能性がある。すぐ全面リリースするのではなく、多様性制御や露出制約を調整すべきである。

よくある落とし穴

CTR だけを追う

CTR は入口の反応を見るには便利だが、クリック後の満足を保証しない。動画推薦では、再生開始、25% 以上視聴、完走、再訪、解約率とセットで見る必要がある。

ランダム分割で評価する

視聴履歴をランダムに学習とテストに分けると、未来の情報が学習に混ざりやすい。推薦は未来予測なので、時系列分割が基本である。

未視聴をすべて負例にする

未視聴は嫌いを意味しない。表示されていない、気づかなかった、まだ見ていない、TVOD なので避けた、など多くの理由がある。暗黙的フィードバックでは未観測の扱いに注意が必要である。

オフライン指標だけで判断する

オフライン評価は過去ログ上の再現性を見るものであり、実際にユーザー行動を変える効果は測れない。最終判断には A/B テストが必要である。

全体平均だけを見る

全体平均が良くても、新規ユーザー、キッズ、TVOD、特定ジャンルで悪化している可能性がある。セグメント別評価が必要である。

推薦可能でない作品を評価に含める

配信期間外、ブラックリスト、権利制約、レーティング不適合の作品を候補に入れると、現実には出せない推薦を評価してしまう。publish_start_atpublish_end_atis_blacklist などを考慮する必要がある。

まとめ

推薦システムの評価は、モデル精度だけを見る作業ではない。Hulu のような動画配信では、暗黙的フィードバック、配信制約、SVOD/TVOD、キッズ安全性、長期継続、発見性を含めて評価する必要がある。

ビジネス指標では、CTR、CVR、総視聴時間、リテンション、解約率、TVOD 収益などを見る。ただし、短期指標だけを追うと、長期満足を損なう可能性がある。

モデル評価指標では、RMSE や MAE よりも、Precision@K、Recall@K、HitRate@K、MAP@K、NDCG@K が重要である。特に unique_viewed_series を使う場合、時系列分割で未来の 25% 以上視聴を当てる評価が自然である。

推薦リストの品質指標としては、Coverage、Diversity、Novelty、Serendipity、Fairness、Calibration がある。これらは精度指標だけでは見えない、推薦体験の広がりや偏りを測る。

実務では、オフライン評価、A/B テスト、継続的モニタリングを組み合わせる。オフライン評価で候補モデルを絞り、A/B テストで実ユーザーへの因果効果を確認し、リリース後は指標のドリフトや安全性違反を監視する。

良い評価設計とは、単に指標をたくさん並べることではない。主指標、ガードレール、診断指標を分け、推薦システムがユーザーにとっても事業にとっても長期的に良い方向へ進んでいるかを判断できる状態を作ることである。