1. 程式人生 > >推薦系統評價:NDCG方法概述

推薦系統評價:NDCG方法概述

【編者按】在資訊過剩的網際網路時代,推薦系統的地位隨著大資料的普及愈發重要。評估一個推薦模型的質量面臨很多棘手的問題,我們常用的指標是直接的準確率、召回率,但準確率不一定具有很好的相關性。來自Zygmunt Z的這篇綜述文章,把推薦當作是一個排名任務,提供了一種更注重相關性的視角來進行推薦系統的評估,頗具可讀性。

如果你挖掘的資訊較少,推薦的方法有很多。問題是,選擇哪一個模型更合適。在這裡,主要的決策因子是推薦質量。你可以通過驗證來估計它,而推薦系統的驗證可能會很棘手。你需要考慮一些東西,包括任務的制定,可用的反饋形式和一個優化指標。下面,我們來解決這些問題並呈現一個例項。

排名推薦

我們把推薦當作是一個排名任務,這表示我們主要感興趣的是一個相對較少的項,我們認為這些項最相關並把它呈現給使用者。這就是眾所周知的Top-k推薦。

把它和評級預測做比較,如Netflix的競賽。2007年,Yehuda Koren(此次比賽的一個勝出者)指出,人們對使用RMSE作為一個指標並贊成使用RMSE指標存有疑惑,我們應該使用一個特定的排名指標。

然而,在我們有限的實驗中,我們發現RMSE指標並不適用於排名。對我們而言,當調整使用者留存率時,用於RMSE的矩陣分解優化表現的相當不錯,但當從所有的可用項選擇推薦時,卻徹底地失敗了。

我們認為原因是訓練會集中於評分較高的項,同時對於這些項產生一個很好的擬合結果。而對於評分較低的項,在損失影響方面沒有太大的意義。結果,對他們的預測會不平衡,使得與實際得分相比,一些得分較高,一些得分較低。最後,靠前的條目將顯示在熱門推薦一欄中,因而破壞了推薦結果。

換句話說,RMSE指標不能辨別真實的內情,而且我們需要特定的排名指標。

排名指標

兩個最受歡迎的排名指標是MAP和NDCG。我們在前段時間已經使用了平均精度均值(MAP)。NDCG表示歸一化折損累積增益。兩者之間的主要區別是,MAP認為是二元相關性(一個項是感興趣的或者不感興趣的),而NDCG允許以實數形式進行相關性打分。這種關係類似分類和迴歸的關係。

實際當中,很難直接地優化MAP或NDCG指標,因為他們是不連續的,所以不可微。幸運的是,排名學習中的排名指標和損失函式表明,用於排名學習的一對損失函式近似於這些指標。

NDCG

NDCG這個名字可能有點嚇人,但其背後的思想卻很簡單。一個推薦系統返回一些項並形成一個列表,我們想要計算這個列表有多好。每一項都有一個相關的評分值,通常這些評分值是一個非負數。這就是gain

(增益)此外,對於這些沒有使用者反饋的項,我們通常設定其增益為0。

現在,我們把這些分數相加,也就是Cumulative Gain(累積增益)。我們更願意看那些位於列表前面的最相關的項,因此,在把這些分數相加之前,我們將每項除以一個遞增的數(通常是該項位置的對數值),也就是折損值,並得到DCG。

在使用者與使用者之間,DCGs沒有直接的可比性,所以我們要對它們進行歸一化處理。最糟糕的情況是,當使用非負相關評分時DCG為0。為了得到最好的,我們把測試集中所有的條目置放在理想的次序下,採取的是前K項並計算它們的DCG。然後將原DCG除以理想狀態下的DCG並得到[email protected],它是一個0到1之間的數。

你可能已經注意到,我們使用K表示推薦列表的長度。這個數由專業人員指定。你可以把它想像成是一個使用者可能會注意到的多少個項的一個估計值,如10或50這些比較常見的值。

要注意到,我們實驗的測試集由訓練集以外的所有項組成,包括那些沒有使用者排名的項(與上面RMSE討論中提到的一樣)。有時人們會對使用者留存率設定測試限制,所以推薦系統的任務是減少調整那些相對較少的項。在實際情景當中並不如此。

現在,它的要點是,還有另一種DCG表述。你還可以使用負相關分數。在這種情況下,你可以計算出更糟糕情況下DCG的歸一化(它將小於零),或者仍然使用零作為下限值,具體要視情況而定。

