推荐系统排序(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
 
 
 

posted on 2018-07-14 15:19  CuriousZero  阅读(43447)  评论(3编辑  收藏  举报

导航