まとめ
- Hit Rate は上位候補に少なくとも 1 つ正解が含まれる割合を測る指標です。
- ユーザーごとの候補リストから Hit Rate@k を算出し、網羅性を評価します。
- Recall や Precision と併用する際の注意点や利用シーンを整理します。
1. 定義 #
クエリごとの正解集合を \(G_q\)、上位 k の候補集合を \(S_{q,k}\) とすると、 $$ \mathrm{HR@k} = \frac{1}{Q} \sum_{q=1}^Q \mathbf{1}{ G_q \cap S_{q,k} \ne \emptyset } $$ 少なくとも 1 件ヒットしていれば 1、なければ 0 として平均を取ります。
2. Python で計算 #
import numpy as np
def hit_rate_at_k(y_true: np.ndarray, y_score: np.ndarray, k: int) -> float:
"""上位 k 件内に少なくとも 1 件の正例があるかどうかを返す。
Args:
y_true: 正例を 1 とするラベル配列。
y_score: モデルが出力したスコア配列。
k: 上位何件を見るか。
Returns:
ヒットした場合は 1.0、該当なしの場合は 0.0。
"""
idx = np.argsort(-y_score)[:k]
return 1.0 if y_true[idx].sum() > 0 else 0.0
hits = [hit_rate_at_k(y_true[q], y_score[q], k=10) for q in range(len(queries))]
hr_at_10 = np.mean(hits)
print("Hit Rate@10:", round(hr_at_10, 3))
複数クエリ(ユーザー)がある場合は平均を取ります。実装は Recall@k と似ていますが、ヒットの有無だけに注目する点が異なります。
3. 利点 #
- 直感的:ユーザーの何%にヒットしたかをそのまま説明できる。
- Recall@k より寛容:複数正解があっても 1 件ヒットすればカバーしたと見なす。
- 早期評価:最初の改善方向を探るためのラフな指標として使いやすい。
4. 実務での活用 #
推薦システム:ユーザーがクリックしたアイテムを候補に含められた割合を把握。
E コマース:人気商品やパーソナライズされた商品が候補に入っているかを確認。
A/B テスト:オンライン試験に入る前に、オフラインで HR@k の改善を目安にモデルを絞り込む。
5. 他指標との併用 #
| 指標 | 特徴 | 一緒に見ると良い理由 |
|---|---|---|
| Hit Rate | ユーザー単位のヒット有無 | 簡潔だが網羅性は分からない |
| Recall@k | 正解数 / 正解総数 | 正解が複数ある場合の網羅性を把握 |
| Precision@k | 候補の純度 | ヒット率が高くてもノイズが多い可能性を確認 |
| NDCG | 順位の質 | ヒットした正解が上位にあるかを確認 |
まとめ #
Hit Rate はユーザーごとに候補リスト内へ正解が入ったかを評価するシンプルな指標。
Recall@k や NDCG と組み合わせることで、網羅性や順位の質も把握できる。
初期分析や KPI として扱いやすく、ビジネス側への説明にも向いている。