信息检索度量指标(MAP@N, P@N)

news2024/11/26 16:47:51

我们今天遇到的大多数软件产品都集成了某种形式的搜索功能。我们在谷歌上搜索内容,在YouTube上搜索视频,在亚马逊上搜索产品,在Slack上搜索信息,在Gmail上搜索邮件,在Facebook上搜索人等等。

图片

作为用户,工作流非常简单。我们可以通过在搜索框中写下我们的查询来搜索条目,系统中的排名模型会给我们最相关的前n个结果。

我们如何评估前n个结果有多好?

在这篇文章中,我将解释学习中常用的离线度量来回答上述问题。这些指标不仅对评估搜索结果有用,而且对关键字提取和推荐等问题也有用。

问题1:二元相关性

让我们通过一个简单的玩具例子来理解各种评估指标的细节和权衡。我们有一个排序模型,它会为一个特定的查询返回5个最相关的结果。根据我们的ground-truth,第一个、第三个和第五个结果是相关的。

图片

让我们看看评估这个简单例子的各种指标。

A. 排序不感知的度量

1. Precision@k

这个指标量化了排名前k的结果中有多少项是相关的。在数学上,由下式给出:

图片

对于我们的例子,precision@1 = 1,因为前1结果中的所有项都是相关的。

图片

同样,precision@2 = 0.5,因为前2个结果中只有一个是相关的。

图片

我们可以计算出所有k值的precision分数。

图片

precision@k的一个限制是它没有考虑相关的项目的位置。考虑具有相同数量相关结果的两个模型A和B,即5个中的3个。对于模型A,前三项是相关的,而对于模型B,后三项是相关的。尽管模型A更好,但对于这两个模型,Precision@5是相同的。

图片

2. Recall@k

这个度量给出了查询的所有实际相关结果中在所有的实际的相关结果中的比例。在数学上:

图片

对于我们的例子,recall@1 = 0.33,因为只存在3个实际相关项中的一个。

图片

类似地,由于3个实际相关的项中只有2个项存在,故recall@3 = 0.67。

图片

我们可以计算不同K值的召回分数。

图片

3. F1@k

这是一个组合度量,通过取它们的调和平均值,将Precision@k和Recall@k结合在一起。我们可以这样计算:

图片

利用前面计算的precision和recall的值,我们可以计算不同K值的F1-scores,如下图所示。

图片

B. 排序感知的度量

虽然precision、recall和F1为我们提供了一个单值度量,但它们不考虑返回的搜索结果的顺序。为了解决这一局限性,人们设计了以下排序感知的度量标准:

1. Mean Reciprocal Rank(MRR)

当我们希望系统返回最佳相关项并希望该项位于较高位置时,这个度量是有用的。

在数学上:

图片

其中:

  • ‖Q‖表示查询的总数

  • ranki表示第一个相关结果的排序

为了计算MRR,我们首先计算排序倒数。它只是第一个正确的相关结果的倒数,值的范围从0到1。

在我们的例子中,由于第一个正确的项目位于1的位置,所以1的倒数为1。

图片

让我们看另一个例子,其中只有一个相关结果出现在列表的最后,即位置5。它的倒数得分更低,为0.2。

图片

让我们考虑另一个例子,其中返回的结果都不相关。在这种情况下,倒数为0。

图片

对于多个不同的查询,我们可以通过对每个查询取倒数的平均值来计算MRR。

图片

我们可以看到,MRR并不关心剩余的相关结果的位置。所以,如果你的例子需要以最好的方式返回多个相关的结果,MRR不是一个合适的度量。

2. Average Precision(AP)

平均精度是衡量模型选择的所有与 ground-truth相关的项目是否都有较高的排序。与MRR不同,它考虑所有相关的项目。

数学上:

图片

其中:

  • rel(k)是一个指示函数,当第k位的项有相关性时为1。

  • P(k)是Precision@k度量

对于我们的例子,我们可以根据不同K的Precision@K值计算AP。

图片

图片

为了说明AP的优势,让我们以前面的例子为例,但将3个相关的结果放在开头。我们可以看到,这个例子比上面的例子获得了一个更好的AP分数。

图片

图片

3. Mean Average Precision(MAP)

如果我们想计算多个查询的平均精度,我们可以使用MAP。它只是所有查询的平均精度的平均值。数学上:

图片

其中:

  • Q是查询的总数

  • AP(q)是查询q的平均精度

python原代码实现 

def average_precision(true_labels, predicted_scores):
    sorted_results = [(true, score) for true, score in
                      sorted(zip(true_labels, predicted_scores), key=lambda x: x[1], reverse=True)]
    num_true = sum(true_labels)

    precision_at_k = []
    true_positives = 0

    for i, (true, score) in enumerate(sorted_results):
        if true == 1:
            true_positives += 1
            precision_at_k.append(true_positives / (i + 1))

    if not precision_at_k:
        return 0.0

    return sum(precision_at_k) / num_true


def map_at_k(true_labels, predicted_scores, k):
    average_precisions = []

    for i in range(len(true_labels)):
        ap = average_precision(true_labels[i][:k], predicted_scores[i][:k])
        average_precisions.append(ap)

    return sum(average_precisions) / len(average_precisions)


# 示例数据,真实标签和模型的预测分数(多个查询)
true_labels = [[1, 0, 1, 1, 0, 0, 1, 1, 0, 0], [0, 1, 1, 0, 1, 0, 0, 1, 1, 0]]
predicted_scores = [[0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0],
                    [0.9, 0.8, 0.5, 0.4, 0.8, 0.2, 0.1, 0.9, 0.3, 0.0]]

# 计算平均精确度(Average Precision)
average_precision_1 = average_precision(true_labels[0], predicted_scores[0])
average_precision_2 = average_precision(true_labels[1], predicted_scores[1])

print("Average Precision 1:", average_precision_1)
print("Average Precision 2:", average_precision_2)

# 计算MAP@k
k = 5
map_at_k= map_at_k(true_labels, predicted_scores, k)
# map_at_k_2 = map_at_k(true_labels[1], predicted_scores[1], k)

print(f"MAP@{k}:", map_at_k)

使用sklearn实现

from sklearn.metrics import average_precision_score

# 示例数据,真实标签和模型的预测分数
true_labels = [1, 0, 1, 1, 0, 0, 1, 1, 0, 0]
predicted_scores = [0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1, 0.0]

# 计算平均精确度(Average Precision)
average_precision = average_precision_score(true_labels, predicted_scores)

print("Average Precision:", average_precision)

问题2: 分等级的相关性

让我们以另一个玩具例子为例,其中我们不仅标注了相关或不相关的项目,而是使用了0到5之间的评分标准,其中0表示相关性最低,5表示相关性最高。

图片

我们有一个排序模型,它会为一个特定的查询返回5个最相关的结果。根据我们的ground-truth,第一项的相关性得分为3,第二项的相关性得分为2,以此类推。

图片

让我们了解评估这种类型的各种度量。

1. Cumulative Gain (CG@k)

这个度量使用了一个简单的概念来总结top-K条目的相关性分数。这个总分数称为累积收益。在数学上:

图片

对于我们的例子,CG@2是5,因为我们将前两个相关性得分3和2相加。

图片

同理,我们可以计算所有k值的累积收益:

图片

虽然很简单,但CG并没有考虑到相关项目的顺序。因此,即使我们将一个不太相关的项交换到第一个位置,CG@2也是一样的。

图片

2. Discounted Cumulative Gain (DCG@k)

我们看到了一个简单的累积收益是如何不考虑位置的。但是,我们通常希望具有高相关性得分的项目出现在一个更好的排序位置上。

考虑下面的一个例子。在累积收益的情况下,我们只是简单地将分数相加,而没有考虑它们的位置。

图片

一个物品在位置1上,相关分数为3要比相同的物品在位置2上相关分数为3要好。

所以,我们需要一些方法来惩罚他们的位置。DCG引入了一个基于对数的惩罚函数来降低每个位置的相关性得分。对于5个项,惩罚是:

图片

使用这个惩罚,我们现在可以计算折扣累积收益,只需使用惩罚标准化过后的相关分数的总和。在数学上:

图片

为了理解对数惩罚的行为,让我们在x轴上绘制排名位置,在y轴上绘制相关性得分的百分比,即

图片

。正如所看到的,在位置1,我们不施加任何惩罚,分数保持不变。但是,分数的百分比指数递减从第1位的100%到第2位的63%,第3位的50%,以此类推。

图片

现在为我们的例子计算DCG。

图片

图片

基于这些惩罚过的分数,我们现在可以计算不同k值下的DCG,只需将它们加起来。

图片

对于DCG@K还有一种替代公式,如果相关的条目排名较低,那么惩罚就会更多。该方案在工业上更受青睐。

图片

虽然DCG解决了累积收益的问题,但它有一定的局限性。假设查询Q1有3个结果,查询Q2有5个结果。那么有5个结果Q2的查询将会有一个更大的总体DCG分数。但我们不能说问题2比问题1好。

图片

3. Normalized Discounted Cumulative Gain (NDCG@k)

为了允许跨查询比较DCG,我们可以使用NDCG,它使用相关项的理想顺序来规范化DCG值。让我们以之前的例子为例,我们已经计算了不同K值下的DCG值。

图片

图片

对于我们的例子,理想情况下,我们希望条目按照相关性得分的降序排序。

图片

我们来计算这个排序下的理想的DCG(IDCG)。

图片

现在,我们可以计算不同k的NDCG@k,通过对DCG@k除以 IDCG@k:

图片

图片

因此,我们得到的NDCG分数的范围在0到1之间。一个完美的排名会得到1分。我们还可以比较不同查询的NDCG@k分数,因为它是一个标准化分数。

总结

这篇文章中,我们了解了二元相关性和分级标签相关性的各种评估指标,以及每个指标如何改进之前的指标

英文原文:https://amitness.com/2020/08/information-retrieval-evaluation/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/980009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM+Vue的网上花店系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用Vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

【问题总结】 记 一次dockerFile构建报错

写在前面, 其实是一个比较摸不着脑袋的bug,记录一下解决的过程,作为备忘录 问题留档 1、场景描述 在尝试使用dockefile构建一个tomcat镜像,内容如下,构建正常通过,但是容器启动失败 FROM centos:7 MAINT…

【办公类-18-02】(Python)教师获奖证书批量打印(教师信息、获奖类型,公章)

背景需求: 同事提出给word批量“添加电子公章(png图片)的需求 解压文件后,发现: 1、每份WORD文件名是一位老师的证书,需要打开每一份word,插入一个空白电子公章png。 2、每个word文件名包含教…

Redis缓存的高并发问题

Redis 做缓存虽减轻了 DBMS 的压力,减小了 RT,但在高并发情况下也是可能会出现各 种问题的。 1 缓存穿透 当用户访问的数据既不在缓存也不在数据库中时,就会导致每个用户查询都会“穿透” 缓存“直抵”数据库。这种情况就称为缓存穿透。一个…

SSL证书系列--又拍云Let’s Encrypt免费DV SSL证书使用教程

原文网址:SSL证书系列--又拍云Let’s Encrypt免费DV SSL证书使用教程_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何使用又拍云部署Let’s Encrypt免费DV SSL证书。 一、了解Let’s Encrypt 了解和关注SSL证书的朋友,似乎没有理由不知道 Let’s Encr…

java八股文面试[数据库]——数据库锁的种类

数据库锁的种类 MySQL数据库由于其自身架构的特点,存在多种数据存储引擎, MySQL中不同的存储引擎支持不同的锁机制。 MyISAM和MEMORY存储引擎采用的表级锁, InnoDB存储引擎既支持行级锁,也支持表级锁,默认情况下采用行级锁。 BDB采用的是页…

开店星小程序上架教程和后台Request failed with status code 500[undefined]问题处理

开店星小程序上架教程和后台Request failed with status code 500[undefined]问题处理 刚刚安装好开店星网站后台之后都会出现这个code 500[undefined]的错误,需要改一下代码。改好了之后就可以正常使用了。如果大家不懂得这样处理的可以私聊我,帮忙处理…

kettle通过java步骤获取汉字首拼

kettle通过java步骤获取汉字首拼 用途描述 一组数据,需要获取汉字首拼后,输出; 实现效果 添加jar包 pinyin4j-2.5.0.jar 自定义常量数据 Java代码 完整代码: import net.sourceforge.pinyin4j.PinyinHelper; import net.sou…

高潮迭起:探寻Twitch上精彩纷呈的电子竞技赛事直播

Twitch是电子竞技赛事的热门直播平台之一,它为全球范围内的电子竞技比赛提供了广泛的覆盖和直播服务。以下是一些在Twitch上直播的电子竞技比赛和赛事的例子: League of Legends (英雄联盟) Twitch广泛直播英雄联盟的各个赛事,包括全球性的锦标赛如英雄联盟全球总决赛(World …

SLAM从入门到精通(基本框架)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 SLAM是机器人的一个分支。广义上来说,机器人还包括了计算机视觉、语音识别、自然语言处理、机械臂控制、运动控制、机器人导航、机器人…

软件架构师 设计和编码

软件架构师 设计和编码 目录概述需求: 设计思路实现思路分析1.设在设计软件架构时,您需要考虑以下方面:2.在编码方面,您需要具有以下技能: 参考资料和推荐阅读 Survive by day and develop by night. talk for import …

如何绘制英语思维导图?偷偷告诉你这个绘制方法

如何绘制英语思维导图?绘制英语思维导图可以帮助我们更好地理清思路,提高学习和工作效率。同时,英语思维导图还可以帮助我们提高英语表达能力和阅读理解能力,让我们更好地掌握英语学习和应用。因此,绘制英语思维导图是…

msvcr120.dll放在哪里?怎么修复msvcr120.dll文件

当您在运行某些应用程序或游戏时遇到“msvcr120.dll缺失”错误时,这可能会影响您的使用体验。msvcr120.dll是Microsoft Visual C Redistributable的一部分,并且它提供了程序运行所需的运行时支持,今天我们来讨论一下msvcr120.dl文件缺失了要怎…

[SSM]MyBatisPlus高级

四、高级篇 4.1主键策略 主键的作用就是唯一标识,我们可以通过这个唯一标识来定位到这条数据。对于表数据中的主键,我们可以自己设计生成规则,生成主键。但是在更多的场景中,没有特殊要求的话,我们每次自己手动生成的…

第 2 章 线性表(线性表的动态分配顺序存储结构实现)

1. 背景说明 线性表(linear Iist)是最常用且最简单的一种数据结构。简言之,一个线性表是 n 个数据元素的有限序列。 至于每个数据元素的具体含义,在不同的情况下各不相同,它可以是一个数或一个符号,也可以是一页书,甚…

千粉福利——— ubuntu安装

(一)配置虚拟机,首先打开虚拟机 点击创建新的虚拟机或者左上角文件->新建虚拟机,或者使用快捷键CtrlN,选择自定义安装 选择虚拟机就硬件兼容性,默认点击下一步就好 安装客户机操作系统:选择稍后安装操作…

tensorflow QAT

tensorflow qat https://www.wpgdadatong.com/tw/blog/detail/70672 在边缘运算的重点技术之中,除了简化复杂的模块构架,来简化参数量以提高运算速度的这项模块轻量化网络构架技术之外。另一项技术就是各家神经网络框架(TensorFlow、Pytorc…

Day7:浅谈useEffect

「目标」: 持续输出!每日分享关于web前端常见知识、面试题、性能优化、新技术等方面的内容。 Day7-今日话题 useEffect 是 React 中一个非常重要的 Hook,用于处理副作用和订阅外部数据源的变化。它可以在函数式组件中执行各种操作,例如数据获…

小程序如何上传微信聊天记录的文件

wx.chooseMessageFile({count: 10,type: image,success (res) {// tempFilePath可以作为img标签的src属性显示图片const tempFilePaths res.tempFiles} })参数说明 回调函数说明

数据库实现学生管理系统

1.QT将数据库分为三个层次: 1> 数据库驱动层:QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin 2> sql接口层:QSqlDatabase、QSqlQuery、QSqlRecord、QSqlError 3> 用户接口层:提供一些模型QSql…