[Python推薦系統] 常見『線下』排序評估指標

Yeh James
8 min readApr 10, 2021

--

如何評估推薦系統的優劣呢?

推薦系統能夠幫助我們達到很好的成效,那要怎麼評估推薦系統的成效呢?

通常模型評估可分為『線下』(offline) 以及『線上』(online) 兩種不同評估方式。簡單來說『線下』評估就是要在模型『上線』前先做某種的衡量,以確保模型上線後的效果跟自己的想像不會差太多,再來就是線上資源有限,沒辦法滿足所有資料科學家的測試。舉例來說,很多資料科學家都想拿部分流量(1~10%)來做 A/B Test,假設平均實驗流量為 5%,最多只能容納 20個模型做線上測試,因此線上的資源是很珍貴的。另外如果我們讓不好的推薦系統沒有經過驗證直接上線,可能會讓使用者感到無聊、厭惡(推薦了恐怖或是賭博廣告),進而讓平台流失該使用者,因此任何即將要上線的模型都要經過謹慎的線下評估才能上線做測試。

在一般機器學習模型中常見『線下』指標包含了

分類問題評估指標:

  • 準確率 Accuracy
  • 精確率 Precision
  • 召回率 Recall
  • F1分數
  • PR 曲線
  • ROC 曲線

回歸問題評估指標:

  • MAE 平均絕對誤差
  • MSE 均方誤差

但以上指標都沒有考慮到排序問題。在傳統的鐵達尼號預測乘客生死,或是影像辨識數字或貓狗,這些機器學習的模型都沒有考慮到排序問題。然而在大部分推薦系統的結果產生是一個列表,我們會考慮說是不是有把實際上最好的結果放在第一位,次好的放在第二位。像是 Google 搜索引擎就會考慮到是不是大部分的使用者都是點擊第一個搜尋結果。

推薦系統中最常見的三個排序評估指標為

  1. MRR (平均排名倒數)
  2. MAP/mAP (平均精度均值)
  3. NDCG (標準化折扣累積增益)

這三種有什麼差別呢? 主要的差異為,如果是廣告點擊這種 CTR 指標的話,通常我們只能知道使用者沒有點擊,因為一般來說廣告點了之後跳到別的網站去了,很難去追蹤站外行為。這種二元行為比較適用前兩種。但如果是閱讀文章或是商品評價,都是在同一個網站,你可以知道使用者喜好的程度,並依此來分級,比方說商品評價或是使用者停留在該文章的時長、互動行為可以轉換成1~5分的喜好程度等等資訊,這樣的評估就比較適合第三種。

MRR: Mean Reciprocal Rank (平均排名倒數)

最簡單的指標,該指標只注重第一個相關的物品在哪裡,並把第一個相關物品的位置做倒數運算並平均,所以如果你想特別關注第一個相關物品是否有出現在最前面的話,這個指標特別適用。

MRR 圖示 來源

綠色為相關物品、紅色為不相關物品。以廣告來說,綠色就是使用者有點擊過的廣告、紅色則是沒點擊。我們可以看到對於使用者 1,他的第一個相關廣告出現在排名第3,倒數就是(1/3),對於使用者 2,他的第一個相關廣告出現在排名第2,倒數就是(1/2),對於使用者 3,他的第一個相關廣告出現在排名第1,倒數就是(1/1)。把這三個分數相加平均就是 (1/3 + 1/2 + 1)/3 = 0.61 了,是不是非常直觀及好理解呢?

MAP/mAP: Mean Average Precision (平均精度均值)

除了考量第一個相關物品的位置之外,也考量第二個、第三個… 第N個相關物品的位置,並把每一個相關物品位置的 Top k precision給加起來平均。

MAP 圖示 來源

以上圖例子來說,使用者 1 的推薦列表相關的物品出現在位置 1, 3, 4,這三個位置的 precision 為 1/1, 2/3, 3/4 ,平均精度為 (1/1 + 2/3 + 3/4) = 0.8,再把每個人的平均精度平均一次,得到 0.56 的 MAP 分數。