反饋形式

有兩種型別的反饋形式:顯性反饋和隱性反饋。顯性反饋表示使用者率項。另一方面,隱性反饋來自於使用者行為的觀察。大多數通常是二元的:使用者點選了一個連結,觀看了一個視訊,瀏覽了一個產品,購買了一個產品。隱式反饋不常以計數的形式出現,例如使用者聽一首歌的次數是多少。MAP只是一種二元反饋指標,而NDCG可以在任何情況下使用,你可以對推薦項指定相關分數(二元、整數或是實數)。

弱泛化和強泛化

我們可以把使用者(和項)分成兩組:訓練集的一組和非訓練集的一組。第一組的驗證分數對應於所謂的弱泛化,而第二組對應於強泛化。在弱泛化的情況下,每個使用者都在訓練集。我們採取一些評價用於訓練,剩下的評價用於測試。在評估強泛化時,使用者既可用在訓練中,也可用在測試中。

事實上,我們主要感興趣的是強泛化,因為在現實生活中,我們給使用者推薦的條目並不存在於訓練集。我們可以通過重新訓練模型來解決這個問題,但這在實時推薦系統當中並不可行(除非我們的模型碰巧使用的是線上學習,這表明它可以使用實時獲得的新資料進行更新)。我們假設將使用一個沒有資料更新的預訓練模型,因此我們需要一種方式來解釋先前看不見的使用者。

處理新使用者

有些演算法在這種場景中會更合適,而有些演算法則會變得更糟糕。例如,人們可能會說矩陣分解模型不能為新使用者提供推薦。這是不正確的。例如,使用交替最小二乘(ALS)。該方法通過在調整項因子時保持使用者因子不變,並在調整使用者因子時保持項因子不變,從而擬合模型,依次迴圈直至收斂。在測試時,當我們從一個新使用者輸入時,我們可以保持項因子不變來擬合用戶因子,然後進行推薦。

一般來說,當預測率是使用者和項因子之間的點積時,我們可以採取項因子和解決系統的線性方程組來估計使用者因子。這相當於擬合一個線性迴歸模型。我們希望的比率(例項)數是大於因子的數,但即使不能如願,我們也要感謝正則化。

缺乏例項是一個眾所周知的冷啟動問題:如果一個新的訪問者沒有評分,那麼協同過濾對於推薦就沒用。只有在我們有一些反饋之後,我們才能使用它開始工作。

越多越好

一般情況下,一個推薦系統得到的資訊越多就會表現得越好,理想的情況下,當系統從給定使用者中得到更多評價的時候,推薦的質量就會提高。在評價一個系統時,我們要考慮這個維度。為了完成這個,對於一個給定的使用者,我們選擇一個評價來訓練,剩下的用來測試,然後選擇兩個評價進行訓練,剩下的用來測試並依次下去,重複計算推薦和NDCG,直到達到某個特定數值或者測試集中沒有剩餘的評價為止。然後,我們繪製出如下結果圖。


X軸是訓練的評價數,Y軸是使用者[email protected]均值

當比較兩個推薦系統的結果時,繪圖將揭開它們的不同。要麼一個比另一個更好,要麼在曲線的某些點上相交。

該交叉點提供了使用兩個系統組合的一種可能性。最初我們採用的是第一個系統,當獲得的反饋大於閾值時,我們切換到另一個系統。在這裡,當給出少許評價數時藍色會表現的更好,但當評價數大約50個時就會收斂。當提供更多的評價時,綠色則佔據上風。

這個分數是在大約1000個使用者組成的測試集中計算得到的,這個樣本大小提供了可識別的模型,但是仍然有一些噪音,正如你從鋸齒線上看到的那樣。

事實上,我們需要的應該是一個數字而不是一個繪圖,我們可以在訓練中平均化等級數目之間的得分,我們稱這個數為L。由此產生的指標是MANDCG:均值(使用者之間)平均(1到L之間)NDCG。

本文的程式碼在GitHub上可以獲得。要執行它,在你的推薦系統上需要提供的資料和外掛。

最後,我們誠邀您來探索如何在MovieMood上使用更多的評價數來提升推薦系統的質量。

關於譯者: 劉翔宇,中通軟開發工程師,關注機器學習、神經網路、模式識別。