Resonance Lab · W03 Lab Note

MAP@3 到底怎麼算?用 20 萬次蒙地卡羅模擬釘住隨機猜測的地板

週一提到這場比賽用 MAP@3 當指標,也提到隨機猜測地板是 0.367——但這兩個數字是怎麼來的,值得在真正的分數揭曉前先講清楚,不然「贏過隨機猜測」這句話就只是空話。

這篇解什麼問題

MAP@3 的計算方式,跟為什麼隨機猜測的地板不是直覺以為的 0.2,而是 0.367——這個差距本身就值得拆開來看。

我怎麼做

MAP@3(Mean Average Precision @ 3)的算法:每一題最多預測 3 個答案字母,依信心程度排序。如果正確答案落在預測的第 1 名,這題得 1 分;落在第 2 名得 1/2 分;第 3 名得 1/3 分;沒猜中得 0 分。全部題目的平均,就是 MAP@3。

隨機猜測的理論地板容易算錯:5 選 1 的題目,隨機不重複抽 3 個字母,正確答案出現在這 3 個裡的機率是 3/5,出現時均勻分佈在第 1/2/3 名,理論期望值是:

E[MAP@3] = (3/5) × (1/3) × (1 + 1/2 + 1/3) = (3/5) × (1/3) × (11/6) = 11/30 ≈ 0.3667

不是隨口以為的「猜 3 個裡選 1 個對,除以 5」那種簡化算法。光靠公式推導容易在這種機率細節上出錯,所以我用 Python 跑了 20 萬次蒙地卡羅模擬——對每一題隨機生成正確答案與隨機排序的 3 個猜測,直接計算實際 MAP@3 平均值,不透過公式推導驗證。

結果與數據

20 萬次模擬得到 0.36596,跟理論值 11/30 ≈ 0.36667 幾乎完全吻合,誤差落在模擬抽樣誤差範圍內。這個數字就是本週所有路線分數的地板:任何路線如果分數低於 0.367,代表那個方法在幫倒忙,還不如亂猜。

一句話結論

0.367 不是隨口拍的地板,是理論推導加上 20 萬次模擬雙重驗證出來的數字——週三揭曉的兩條路線分數,都要拿這個地板當第一道及格線。