• home
  • about
  • 全ての投稿
  • ソフトウェア・ハードウェアの設定のまとめ
  • 分析関連のまとめ
  • ヘルスケア関連のまとめ
  • 生涯学習関連のまとめ

MAP(mean average precision)

date: 2022-03-08 excerpt: MAPについて

tag: statistics機械学習MAPmean average precision


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
    • 実装が丁寧に記されていて理解しやすい


statistics機械学習MAPmean average precision Share Tweet