思考:那這邊可不可以也用方法1(MRR)中的倒數來取代 precision 呢? 直觀的想法是採用倒數的話會直接讓後面相關物品的權重變太小

NDCG: Normalized Discounted Cumulative Gain(標準化折扣累積增益)

比起上面兩個指標,這個指標稍微相對複雜一點,但 NDCG 主要的精神跟 MAP 是一樣的,只是 MRR 跟 MAP 只考慮物品是否相關,但沒考慮到相關的程度。 以商品評價來說好了,應該把最高的商品評價放在最前面,次高的放第二位…以此類推。

首先我們有些名詞需要理解,

假設今天推薦系統給使用者 6 個推薦物品, 這些推薦物品分別從資料庫找出使用者給這些商品評分為(假設為 3~0 分),第一個物品3分、第二個物品2分、第三個物品3分、第四個物品0分、第五個物品1分、第六個物品2分。

首先介紹一個詞,『Cumulative Gain』累計增益,代表的是把相關度累加起來,以上圖為例,對於 User 1 推薦結果的『Cumulative Gain』為:

但我們會發現雖然位置 1, 3 都放上了最好的結果,但是位置1的放最好的物品(評分為3分)的重要性應該要比位置3放最好的物品來得重要,因此我們需要針對位置的權重做些調整,所以有了 『Discounted Cumulative Gain』,這公式主要是針對越後面位置的分數要做越多的打折

打折的公式有兩種:標準版業界版。業界版只是把相關度變成二的指數次方而已,更看重相關度高的物品要再越前面

標準版

業界版(更強調越相關的要放在越前面)

將標準版的公式帶入上例,得出 Discounted 的 Cumulative Gain 為 6.8(圖片有誤,實際應為6.86)

但我們怎麼知道 6.8 算高的呢? 說不定這個用戶在評分的時候偏低,如果我們拿這個 6.8 的分數與另一位評分都偏高的用戶相比較,會顯得很不公平,因此我們這邊要做正規化。正規化的分母就是我們要拿最理想的排序當作分母,如果達到完美排序分數就是 1,排序越爛分數就越接近 0 。那裡想排序是什麼呢?很簡單,就把分數從高的往低的排就好了。

理想的 Discounted Cumulative Gain 為 7.141

因此 Normalized Discounted Cumulative Gain 為 0.961 ,相當接近1也算是不錯的排序結果了!

另外這個 Normalized Discounted Cumulative Gain 只是單一一個user 的分數喔,我們還需要把所有 User 的 Normalized Discounted Cumulative Gain 加起來平均,就得到我們最後的分數。原文完整的流程圖如下

NDCG 在資料完整的時候可以當作一個非常有效的指標,但是往往現實世界中使用者的數據都是不完整的,比如說許多使用者對商品評分都是空值,而這些不完整的資訊會補值方法上的差異而影響 NDCG 的判斷效果。

這篇文我們主要介紹了三種線下評估指標

  1. MRR (平均排名倒數)
  2. MAP/mAP (平均精度均值)
  3. NDCG (標準化折扣累積增益)

這三種指標主要是針對推薦系統的『準度』,實際上業界同時會考量更多因素,像是推薦的『多樣性』或是推薦商品的『平均價格』等各種因素。在通過線下指標評量後,我們就會把模型放到線上環境中,實際使用真實的流量(ex: 5%的使用者)來測試,從真實的流量當中資料分析師可以觀測到更多的數據,像是 CTR、 每個頁面的停留時長、 消費金額、各種行為數量(按讚、分享、隱藏)、或是客訴數量(推薦太多不適合的內容給某些人或是產品功能跟其他人的不一致)。

參考來源

  1. MRR vs MAP vs NDCG: Rank-Aware Evaluation Metrics And When To Use Them

--

--