推薦系統排序(Ranking)評價指標


  一、准確率(Precision)和召回率(Recall)

 (令R(u)是根據用戶在訓練集上的行為給用戶作出的推薦列表,而T(u)是用戶在測試集上的行為列表。)
對用戶u推薦N個物品(記為R(u)),令用戶u在測試集上喜歡的物品集合為T(u),然后可以通過准確率/召回率評測推薦算法的精度:

 

准確率描述最終的推薦列表中有多少比例是發生過的 用戶—物品評分記錄;
召回率描述有多少比例的 用戶—物品評分記錄包含在最終的推薦列表中。
 

准確率和召回率計算方法的Python代碼如下:

def Recall(train,test,N):
    hit=0
    all=0
    for user in train.keys():
        Tu=test[user]
        rank=GetRecommendation(user,N)
        for item,pui in rank:
            if item in Tu:
                hit+=1
        all+=len(Tu)
    return hit/(all*1.0)

def Precision(train,test,N):
    hit=0
    all=0
    for user in train.keys():
        Tu=test[user]
        rank=GetRecommendation(user,N)
        for item,pui in rank:
            if item in Tu:
                hit+=1
        all+=N
    return hit/(all*1.0)
View Code

 下面的Python代碼同時計算出了一個推薦算法的准確率和召回率: 

def PrecisionRecall(test, N): 
  hit = 0 
  n_recall = 0 
  n_precision = 0 
  for user, items in test.items(): 
    rank = Recommend(user, N) 
    hit += len(rank & items) 
    n_recall += len(items) 
    n_precision += N 
  return [hit / (1.0 * n_recall), hit / (1.0 * n_precision)] 
View Code

有的時候,為了全面評測TopN推薦的准確率和召回率,一般會選取不同的推薦列表長度N,計算出一組准確率/召回率,然后畫出准確率/召回率曲線(precision/recall curve)。

 

二、Mean average precision(MAP):
 
(1)Average precision(AveP):
由前面可知,准確率和召回率都只能衡量檢索性能的一個方面,最理想的情況肯定是准確率和召回率都比較高。當我們想提高召回率的時候,肯定會影響准確率,所以可以把准確率看做是召回率的函數,即:P=f(R),也就是隨着召回率從0到1,准確率的變化情況。那么就可以對函數P=f(R)在R上進行積分,可以求PP的期望均值。公式如下: 

 其中rel(k)表示第k個文檔是否相關,若相關則為1,否則為0,P(k)表示前k個文檔的准確率。 AveP的計算方式可以簡單的認為是: 

其中R表示相關文檔的總個數,position(r)表示,結果列表從前往后看,第r個相關文檔在列表中的位置。比如,有三個相關文檔,位置分別為1、3、6,那么AveP=13×(11+23+36)。在編程的時候需要注意,位置和第i個相關文檔,都是從1開始的,不是從0開始的。
 
AveP意義是在召回率從0到1逐步提高的同時,對每個R位置上的P進行相加,也即要保證准確率比較高,才能使最后的AveP比較大。
 
(2)Mean average precision(MAP):
 
通常會用多個查詢語句來衡量檢索系統的性能,所以應該對多個查詢語句的AveP求均值(the mean of average precision scores),即公式: 
  • 單個主題的平均准確率是每篇相關文檔檢索出后的准確率的平均值。
  • 主集合的平均准確率(MAP)是每個主題的平均准確率的平均值。
  • MAP 是反映系統在全部相關文檔上性能的單值指標。系統檢索出來的相關文檔越靠前(rank 越高),MAP就應該越高。如果系統沒有返回相關文檔,則准確率默認為0。
  • MAP的衡量標准比較單一,q(query,搜索詞)與d(doc,檢索到的doc)的關系非0即1,核心是利用q對應的相關的d出現的位置來進行排序算法准確性的評估。
  例如:假設有兩個主題,主題1有4個相關網頁(假設q1有4個相關d),主題2有5個相關網頁(假設q2有5個相關d)。某系統對於主題1檢索出4個相關網頁 ,其rank分別為1, 2, 4, 7;對於主題2檢索出3個相關網頁,其rank分別為1,3,5 。對於主題1,平均准確率為(1/1+2/2+3/4+4/7)/4=0.83。對於主題2,平均准確率為(1/1+2/3+3/5+0+0)/5=0.45。則MAP= (0.83+0.45)/2=0.64。” 
  •  需要注意:在利用MAP的評估的時候,需要知道:1. 每個q有多少個相關的d; 2. 排序結果中這些d的位置 3. 相關的定義
 
 
三、 NDCG(Normalized Discounted Cumulative Gain)
  N:歸一化,D:衰減率,C:累加,G:熵(關鍵),==》》:歸一化的,帶有衰減函數的,再帶有累加的熵。
 在MAP計算公式中,文檔只有相關不相關兩種,而在nDCG中,文檔的相關度可以分多個等級進行打分。

(1)Cumulative Gain(CG):

表示前p個位置累計得到的效益,公式如下: 

其中 表示第i個文檔的相關度等級,如:2表示非常相關,1表示相關,0表示無關,-1表示垃圾文件。

 
(2)Discounted cumulative gain(DCG):  
由於在 的計算中對位置信息不敏感,比如檢索到了三個文檔相關度依次是{3,-1,1}和{-1,1,3},顯然前面的排序更優,但是它們的CG相同,所以要引入對位置信息的度量計算,既要考慮文檔的相關度等級,也要考慮它所在的位置信息。假設每個位置按照從小到大的排序,它們的價值依次遞減,如:可以假設第i個位置的價值是 ,那么排在第i個位置的文檔所產生的效益就是 公式如下: 

