1. 程式人生 > >推薦系統常見評測標準之MAP與NDCG

推薦系統常見評測標準之MAP與NDCG

MAP

AP

在瞭解MAP(Mean Average Precision)之前,先來看一下AP(Average Precision), 即為平均準確率。

對於AP可以用這種方式理解: 假使當我們使用google搜尋某個關鍵詞,返回了10個結果。當然最好的情況是這10個結果都是我們想要的相關資訊。但是假如只有部分是相關的,比如5個,那麼這5個結果如果被顯示的比較靠前也是一個相對不錯的結果。但是如果這個5個相關資訊從第6個返回結果才開始出現,那麼這種情況便是比較差的。這便是AP所反映的指標,與recall的概念有些類似,不過是“順序敏感的recall”。

比如對於使用者 u, 我們給他推薦一些物品,那麼 u

的平均準確率定義為:

APu=1|teu|iteujteuδ(pujpui)+1pui

在這裡 pui 表示推薦列表中物品 i 的排序位置。pujpui 表示在對使用者 u 的排序列表中物品 j 的排序位置在物品i 的前面。

上面的式子是不是挺唬人的,下面來分析一下

def AP(ranked_list, ground_truth):
    """Compute the average precision (AP) of a list of ranked items

    """
    hits = 0
    sum_precs = 0
    for n in
range(len(ranked_list)): if ranked_list[n] in ground_truth: hits += 1 sum_precs += hits / (n + 1.0) if hits > 0: return sum_precs / len(ground_truth) else: return 0

MAP

那麼對於MAP(Mean Average Precision),就很容易知道即為所有使用者 u 的AP再取均值(mean)而已。那麼則有:

M
AP=uteAPu|te|

NDCG

CG

先從後兩個字母CG(Cummulative Gain)說起, 直接翻譯的話叫做“累計增益”。 在推薦系統中,CG即將每個推薦結果相關性(relevance)的分值累加後作為整個推薦列表(list)的得分。

CGk=i=1kreli

這裡, reli 表示處於位置 i 的推薦結果的相關性,k 表示所要考察的推薦列表的大小。

DCG

CG的一個缺點是沒有考慮每個推薦結果處於不同位置對整個推薦效果的影響,例如我們總是希望相關性高的結果應排在前面。顯然,如果相關性低的結果排在靠前的位置會嚴重影響使用者體驗, 所以在CG的基礎上引入位置影響因素,即DCG(Discounted Cummulative Gain), “Discounted”有打折,折扣的意思,這裡指的是對於排名靠後推薦結果的推薦效果進行“打折處理”:

DCGk=i=1k2reli1log2(i+1)
  • 分子部分 2reli1
    reli越大,即推薦結果 i 的相關性越大,推薦效果越好, DCG越大。

  • 分母部分 log2(i+1)
    i 表示推薦結果的位置,i 越大,則推薦結果在推薦列表中排名越靠後,推薦效果越差,DCG越小。

NDCG

DCG仍然有其侷限之處,即不同的推薦列表之間,很難進行橫向的評估。而我們評估一個推薦系統,不可能僅使用一個使用者的推薦列表及相應結果進行評估, 而是對整個測試集中的使用者及其推薦列表結果進行評估。 那麼不同使用者的推薦列表的評估分數就需要進行歸一化,也即NDCG(Normalized Discounted Cummulative Gain)。

在介紹NDCG之前,還需要了解一個概念:IDCG. IDCG, 即Ideal DCG, 指推薦系統為某一使用者返回的最好推薦結果列表, 即假設返回結果按照相關性排序, 最相關的結果放在最前面, 此序列的DCG為IDCG。因此DCG的值介於 (0,IDCG] ,故NDCG的值介於(0,1].

對於使用者 u[email protected]定義為:

NDCGu@k=DCGu@kIDCGu
這裡的 k 表示推薦列表的大小。

那麼,則有:

NDCG@k=uteNDCGu@k|te|

在具體操作中, 可以事先確定推薦目標和推薦結果的相關性分級。

  • 例如可以使用 0,1分別表示相關或不相關,比如此處我們用refi=δ(iteu) , 在這裡如果 x 為true, 則δ(x)=1,否則δ(x)=0.

  • 或是使用 0~5 分別表示嚴重不相關到非常相關, 也即相當於確定了rel 值的範圍。之後對於每一個推薦目標的返回結果給定