排序任务评估指标

    本文内容大部分参考《手把手构建人工智能产品》和https://www.cnblogs.com/ywl925/archive/2012/11/21/2780861.html

排队任务可以当做一个分类任务来处理,对目标对象进行打分之后按照分数规则返回一个序列结果,在工作中可以通过定义分数规则来确定目标对象属于哪一类。

搜索引擎就是一个典型的排序系统,当输入关键词时,系统按一定顺序返回一系列与关键词相关的搜索结果。搜索引擎对每个关键词有一个打分,即将对象池中的对象分为正类(与查询关键词相关)和负类(与查询词不相关)。并且每个对象都有一个得分,即其属于正类的置信度,然后按照这个置信度将正类进行排序并返回。另一个和排序相关的场景是用户的个性化推荐。在对用户进行用户画像分析之后打出一系列的标签,将推荐的项目按照标签的相关度进行排序从而可得到给用户推荐的兴趣列表。

在排序任务中有如下几类评估指标。

1、精确率-召回率

在检索系统中,任务排序相当于一个多任务的查询,不同的用户输入不同的查询词,返回与每个查询词相关的前n个项目,并且加以排序。在计算评估指标值时,需要求出每个用户的精确率-召回率的平均值,将平均值做对排序模型进行评估。

流程:

不同用户输入关键词

               ↓

前n个相关项目,并根据项目得分排序

               ↓

每个用户的精确率--召回率

               ↓

对上一步求平均值

               ↓

评估排序模型

2、NDCG(Normalized Discounted Cumulatice Gain)

搜索引擎一般采用PI(peritem)的方式进行评测,简单地说就是逐条对搜索结果进行分等级的打分。假设我们现在在Google上搜索一个词,然后得到5个结果。我们对这些结果进行3个等级的区分:Good(好)、Fair(一般)、Bad(差),然后赋予他们分值分别为3、2、1,假定通过逐条打分后,得到这5个结果的分值分别为3、2 、1 、3、 2。

在介绍NDCG之前,先介绍下CG和DCG

2.1 CG(Cumulative Gain)

CG并不考虑在搜索结果页面中结果的位置信息,它是在这个搜索结果list里面所有的结果的等级对应的得分的总和。如一个搜索结果list页面有P个结果,CG被定义为:

CG_{p}={\sum_{i=1}^{p}}rel(i)

rel_{i}是第i位结果的得分。CG的统计并不能影响到搜索结果的排序,CG得分高只能说明这个结果页面总体的质量比较高并不能说明这个算法做的排序好或差。什么是好的排序?也就是说要把Good的结果排到Fair结果上面、Fair结果排到Bad结果上面,如果有Bad的结果排在了Good上面,那当然排序就不好了。到底排序好不好,需要一个指标来衡量,DCG就是这样的一个指标。

上面的例子CG=3+2+1+3+2=11,如果调换第二个结果和第三个结果的位置CG=3+1+2+3+2=11,并没有改变总体的得分。

2.2 DCG(Discounted Cumulative Gain)

在一个搜索结果list里面,比如有两个结果的打分都是Good,但是有一个是排在第1位,还有一个是排在第40位,虽然这两个结果一样都是Good,但是排在第40位的那个结果因为被用户看到的概率是比较小的,他对这整个搜索结果页面的贡献值是相对排在第一位那个结果来得小的。

  DCG的思想是等级比较高的结果却排到了比较后面,那么在统计分数时,就应该对这个结果的得分有所打折。一个有p(P≥2)个结果的搜索结果页面的DCG定义为:  

为什么要用以2为底的对数函数?这个并没有明确的科学依据,大概是根据大量的用户点击与其所点宝贝的位置信息,模拟出一条衰减的曲线。(这里的思想是理想的idea IDCG是按照得分高低排序,即rel越高,1/log{_{2}}i越高,如果不是理想排序,得分虽高但1/log{_{2}}i很低,DCG值就低)

                                                                              以2为底的对数函数图

 

                                                                                      1/log{_{2}}i

那么上例中的数字如下: 

irellogrel/logDCG
13----3
211.001.004.00
321.581.265.26
432.001.506.76
522.320.867.62

DCG=3+(1+1.26+1.5+0.86)=7.62

import math

def dcg(score,rank):
    score_0=score[0] #score_0为序列第一项的得分
    dcg_sum=score_0
    count=1
    for i in score[1:]:
        count+=1
#        print(i/math.log(count,2))
        dcg_sum+=(i/math.log(count,2))
#        print(dcg_sum)
    return dcg_sum
        

score_list=[3,1,2,3,2]
rank=[i for i in range(1,len(score_list)+1)]

dcg_value=dcg(score_list,rank)

DCG的公式另外一种表达式是: 

这个表达式在一些搜索文档中经常会被提到,他的作用和之前的那个公式一样,但是这个公式只适合打分分两档的评测。

NDCG(Normalize DCG 

因为不同query的搜索结果有多有少,所以不同query的DCG值就没有办法来做对比。

  定义: NDCG=\frac{DCG}{IDCG}

IDCG(ideal DCG),就是理想的DCG。IDCG如何计算?首先要拿到搜索的结果,人工对这些结果进行排序,排到最好的状态后,算出这个排列下本query的DCG,就是IDCG。

  因为NDCG是一个相对比值,那么不同的query之间就可以通过比较NDCCG来决定哪个query的排序比较好。

  例子中,理想的排序应该是3 、3 、2 、2 、1,那么IDCG=3+3+1.26+1+0.43=8.69

  NDCG=DCG/IDCG=7.62/8.69=0.88,从NDCG这个值可以看出目前算法存在的优化空间。

 

相关资料:https://blog.csdn.net/manduner/article/details/91040867?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~first_rank_v2~rank_v25-5-91040867.nonecase&utm_term=%E6%8E%A8%E8%8D%90%E7%AE%97%E6%B3%95%E8%AF%84%E4%BB%B7%E6%8C%87%E6%A0%87ndgc%E4%B8%BE%E4%BE%8B

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值