ランキング評価

Eval

ランキング評価

まとめ
  • ランキング評価指標の種類と、推薦・検索・広告での使い分けを整理します。
  • NDCG、MAP、Hit Rate、Recall@k などの代表指標を比較します。
  • 指標セットの組み方とビジネス KPI に反映させる際の注意点をまとめます。

ランキング評価の全体像 #

ランキングモデルは「上位に正解や有益なアイテムを並べられているか」を評価します。推薦システム、検索、広告配信などでは、上位数件の質が業績を左右するため、適切なランキング指標を選ぶことが重要です。


指標カテゴリ #

1. リストワイズ指標 #

  • NDCG / DCGNDCG): 上位アイテムの重要度にログ減衰を加えて評価。

  • MAP(平均平均適合率)MAP): 各クエリの平均適合率を平均。複数の正解があるランキングで有効。

  • Recall@kRecall@k): 上位 k 件の中に正解が含まれている割合。

  • Hit Rate / Hit@kHit Rate): 少なくとも 1 件正解が含まれているか。

  • Top-k Accuracy: 候補を k 件提示する分類タスクで使用。

3. ペアワイズ指標 #

  • AUC(ランキング版): 正例・負例のペアの順序が正しい割合。
  • Kendall’s τ / Spearman の順位相関: 順位全体の一致度を測る。

指標を比較する例 #

import matplotlib.pyplot as plt
import numpy as np
from sklearn.metrics import average_precision_score, ndcg_score

y_true = np.array(
    [
        [1, 0, 0, 0, 1, 0, 0, 0, 0, 0],
        [0, 1, 0, 0, 0, 1, 0, 0, 0, 0],
        [0, 0, 1, 0, 0, 0, 1, 0, 0, 0],
    ]
)
y_score = np.array(
    [
        [0.9, 0.3, 0.2, 0.1, 0.6, 0.05, 0.03, 0.02, 0.01, 0.005],
        [0.4, 0.8, 0.2, 0.1, 0.05, 0.6, 0.03, 0.02, 0.01, 0.005],
        [0.2, 0.1, 0.85, 0.05, 0.03, 0.02, 0.7, 0.01, 0.005, 0.003],
    ]
)

def recall_at_k(y_true_row: np.ndarray, y_score_row: np.ndarray, k: int) -> float:
    top_k_idx = np.argsort(y_score_row)[::-1][:k]
    positives = y_true_row.sum()
    if positives == 0:
        return 0.0
    return y_true_row[top_k_idx].sum() / positives

def hit_rate_at_k(y_true_row: np.ndarray, y_score_row: np.ndarray, k: int) -> float:
    top_k_idx = np.argsort(y_score_row)[::-1][:k]
    return float(y_true_row[top_k_idx].sum() > 0)

ks = [3, 5]
ndcg5 = ndcg_score(y_true, y_score, k=5)
map_score = np.mean(
    [average_precision_score(t, s) for t, s in zip(y_true, y_score)]
)
recalls = [np.mean([recall_at_k(t, s, k) for t, s in zip(y_true, y_score)]) for k in ks]
hits = [np.mean([hit_rate_at_k(t, s, k) for t, s in zip(y_true, y_score)]) for k in ks]

metrics = {
    "NDCG@5": ndcg5,
    "MAP": map_score,
    "Recall@3": recalls[0],
    "Recall@5": recalls[1],
    "Hit@3": hits[0],
    "Hit@5": hits[1],
}

fig, ax = plt.subplots(figsize=(6.5, 3.8))
ax.bar(metrics.keys(), metrics.values(), color="#f97316", alpha=0.85)
ax.set_ylim(0, 1.05)
ax.set_ylabel("Score")
ax.set_title("Ranking metrics on sample recommendations")
ax.grid(axis="y", alpha=0.3)
plt.xticks(rotation=25)
plt.tight_layout()
ランキング指標の比較

同じ推薦結果でも指標によって見え方が異なる。Recall@k や Hit@k は「正解が含まれたか」、MAP や NDCG は「並び順の質」を重視する。


指標選定のポイント #

  1. 評価対象の粒度
    • 検索クエリ、ユーザ、セッションなど評価単位を揃える。
  2. 正解ラベルの定義
    • クリック、購入、保存など何を正解とみなすかで指標の意味が変わる。
  3. トップ k の設定
    • 実際に表示する件数やリコメンド枠に合わせて k を決定。
  4. 重み付けの有無
    • アイテムの価値や順位ペナルティをどう設定するか。
  5. オンライン指標との接続
    • オフライン指標と A/B テストの KPI をつなげ、改善効果を検証。

クイックリファレンス #

カテゴリ指標関連ページメモ
リストワイズNDCG / DCGNDCG上位ほど価値が高い場合に適切
リストワイズMAPMAP正解が複数あるランキング向け
Top-kRecall@k / Hit@kRecall@k / Hit Rate少なくとも 1 件正解が含まれるか
Top-kTop-k AccuracyTop-k Accuracy分類モデルを Top-k 提示に応用するとき
ペアワイズAUCROC-AUC正・負例ペアの順序の正しさを測る

チェックリスト #

  • 評価対象と正解定義を明文化したか
  • 実サービスで提示する件数に合わせて k を設定したか
  • 並び順の品質とカバレッジの両方を評価しているか
  • オフライン指標とオンライン KPI の相関を把握しているか
  • 評価データが最新の人気トレンドを反映しているか