まとめ
- ランキング評価指標の種類と、推薦・検索・広告での使い分けを整理します。
- NDCG、MAP、Hit Rate、Recall@k などの代表指標を比較します。
- 指標セットの組み方とビジネス KPI に反映させる際の注意点をまとめます。
ランキング評価の全体像 #
ランキングモデルは「上位に正解や有益なアイテムを並べられているか」を評価します。推薦システム、検索、広告配信などでは、上位数件の質が業績を左右するため、適切なランキング指標を選ぶことが重要です。
指標カテゴリ #
1. リストワイズ指標 #
NDCG / DCG(NDCG): 上位アイテムの重要度にログ減衰を加えて評価。
MAP(平均平均適合率)(MAP): 各クエリの平均適合率を平均。複数の正解があるランキングで有効。
Recall@k(Recall@k): 上位 k 件の中に正解が含まれている割合。
Hit Rate / Hit@k(Hit 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 は「並び順の質」を重視する。
指標選定のポイント #
- 評価対象の粒度
- 検索クエリ、ユーザ、セッションなど評価単位を揃える。
- 正解ラベルの定義
- クリック、購入、保存など何を正解とみなすかで指標の意味が変わる。
- トップ k の設定
- 実際に表示する件数やリコメンド枠に合わせて k を決定。
- 重み付けの有無
- アイテムの価値や順位ペナルティをどう設定するか。
- オンライン指標との接続
- オフライン指標と A/B テストの KPI をつなげ、改善効果を検証。
クイックリファレンス #
| カテゴリ | 指標 | 関連ページ | メモ |
|---|---|---|---|
| リストワイズ | NDCG / DCG | NDCG | 上位ほど価値が高い場合に適切 |
| リストワイズ | MAP | MAP | 正解が複数あるランキング向け |
| Top-k | Recall@k / Hit@k | Recall@k / Hit Rate | 少なくとも 1 件正解が含まれるか |
| Top-k | Top-k Accuracy | Top-k Accuracy | 分類モデルを Top-k 提示に応用するとき |
| ペアワイズ | AUC | ROC-AUC | 正・負例ペアの順序の正しさを測る |
チェックリスト #
- 評価対象と正解定義を明文化したか
- 実サービスで提示する件数に合わせて k を設定したか
- 並び順の品質とカバレッジの両方を評価しているか
- オフライン指標とオンライン KPI の相関を把握しているか
- 評価データが最新の人気トレンドを反映しているか