本文实验探索了评价查询好坏的MAP,MRR,IDCG三种方式,从原理到代码以及使用方式做介绍,如果对您有帮助,欢迎点赞 : )

实验过程

实验数据分析:

qrels.txt:(标准查询与文档以及相关性 对照文档)

result.txt(本地查询方法结果):

Mean Average Precision (MAP)

对于寻返回一个排序的结果,其中有相关的(绿色),不相关(红色),Precision表示到当前rank之前的正确的所占的比例;

AP:平均精准率,将rank中正确的所对应Presion拿出来取平均值,得到这个query的AP;

MAP:对于所有query的ap求平均值,得到查询的平均精确度MAP;

def MAP_eval(qrels_dict,res_dict):APs=[]#每个query的APfor query in qrels_dict:#对于每个querytrue_ans=qrels_dict[query]#真实相关文档search_res=res_dict[query]#查询返回值accumulate_num=0#累计数量true_num=0#正确的个数per_rank=[]#一个query的返回中的Presionsfor doc in search_res:accumulate_num+=1if doc in true_ans:true_num+=1per_rank.append(float(true_num/accumulate_num))tsum=0#计算一个query的APtcnt=0for per_r in per_rank:tsum+=per_rtcnt+=1APs.append(float(tsum/tcnt))tsum=0#计算MAPtcnt=0for ap in APs:tsum+=aptcnt+=1ans=float(tsum/tcnt)return ans

Mean Reciprocal Rank (MRR):平均倒数排名

MRR概念

MRR得核心思想很简单:返回的结果集的优劣,跟第一个正确答案的位置有关,第一个正确答案越靠前,结果越好。具体来说:对于一个query,若第一个正确答案排在第n位,则MRR得分就是 1/n 。(如果没有正确答案,则得分为0)

MRR计算例子

假设现在有5个query语句,q1、q2、q3、q4、q5

q1的正确结果在第4位,q2和q3没有正确结果(即未检索到文档),q4正确结果在第5位,q5正确结果在第10位。

那么系统的得分就是1/4+0+0+1/5+1/10=0.55

最后MRR就是求平均,即该系统MRR=0.55/5=0.11

def MRR_eval(qrels_dict,res_dict):mrrs=[]#所有query的rrfor query in qrels_dict:true_docs=qrels_dict[query]#实际相关search_ans=res_dict[query]#查询返回结果acc_rank=0#累计rankfor per_doc in search_ans:acc_rank+=1if per_doc in true_docs:#找到正确的后记录返回mrrs.append(float(1/acc_rank))breaktsum=0.0#计算MRRtcnt=0for rr in mrrs:tsum+=rrtcnt+=1return float(tsum/tcnt)

Normalized Discounted Cumulative Gain (NDCG):(归一化折损累积增益)

Gain

表示每篇文档的重要性,对应0/1/2一个gain增益;也用rel表示;

CG:

累计增益,

表示到当前排名的所有文档的增益;

DCG:

返回的顺序也会对查询结果有影响,上面没有考虑位置因素,增加一个折损考虑位置:

NDCG:

查询结果容易受返回结果的长短的影响,返回的越长可能导致DCG越大,不同长度的query结果没有直接的比较意义,为了增加比较意义,更便于直接比较,引入归一化,按照全部的正确结果排在最前面且按照增益降序排列得到最优IDCG,然后将DCG/IDCG作为NDCG;

计算CG:

计算DCG:

计算IDCG:

得到的NDCG就可以在0–1之间;

其中公式:

