MAP(Mean Average Precision)

中級

4.5.2

MAP(Mean Average Precision)

最終更新 2020-02-12 読了時間 2 分
まとめ
  • MAPはクエリごとのAverage Precisionを平均したランキング指標です。
  • 検索結果を例にAPとMAPを計算し、順位の影響を確認します。
  • 長い候補リストや重み付けの扱いなど運用上の注意点を整理します。

1. APとMAPの定義 #

1クエリに対するAverage Precision(AP)は、正解アイテムを見つけたタイミングごとの適合率を平均します。

$$ \mathrm{AP} = \frac{1}{|G|} \sum_{k \in G} P(k) $$

ここで$G$は正解アイテムのランク位置集合、$P(k)$は位置$k$までの適合率。MAPは複数クエリのAPを平均します。

$$ \mathrm{MAP} = \frac{1}{Q} \sum_{q=1}^{Q} \mathrm{AP}_q $$

2. ステップごとの計算例 #

2.1 問題設定 #

検索エンジンがあるクエリに対して10件の結果を返しました。このうち正解(関連あり)は3件で、ランキング上の位置は1位・4位・7位です。

順位アイテム関連性
1A関連あり
2B関連なし
3C関連なし
4D関連あり
5E関連なし
6F関連なし
7G関連あり
8H関連なし
9I関連なし
10J関連なし

2.2 各正解位置でのPrecisionの計算 #

APの計算では、正解アイテムが出現した位置でのみPrecisionを計算します。

位置1(アイテムA) #

位置1までに正解が1件、全体が1件なので

$$ P(1) = \frac{\text{位置1までの正解数}}{\text{位置1までのアイテム数}} = \frac{1}{1} = 1.0 $$

位置4(アイテムD) #

位置4までに正解が2件(A, D)、全体が4件なので

$$ P(4) = \frac{2}{4} = 0.5 $$

位置7(アイテムG) #

位置7までに正解が3件(A, D, G)、全体が7件なので

$$ P(7) = \frac{3}{7} \approx 0.4286 $$

2.3 AP(Average Precision)の算出 #

3つのPrecisionを正解数 $|G| = 3$ で平均します。

$$ \mathrm{AP} = \frac{1}{|G|} \sum_{k \in G} P(k) = \frac{P(1) + P(4) + P(7)}{3} = \frac{1.0 + 0.5 + 0.4286}{3} = \frac{1.9286}{3} \approx 0.6429 $$

順位が重要な理由:もし正解3件が位置1・2・3に並んでいれば$\mathrm{AP} = (1/1 + 2/2 + 3/3)/3 = 1.0$になります。逆に位置8・9・10に追いやられると$\mathrm{AP} = (1/8 + 2/9 + 3/10)/3 \approx 0.1528$まで下がります。APは「上位に正解があるほど高い」という直感に合致する指標です。

2.4 MAP@k(カットオフ付きバリアント) #

実務では上位$k$件だけを対象にAPを計算するMAP@kがよく使われます。ランキングを位置$k$で打ち切り、それ以降に現れる正解は無視します。

$$ \mathrm{AP@}k = \frac{1}{\min(|G|,\, k)} \sum_{\substack{i \in G \\ i \le k}} P(i) $$

先ほどの例で$k = 5$とすると、位置7の正解は打ち切られ、位置1と4の正解のみが対象になります。

$$ \mathrm{AP@5} = \frac{P(1) + P(4)}{\min(3,\, 5)} = \frac{1.0 + 0.5}{3} = \frac{1.5}{3} = 0.5 $$

分母は「正解の総数と$k$の小さい方」です。正解3件のうち2件しか上位5件に入っていないため、AP@5はAP全体(0.6429)より低くなります。推薦システムではMAP@5やMAP@10など、ユーザーが実際に閲覧する範囲に限定した評価がよく行われます。

2.5 複数クエリでのMAPの計算 #

MAPは複数クエリのAPを単純平均した指標です。3つのクエリを例に計算します。

正解数正解位置AP
クエリ 131, 4, 70.6429
クエリ 221, 21.0
クエリ 323, 100.2667

クエリ2のAP #

正解が位置1と2にあるため

$$ P(1) = \frac{1}{1} = 1.0, \quad P(2) = \frac{2}{2} = 1.0 $$$$ \mathrm{AP}_2 = \frac{1.0 + 1.0}{2} = 1.0 $$

クエリ3のAP #

正解が位置3と10にあるため

$$ P(3) = \frac{1}{3} \approx 0.3333, \quad P(10) = \frac{2}{10} = 0.2 $$$$ \mathrm{AP}_3 = \frac{0.3333 + 0.2}{2} = \frac{0.5333}{2} \approx 0.2667 $$

MAPの算出 #

$$ \mathrm{MAP} = \frac{1}{Q} \sum_{q=1}^{Q} \mathrm{AP}_q = \frac{0.6429 + 1.0 + 0.2667}{3} = \frac{1.9096}{3} \approx 0.6365 $$

この例では、クエリ2は上位に正解が集中しているためAPが高く、クエリ3は正解の順位が低いためAPが低くなっています。MAPはこれらを平均することで、システム全体のランキング品質を1つのスカラー値で要約します。


3. Pythonで計算 #

Scikit-learnには直接のMAP実装はありませんが、average_precision_scoreをクエリごとに計算して平均できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from sklearn.metrics import average_precision_score
import numpy as np

aps = []

for q in queries:
    aps.append(average_precision_score(y_true[q], y_score[q]))

map_score = np.mean(aps)
print("MAP:", round(map_score, 4))

y_true[q]は該当クエリのラベル(0/1)、y_score[q]はモデルスコアです。


4. 特徴と利点 #

  • 正解が複数あるランキングで有効。
  • 上位で正解を見つけた方が高いスコアになる。
  • Recallの影響も含むため、単純なPrecision@kより包括的。

5. 実務での活用 #

  • 検索システム:ユーザーが求める複数結果を提示できているかを評価。
  • 推薦システム:購買履歴や視聴履歴など、正解が複数存在する場面でKPIとして採用。
  • ランキング学習(LTR):LambdaMARTやXGBoostなどのランキングモデルをオフライン評価する指標。

6. 注意点 #

  • クエリごとの正解アイテム数が極端に異なる場合、MAPの平均が偏ることがある。Weighted MAPを検討する。
  • 正解なし(ラベルが0のみ)クエリはAPが定義できないため除外するか、0として扱うかを決めておく。
  • NDCGやRecall@kと併用し、ランキングの多面的な性能を評価する。

まとめ #

  • MAPは平均適合率の平均で、複数正解を持つランキング評価に最適。
  • クエリごとのAPを計算し、平均するだけで算出できる。
  • NDCGやRecall@kなど他指標と併用し、ランキングモデルの改善を進めよう。