按照推薦任務的不同,最常用的推薦質量度量方法可以划分為三類:
(1)對預測的評分進行評估,適用於評分預測任務。
(2)對預測的item集合進行評估,適用於Top-N推薦任務。
(3)按排名列表對推薦效果加權進行評估,既可以適用於評分預測任務也可以用於Top-N推薦任務。。
對用戶 \(u\) 推薦了N個物品 \(R(u)\),用戶在測試集上喜歡的物品集合為\(T(u)\)
1、准確率 Precision
推薦給用戶的物品中,屬於測試集的比例:
2、召回率 Recall
測試集中有多少在用戶的推薦列表中。描述有多少比例的用戶-物品評分記錄包含在最終的推薦列表中
3、F1值
P和R指標有時候會出現的矛盾的情況,這樣就需要綜合考慮他們。准確率和召回率的加權調和平均
4、排序分數 Ranking Score
在評估推薦列表時引用排序指標很有用。推薦系統通常預測排名列表,然而用戶不太可能瀏覽所有的項目。因此,排序指標在測量實用性和排名信息時可能很有趣。排序靠前的項目更重要。
其中,\(E^U\) 表示測試集中所有的邊的集合,如果\(u-i\)在測試集中,則\(E_{ui} = 1\),\(p_{ui}\)表示商品\(i\)在用戶\(u\)的推薦列表中的位置,分母\(M-k_{u}\)表示用戶\(u\)的所有商品數組中除了該用戶已經購買過的商品外的所有商品。
Rank Score 越小,說明測試集中的商品越靠前。
5、命中率 Hit ratio
top-N推薦中流行的評價指標。
分母為所有的測試集合,分子表示每個用戶top-k推薦列表中屬於測試集合的個數的總和。
例如:三個用戶在測試集中的商品個數分別是10,12,8,模型得到的top-10推薦列表中,分別有6個,5個,4個在測試集中,那么此時HR的值是
(6+5+4)/(10+12+8) = 0.5。
# 計算某個用戶的hit數
def hit(test_items,pred_items):
count = 0
for item in pred_items:
if item in test_items:
count += 1
return count
二、NDCG
在排序學習(Learning to rank)中,目標是構建一個排序模型用於對列表進行排序。排序學習的典型應用包括搜索列表、推薦列表和廣告列表等等。
列表排序的目標是對多個條目進行排序,這就意味着它的目標值是有結構的。與單值回歸和單值分類相比,結構化目標要求解決兩個被廣泛提起的概念:
列表評價指標
列表訓練算法
列表評價指標
以關鍵詞搜索返回文章列表為例,這里先分析一下列表評價指標要解決什么挑戰。
第一個挑戰就是定義文章與關鍵詞之間的相關度,這決定了一篇文章在列表中的位置,相關度越高排序就應該越靠前。
第二個挑戰是當列表中某些文章沒有排在正確的位置時候,如何給整個列表打分。舉個例子來說,假如對於某個關鍵詞,按照相關性的高低正確排序,文檔1、2、3、4、5應該依次排在前5位。現在的挑戰就是,如何評估“2,1,3,4,5”和“1,2,5,4,3”這兩個列表的優劣呢?
舉個列子來說,對於某個請求關鍵詞,有200篇文章實際相關。某個排序算法只認為100篇文章是相關的,而這100篇文章里面,真正相關的文章只有80篇。按照以上定義:
准確率: \(\frac{80}{100}=0.8\)
召回率=\(\frac{80}{200}=0.4\)。
6、折扣累計收益 DCG (Discounted Cumulative Gain)
主要思想是用戶喜歡的物品被排在推薦列表前面比后面會更大程度增加用戶體驗。
解決了准確率和召回率的兩個缺點:
1、所有文章只被分為相關和不相關兩檔,分類顯然太粗糙
2、沒有考慮位置因素
對於一個關鍵詞,所有的文檔可以分為多個相關性級別,這里以\(r_1,r_2…\)來表示。文章相關性對整個列表評價指標的貢獻隨着位置的增加而對數衰減,位置越靠后,衰減越嚴重。基於DCG評價指標,列表前k個文檔的評價指標定義如下:
DCG缺點:對於排序引擎而言,不同請求的結果列表長度往往不相同。當比較不同排序引擎的綜合排序性能時,不同長度請求之間的DCG指標的可比性不高。
7、歸一化折扣累計增益 NDCG
https://blog.csdn.net/qq_34333481/article/details/102623753
由於在用戶與用戶之間,DCGs沒有直接的可比性,所以我們要對它們進行歸一化處理。最糟糕的情況是,當使用非負相關評分時DCG為0。為了得到最好的,我們把測試集中所有的條目置放在理想的次序下,采取的是前K項並計算它們的DCG。然后將原DCG除以理想狀態下的DCG就可以得到NDCG,它是一個0到1之間的數。
\(|REL|\)代表按照相關性排序好的最多到位置k的結果列表。
# 當 測試集為(用戶ID,物品ID)
# 得到的排序之后的候選推薦列表ranklist,列表元素內容為[0,1]之間的數值
#此時的NDCG 為 真正的物品ID出現在推薦列表中的位置 的 log值
def getNDCG(ranklist, gtItem):
for i in range(len(ranklist)):
item = ranklist[i]
if item == gtItem:
return np.log(2) / np.log(i+2)
return 0
8、均方誤差MAE
對打分數據集進行評估。表示所有測試集中的預測打分和實際打分的差異。
9、均方根誤差RMSE
10、MAP
對於AP可以用這種方式理解: 假使當我們使用google搜索某個關鍵詞,返回了10個結果。當然最好的情況是這10個結果都是我們想要的相關信息。但是假如只有部分是相關的,比如5個,那么這5個結果如果被顯示的比較靠前也是一個相對不錯的結果。但是如果這個5個相關信息從第6個返回結果才開始出現,那么這種情況便是比較差的。這便是AP所反映的指標,與recall的概念有些類似,不過是“順序敏感的recall”。
AP:平均准確率
其中,\(p_{ui}\)表示推薦列表中物品\(i\)的排序位置。\(p_{uj} \prec p_{ui}\)表示物品\(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即為所有用戶的AP的均值
三、非准確率指標
1、Hmming distance. 漢明距離。通信原理中的漢明碼 https://blog.csdn.net/Yonggie/article/details/83186280
其中,\(c(i,j)\)表示用戶\(i,j\)前k個推薦結果中相同結果的個數,N表示所有用戶數。
漢明距離能夠有效衡量兩個用戶推薦列表的差異,該值越大越說明用戶之間的推薦結果越不相同,差異性越大。
2、Intrasimilarity 內部相關性
對於用戶u的推薦列表,如果物品與物品之間的相似度越大,說明推薦給用戶的商品比較單一,推薦算法越發現不了新的物品;反之,如果該值越小,則推薦的物品越豐富,越有利於對用戶的興趣進行擴展。
其中,\(s_{\alpha \beta }\)表示物品\(\alpha \beta\)的相似度,常用余弦相似度。
3、Popularity 流行度
其中,\(O_{R}^{u}\) 表示用戶u的前k個推薦物品列表,\(d_{\alpha }\)表示\(\alpha\) 被多少個用戶購買過,代表該物品的熱度。
流行度越大,說明推薦算法傾向於推薦“熱度”越大、越流行的商品;反之,則越傾向於推薦比較冷門的物品,越能反映出用戶的興趣。