def NDCG_eval(qrels_dict_rel,res_dict):#这里需要rel数值ndcgs=[]# print(qrels_dict_rel)for per_query in qrels_dict_rel.keys():true_ranks=qrels_dict_rel[per_query]#真正的相关文档和rel值为 dic#len_true=len(true_ranks)#算DCG的终止位置# print(true_ranks)sorted_true_ranks=sorted(true_ranks,reverse=True)# print(true_ranks)IDCG=0.0i=2IDCG+=int(true_ranks[sorted_true_ranks[0]])#初始值是否和DCG相同for per_item in sorted_true_ranks[1:]:gain=true_ranks[per_item]IDCG+=int(gain)/float(math.log(i,2))i+=1DCG=0.0i=2search_res=res_dict[per_query]if search_res[0] in true_ranks:#先判断在相关文档中DCG+=int(true_ranks[search_res[0]])for per_res in search_res[1:]:#算法的位置?1:lentrueif per_res in true_ranks.keys():DCG+=int(true_ranks[per_res])/float(math.log(i,2))i+=1# print(DCG/IDCG)ndcgs.append(DCG/IDCG)# tnum=0.0tsum=0.0for ndcg in ndcgs:# tnum+=1tsum+=ndcgreturn float(tsum)/len(ndcgs)

限定对前100返回结果进行评价:

def evaluate(k):#按照排名前100查询qrels_file="qrels.txt"res_file="result.txt"qrels_dict={}#所有的查询项正确结果qrels_dict_rel={}#查询项正确结果以及relres_dict={}#自己查询实际返回结果with open(qrels_file,"r") as f:#将真确结果填充for line in f:evals=line.strip().split(" ")if evals[0] not in qrels_dict:qrels_dict[evals[0]]=[]qrels_dict_rel[evals[0]]={}if int(evals[3])>0:#只保留真正只有rel>0才是相关项存储,后面不用判断rel为正qrels_dict[evals[0]].append(evals[2])qrels_dict_rel[evals[0]][evals[2]]=evals[3]# print(qrels_dict)with open(res_file,"r") as f:#将查询返回结果保存为{qiery:[d1,d2,...],q2:[d1,d2,...]}for line in f:item=line.strip().split(' ')if item[0] not in res_dict:res_dict[item[0]]=[]res_dict[item[0]].append(item[1])for key in res_dict.keys():res_dict[key]=res_dict[key][:k]# print("key:",key,"len_ans:",len(res_dict[key]))# print(res_dict,"----------")map_eval=MAP_eval(qrels_dict,res_dict)mrr_eval=MRR_eval(qrels_dict,res_dict)ndcg_eval=NDCG_eval(qrels_dict_rel,res_dict)print("map_eval:",map_eval,"\nmrr_eval:",mrr_eval,"\nndcg_eval:",ndcg_eval)

实验结果

上述没有限定在返回的前多少个中做评价,限定了在返回结果的前100中的结果:

实验总结

了解了几种评价查询系统优劣的方法,对于其中评判标准的不同有了进一步的认识;

其中结果MAP与NDCG结果相近,进一步探究两者:

MAP和NDCG这两种指标是位置敏感的评价指标,总体来说可以理解为:正确推荐的item在列表中越靠前,其贡献的推荐效果越大,反之,正确推荐的item在列表中越靠后,贡献的推荐效果越小。MAP和NDCG主要的区别在于,MAP考虑的时二元相关性(1和0),NDCG可以有多种相关性的比较,相关性可以按照程度有多种取值,类似于分类与回归的关系。

说明结果返回的rank trival效果较好;

MRR只关注返回结果的第一个项目;

评价

这三者都是有排序意义的度量指标;

MRR的优点

  • 该方法计算简单,解释简单。
  • 这种方法高度关注列表的第一个相关元素。它最适合有针对性的搜索,比如用户询问“对我来说最好的东西”。
  • 适用于已知项目搜索,如导航查询或寻找事实。

MRR的缺点

  • MRR指标不评估推荐项目列表的其余部分。它只关注列表中的第一个项目。
  • 它给出一个只有一个相关物品的列表。如果这是评估的目标,那找个度量指标是可以的。
  • 对于想要浏览相关物品列表的用户来说,这可能不是一个好的评估指标。用户的目标可能是比较多个相关物品。

MAP优点

  • 给出了一个代表精确度 — 召回率曲线下复杂区域的单一度量。这提供了每个列表的平均精度。
  • 处理列表推荐物品的自然排序。这与将检索项视为集合的度量标准形成了对比。
  • 这一指标能够给予发生在排序高的推荐名单中的错误更多的权重。相反,它对发生在推荐列表中较深位置的错误的权重较小。这符合在推荐列表的最前面显示尽可能多的相关条目的需要。

MAP缺点

  • 这个度量标准适用于二进制(相关/非相关)评级。然而,它不适合细粒度的数字评级。此度量无法从此信息中提取误差度量。
  • 对于细粒度的评分,例如从1星到5星的评分,评估首先需要对评分进行阈值,以产生二元相关性。一种选择是只考虑大于4的评级。由于人工阈值的存在,这在评估度量中引入了偏差。此外,我们正在丢弃那些精细的信息。这个信息是在4星和5星之间的差异评级,以及在不相关的项目的信息。1星评级真的和3星评级一样吗?

NDCG优点

  • NDCG的主要优势是它考虑到了分等级的相关性值。当它们在数据集中可用时,NDCG是一个很好的选择。
  • 与MAP度量相比,它在评估排名项目的位置方面做得很好。它适用于二元的相关/非相关场景。
  • 平滑的对数折现因子有一个很好的理论基础,该工作的作者表明,对于每一对显著不同的排名推荐系统,NDCG度量始终能够确定更好的一个。

NDCG缺点

  • NDCG在部分反馈方面有一些问题。当我们有不完整的评级时,就会发生这种情况。这是大多数推荐系统的情况。如果我们有完整的评级,就没有真正的任务去实现!在这种情况下,recsys系统所有者需要决定如何归罪于缺失的评级。将缺少的值设置为0将把它们标记为不相关的项。其他计算值(如用户的平均/中值)也可以帮助解决这个缺点。
  • 接下来,用户需要手动处理IDCG等于0的情况。当用户没有相关文档时,就会发生这种情况。这里的一个策略是也将NDCG设置为0。
    推荐系统,NDCG度量始终能够确定更好的一个。

NDCG缺点

  • NDCG在部分反馈方面有一些问题。当我们有不完整的评级时,就会发生这种情况。这是大多数推荐系统的情况。如果我们有完整的评级,就没有真正的任务去实现!在这种情况下,recsys系统所有者需要决定如何归罪于缺失的评级。将缺少的值设置为0将把它们标记为不相关的项。其他计算值(如用户的平均/中值)也可以帮助解决这个缺点。
  • 接下来,用户需要手动处理IDCG等于0的情况。当用户没有相关文档时,就会发生这种情况。这里的一个策略是也将NDCG设置为0。
  • 另一个问题是处理NDCG@K。recsys系统返回的排序列表的大小可以小于k。为了处理这个问题,我们可以考虑固定大小的结果集,并用最小分数填充较小的集合。

【信息检索】【评价】 IR Evaluation相关推荐

  1. Experiment3: IR Evaluation

    实验内容 实现以下指标评价,并对Experiment2的检索结果进行评价 Mean Average Precision (MAP) Mean Reciprocal Rank (MRR) Normali ...

  2. 信息检索中 (IR) 的评价指标: P@n, MAP, MRR, DCG, NDCG

    转载自: http://www.yongfeiyan.cn/post/md/3 P@n 前 n 个结果的准确度, P指的是Precision. 如果用 y i = 0 , 1 y_i=0,1 yi​= ...

  3. 关于信息检索评价TREC:session track 的说明

    Input. runID数据格式:topic+Q0+文档ID+rank+score+runID 1     Q0   clueweb09-enwp00-61-01138    999  -11.445 ...

  4. 信息检索IR评价中常见的评价指标-MAP\NDCG\ERR\P@10等

    信息检索评价是对信息检索系统性能(主要满足用户信息需求的能力)进行评估的活动.通过评估可以评价不同技术的优劣,不同因素对系统的影响,从而促进本领域研究水平的不断提高.信息检索系统的目标是较少消耗情况下 ...

  5. 信息检索导论第八章-信息检索的评价

    第八章 信息检索的评价 1. 无序检索结果集合的评价 如何度量系统的效果?信息检索中最常用的两个指标是正确率和召回率. 正确率(Precision,简记为P): 返回的结果中相关文档所占的比例 Pre ...

  6. Image captioning评价方法之BLEU (bilingual evaluation understudy)

    文章地址:BLEU: a Method for Automatic Evaluation of Machine Translation 代码地址(非官方):https://github.com/tyl ...

  7. 阅读笔记 | Code to Comment “Translation”:Data, Metrics, Baselining Evaluation

    摘要 最早的代码摘要自动生成方法是建立在[strong syntac-tic theories of comment-structures]之上的,并且依赖于文本模板.近年来,研究人员已经将深度学习方 ...

  8. Item Tagging for Information Retrieval: A Tripartite Graph Neural Network based Approach 用于信息检索的项目标签

    文章目录 摘要 简介 Tagging 方法 动机和总览 动机 总览 TagGNN-IT 节点表示 TagGNN-IT Propagation 损失 2.3 TagGNN-QI 2.3.1 边表示 2. ...

  9. 自然语言处理总复习(十一)—— 信息检索

    自然语言处理总复习(十一)-- 信息检索 一.概述 1. 概念 2. IR系统的体系结构 (1)系统要素 (2)Web搜索 3. IR的历史 4. IR的困难 5. IR相关领域 6. 主要的搜索引擎 ...

  10. 【CIPS 2016】(11-12章)信息检索、信息推荐与过滤 (研究进展、现状趋势)

    CIPS 2016 笔记整理 <中文信息处理发展报告(2016)>是中国中文信息学会召集专家对本领域学科方向和前沿技术的一次梳理,官方定位是深度科普,旨在向政府.企业.媒体等对中文 信息处 ...

最新文章

  1. 单片机向左,嵌入式向右
  2. 像淘宝、京东这样的大型电商网站服务器构架完全部署解决方案
  3. Learning to Rank 中Listwise关于ListNet算法讲解及实现
  4. SpringBoot中使用thymeleaf的trim方法进行判断字符串是否相等
  5. 控件注册 - 利用资源文件将dll、ocx打包进exe文件(转)
  6. 蚂蚁金服 TRaaS 技术风险防控平台解密
  7. 51单片机产生1Hz-5kHz可调占空比方波
  8. 希尔排序和归并排序(java实现)
  9. C++面试高频考点整理--基础
  10. 如何使用Magoshare Data Recovery在mac上恢复找回删除的丢失文件?
  11. 装机大师无法发现linux硬盘,进入pe系统找不到硬盘的解决办法
  12. 八月流火,谁是京东数科最燃的研发人?
  13. 2012年最受欢迎低价优质美国虚拟主机TOP5
  14. C++桌面小精灵:实现像Office助手一样的帮助精灵
  15. strtoupper php 中文,strtoupper来导致中文乱码么
  16. html中表格行删除的方法,HTML删除表格行中的空格
  17. 计算机上根号5怎么打,根号怎么打(5种快速输入√与×号的方法)
  18. Redis设计与实现详解二:Redis数据库实现
  19. ABB机器人随机物料抓取优化升级
  20. 【idea】idea使用

热门文章

  1. MTK Battery系统
  2. android分享到人人网,人人网Android客户端体验
  3. 基于华三交换机,限制其他网段的IP访问
  4. 2010年广州市公务员考试行测真题及答案解析
  5. 概率论由相关性求数学期望和方差的公式_概率论笔记2--离散随机变量、数学期望和方差...
  6. android 图片虚化代码,Android模糊图片技术
  7. 【错误】E45: ‘readonly‘ option is set (add to override)
  8. 永洪报表工具_2020年度10大BI工具排行榜
  9. 狮子座与摩羯座 ---转载
  10. office转pdf(在线预览)思路(java示例)