一、准確率(Precision)和召回率(Recall)
准確率和召回率計算方法的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)
下面的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)]
有的時候,為了全面評測TopN推薦的准確率和召回率,一般會選取不同的推薦列表長度N,計算出一組准確率/召回率,然后畫出准確率/召回率曲線(precision/recall curve)。
其中rel(k)表示第k個文檔是否相關,若相關則為1,否則為0,P(k)表示前k個文檔的准確率。 AveP的計算方式可以簡單的認為是:

- 單個主題的平均准確率是每篇相關文檔檢索出后的准確率的平均值。
- 主集合的平均准確率(MAP)是每個主題的平均准確率的平均值。
- MAP 是反映系統在全部相關文檔上性能的單值指標。系統檢索出來的相關文檔越靠前(rank 越高),MAP就應該越高。如果系統沒有返回相關文檔,則准確率默認為0。
- MAP的衡量標准比較單一,q(query,搜索詞)與d(doc,檢索到的doc)的關系非0即1,核心是利用q對應的相關的d出現的位置來進行排序算法准確性的評估。
- 需要注意:在利用MAP的評估的時候,需要知道:1. 每個q有多少個相關的d; 2. 排序結果中這些d的位置 3. 相關的定義
(1)Cumulative Gain(CG):
表示前p個位置累計得到的效益,公式如下:

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




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




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

其中表示第i個查詢語句的第一個正確答案的排名。
MRR是一個國際上通用的對搜索算法進行評價的機制,其評估假設是基於唯一的一個相關結果,即第一個結果匹配,分數為 1 ,第二個匹配分數為 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。




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;