另一種比較常用的,用來增加相關度影響比重的DCG計算方式是: 

(3)Ideal DCG(IDCG):
IDCG是理想情況下的DCG,即對於一個查詢語句和p來說,DCG的最大值。公式如下: 
 
其中 |REL| 表示:文檔按照相關性從大到小的順序排序,取前p個文檔組成的集合。也就是按照最優的方式對文檔進行排序。
 
(4)Normalize DCG(nDCG):
  由於每個查詢語句所能檢索到的結果文檔集合長度不一,p值的不同會對DCG的計算有較大的影響。所以不能對不同查詢語句的DCG進行求平均,需要進行歸一化處理。nDCG就是用IDCG進行歸一化處理,表示當前DCG比IDCG還差多大的距離。公式如下: 
  這樣每個查詢語句的 就是從0到1,不同查詢語句之間就可以做比較,就可以求多個查詢語句的平均 。 
NDCG@10、NDCG@20分別表示求p為10和20的時候的nDCG。
 
 四、Mean reciprocal rank (MRR) :

  reciprocal rank是指,第一個正確答案的排名的倒數。MRR是指多個查詢語句的排名倒數的均值。公式如下: 

 

其中表示第i個查詢語句的第一個正確答案的排名。

 

  MRR是一個國際上通用的對搜索算法進行評價的機制,其評估假設是基於唯一的一個相關結果,即第一個結果匹配,分數為 ,第二個匹配分數為 0.5,第 n 個匹配分數為 1/n,如果沒有匹配的句子分數為0。最終的分數為所有得分之和。

    這個是最簡單的一個,因為它的評估假設是基於唯一的一個相關結果,如q1的最相關是排在第3位,q2的最相關是在第4位,那么MRR=(1/3+1/4)/2,MRR方法主要用於尋址類檢索(Navigational Search)或問答類檢索(Question Answering)。

 MRR(Mean Reciprocal Rank):是把標准答案在被評價系統給出結果中的排序取倒數作為它的准確度,再對所有的問題取平均。

有3個query如下圖所示:(其中黑體為返回結果中最匹配的一項)

可計算這個系統的MRR值為:(1/3 + 1/2 + 1)/3 = 11/18=0.61。

 

 

 

五、F-score/F-measure
這是一種同時考慮准確率和召回率的指標。公式如下:
 
  可以看出F的取值范圍從0到1。另外還有一種F的變體如下所示: 
常用的兩種設置是 ,前者中recall重要程度是precision的兩倍,后者則相反,precision重要程度是recall的兩倍。
 
 
六、AUC(Area under ROC curve)
 
AUC的物理意義為任取一對例和負例,正例得分大於負例得分的概率,AUC越大,表明方法效果越好。(AUC的值一般介於0.5~1。)
 
 

matlab下 ROC和AUC的實現:

 

 

function [result]=AUC(test_targets,output) 
%計算AUC值,test_targets為原始樣本標簽,output為分類器得到的判為正類的概率,兩者的維度(長度)要一樣
% 均為行或列向量 
[A,I]=sort(output); % sort 默認升序,而這里I 是output原來的索引
M=0;N=0; 
for i=1:length(output) 
    if(test_targets(i)==1) 
        M=M+1;%正類樣本數
    else 
        N=N+1;  %負類樣本數
    end 
end 
sigma=0; 
for i=M+N:-1:1 
    if(test_targets(I(i))==1) 
        sigma=sigma+i; %(真實的)正類樣本的rank相加,(概率大的rank高。
    end 
end
result=(sigma-(M+1)*M/2)/(M*N); 

計算方法和例子詳見:【Reference-4】

 應用:

 

假設M有兩個,N有兩個。

那么原樣本標簽為:test_targets=[0, 0, 1, 1]。output =[0.3, 0.1, 0.4, 0.2](概率,算出來的得分)。則 I 即為:[2, 4, 1, 3] 

通過第一個for循環,算出M,N的值后。(不難理解)

在第二個for 循環:

for i=M+N:-1:1 
    if(test_targets(I(i))==1) 
        sigma=sigma+i; %(真實的)正類樣本的rank相加 
    end 
end

 循環條件從 M+N遞減到1,步長為1(-1)

先對 I(i) 取索引,I 是已經排好序的,從小到大的概率對應的Item 原先的位置。 I 即為:[2, 4, 1, 3] 

for 循環,i 從4開始,I (4) 對應的是索引為3的item,則 test_targets(3) = 1 ,是==1 沒錯,那么sigma就 +4;

 接下來,i =3,I (3) 對應的是索引為1的item,則 test_targets(1) = 0 ,不是==1 ,跳過;
 接下來,i =2,I (2) 對應的是索引為4的item,則 test_targets(4) = 1 ,是==1 沒錯,那么sigma就 +2;
 接下來,i =1,I (1) 對應的是索引為2的item,則 test_targets(2) = 0 ,不是==1 ,跳過;
 
 最終,sigma累加 4+2. 
 
【Reference】
1、《推薦系統實踐》,項亮
3、Learning to Rank for IR的評價指標—MAP,NDCG,MRR
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM