MAP(mean average precision)
date: 2022-03-08 excerpt: MAPについて
MAP(mean average precision)について
概要
- ランキング問題における評価指標
- MAP@nなどと表現される(n番目までのデータで評価するという意味)
定義
\[MAP@12 = \frac{1}{U} \sum_{u=1}^{U} \sum_{k=1}^{min(n,12)} \frac{P(k)}{k}\]- \(n=12\)のとき
- \(U\); レコメンドの個数
計算方法
- ランキングの評価指標(relevantとprecision)の合成指標がMAPの本質である
relevant(recall)の計算
- GTに値が存在するかどうかの指標
def rel_at_k(y_true: np.array, y_pred: np.array, k: int) -> int:
"""y_predにy_trueが存在するか
"""
if y_pred[k-1] in y_true:
return 1
else:
return 0
precisionの計算
- GTと推論値の共起数
def precision_at_k(y_true: np.array, y_pred: np.array, k: int) -> float:
"""precisionはrank kまで共起を計算する
"""
intersection = np.intersect1d(y_true, y_pred[:k])
return len(intersection) / k
average precision(relevantとprecisionの合成)
def average_precision_at_k(y_true: np.array, y_pred: np.array, k: int) -> float:
"""APはprecisionとrelから計算する
"""
ap = 0.0
for i in range(1, k+1):
ap += precision_at_k(y_true, y_pred, i) * rel_at_k(y_true, y_pred, i)
return ap / min(k, len(y_true))
# 全てのAPに対して平均を計算
def mean_average_precision(y_trues, y_preds, k):
return np.mean([average_precision_at_k(y_true, y_pred, k) \
for y_true, y_pred in zip(y_trues, y_preds)])
参考
- MAP(Mean Average Precision)という指標の意味
- Understanding Mean Average Precision
- 実装が丁寧に記されていて理解しやすい