信息检索中的度量precison@k,recall@k,f1@k,MRR,ap,map,CG, DCG,NDCG

本文深入探讨了信息检索中的评估指标,包括排序不感知的度量如Precision@k、Recall@k和F1@k,以及排序感知的度量如Mean Reciprocal Rank (MRR)、Average Precision (AP)、Mean Average Precision (MAP)。此外,还介绍了针对分级相关性的Cumulative Gain (CG)、Discounted Cumulative Gain (DCG)和Normalized Discounted Cumulative Gain (NDCG),详述了它们如何衡量排序模型的性能和结果的相关性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:信息检索中度量指标全解析

导读

由浅入深逐个解析信息检索中的度量指标。

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

中文名英文名总结排序感知相关性分数
准确度accuracy并不是评估检索系统的最佳选择。在大型知识库中,对于任何给定查询大多数文档通常都是不相关的,这可能导致准确率呈现误导性的高值。
精确度precision@k它的局限性在于k值的选择可能带有主观性,且该指标不考虑k之外的结果
召回率recall@k需要预先知道知识库中相关文档的总数。在大规模系统中这可能是一个挑战
F1F1@k总结
平均倒数排名(Mean Reciprocal Rank)MRR只是第一个正确的相关结果的倒数并不关心剩余的相关结果的位置
平均精确率均值(Mean Average Precision)MAP它考虑所有相关的项目
累积收益Cumulative GainCG@k仅计算累积相关性分数
折损累积增益 Discounted Cumulative GainDCG@k较上面考虑到了排序
归一化折损累积增益 Normalized Discounted Cumulative GainNDCG@k允许跨查询比较DCG,使结果可比较

文档相关性判定

大多数讨论的指标都涉及"相关"文档的概念。确定文档相关性的最直接方法是通过人工评估。通常由领域专家审查文档并判定其相关性。
为减少个人偏见,这种评估往往由专家小组而非个人完成。
但是从规模和成本的角度考虑,人工评估存在局限性。因此任何能可靠建立相关性的数据都变得极为宝贵。
在这一背景下,基准事实(Ground Truth)指的是已知真实或正确的信息。
在RAG和生成式AI领域,基准事实通常表现为一组预先准备的提示-上下文-响应或问题-上下文-响应示例,类似于监督学习中的标记数据。为知识库创建的基准事实数据可用于RAG系统的评估和优化。

问题1:二元相关性

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

A. 排序不感知的度量

1. 准确率(Accuracy)

准确率在信息检索领域通常定义为正确预测(包括真阳性和真阴性)占总样本的比例。这一概念源自监督学习中的分类问题,但在检索和RAG语境下有其特定解释:
准确率 = (检索到的相关文档数 + 未检索到的不相关文档数) / 知识库中总文档数
尽管准确率是一个直观的指标,但它并不是评估检索系统的最佳选择。在大型知识库中,对于任何给定查询大多数文档通常都是不相关的,这可能导致准确率呈现误导性的高值。此外该指标并不考虑检索结果的排序质量

2. 精确率(Precision)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是相同的。
Precision@k在比较不同系统的检索性能时特别有用,尤其是当系统间检索的总文档数可能不同时。但是它的局限性在于k值的选择可能带有主观性,且该指标不考虑k之外的结果

3. 召回率(Recall)Recall@k

这个度量给出了查询的所有实际相关结果中在所有的实际的相关结果中的比例。在数学上:
在这里插入图片描述
与精确率不同召回率的计算需要预先知道知识库中相关文档的总数。在大规模系统中这可能是一个挑战。召回率同样不考虑检索文档的排序。理论上检索所有文档可以获得完美的召回率,但这显然不符合实际需求

对于我们的例子,recall@1 = 0.33,因为只存在3个实际相关项中的一个。
类似地,由于3个实际相关的项中只有2个项存在,故recall@3 = 0.67。
我们可以计算不同K值的召回分数。
在这里插入图片描述

4. F1分数 F1@k

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

F1分数的特点是当精确率或召回率任一指标较低时,分数会受到显著影响。只有当两个指标都较高时,F1分数才会较高。这种特性使得F1分数不会被单一指标的高值所误导。

利用前面计算的precision和recall的值,我们可以计算不同K值的F1-scores,如下图所示。
在这里插入图片描述

B. 排序感知的度量

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

1. 平均倒数排名(Mean Reciprocal Rank, MRR)

当我们希望系统返回最佳相关项并希望该项位于较高位置时,这个度量是有用的。
在数学上:在这里插入图片描述
其中:
‖Q‖表示查询的总数
ranki表示第一个相关结果的排序
为了计算MRR,我们首先计算排序倒数。它只是第一个正确的相关结果的倒数,值的范围从0到1。
对于多个不同的查询,我们可以通过对每个查询取倒数的平均值来计算MRR。
在这里插入图片描述
我们可以看到,MRR并不关心剩余的相关结果的位置。所以,如果你的例子需要以最好的方式返回多个相关的结果,MRR不是一个合适的度量。

2. 平均精确率均值(Mean Average Precision, MAP)

平均精度是衡量模型选择的所有与 ground-truth相关的项目是否都有较高的排序。与MRR不同,它考虑所有相关的项目。
数学上:
在这里插入图片描述
其中:
rel(k)是一个指示函数,当第k位的项有相关性时为1。
P(k)是Precision@k度量
对于我们的例子,我们可以根据不同K的Precision@K值计算AP。
在这里插入图片描述为了说明AP的优势,让我们以前面的例子为例,但将3个相关的结果放在开头。我们可以看到,这个例子比上面的例子获得了一个更好的AP分数。

如果我们想计算多个查询的平均精度,我们可以使用MAP。它只是所有查询的平均精度的平均值。数学上:
在这里插入图片描述其中:
Q是查询的总数
AP(q)是查询q的平均精度
在这里插入图片描述

问题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)

我们看到了一个简单的累积收益是如何不考虑位置的。但是,我们通常希望具有高相关性得分的项目出现在一个更好的排序位置上。
所以,我们需要一些方法来惩罚他们的位置。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分数,因为它是一个标准化分数

2.1 相关性分数是怎么得到的

  1. 人工标注(最准确,但成本高)
    众包平台(如Amazon MTurk、百度众测):人工评估员根据预设规则(如0-5分)对文档与查询的相关性打分。
    示例规则:
    5分:完美匹配,直接回答查询。
    3分:部分相关,需进一步阅读。
    0分:完全不相关。
    专家标注:由专业领域人员(如医学、法律)标注,质量高但成本高。
  2. 用户行为数据(间接反映相关性)
    点击率(CTR):假设用户点击的文档更相关(但可能受标题党干扰)。
    停留时间/滚动深度:用户长时间阅读或滚动到底,可能表示内容相关。
    转化行为:如电商平台中,用户最终购买的商品可视为高相关(分数=1)。
  3. 机器学习模型预测(自动化,需训练数据)
    特征工程:基于文本、用户、上下文等特征训练模型。
    文本特征:TF-IDF、BM25、语义向量(如BERT embedding)。
    用户特征:历史点击、搜索会话中的行为序列。
    上下文特征:时间、地理位置、设备类型。
    模型类型:
    Pointwise:直接预测相关性分数(如回归模型)。
    Pairwise:比较文档对的相对相关性(如RankSVM)。
    Listwise:优化整个排序列表(如LambdaMART)。
  4. 混合方法(实际系统常用)
    人工+模型:先用小样本人工标注训练模型,再扩展到全量数据。
    多源权重融合:
    最终分数 = α·人工标注分数 + β·用户行为分数 + γ·模型预测分数
    (α、β、γ通过A/B测试调整)。
    示例:搜索引擎中的相关性分数
    “感冒症状” “感冒的10种常见症状” 5 12% 0.9 0.8×5 + 0.2×0.9 = 4.18
    “感冒症状” “冬季流感预防指南” 2 8% 0.4 0.8×2 + 0.2×0.4 = 1.68

关键点
一致性:不同标注者的标准需统一(Kappa系数≥0.8)。
动态更新:用户行为数据需实时调整分数(如新闻搜索中时效性权重高)。
业务适配:电商中“购买”比“点击”更相关;问答系统中“精确答案”比“长文档”更相关。
根据场景选择合适方法,通常需要平衡准确性和可扩展性。

2.2 相关性分数的范围一般是

相关性分数的范围没有绝对统一的标准,但常见约定如下:

  1. 二元相关(最常用)
    范围:{0, 1}
    1:相关(如用户点击、购买、找到答案)
    0:不相关(如跳过、无互动)
    适用场景:大多数工业级排序系统(如Google、淘宝搜索),因为简单、易解释。
  2. 分级相关(人工标注或模型预测)
    范围:{0, 1, 2, 3, 4, 5}(或 {0, 1, 2, 3})
    示例:
    5:完美答案(如直接回答“北京人口是多少?”的网页)
    3:部分相关(需阅读全文)
    0:无关(如广告或错误主题)
    适用场景:需要细粒度评估的研究或高端搜索(如医学文献、法律数据库)。
  3. 连续值(模型输出概率)
    范围:[0, 1]
    由模型输出(如BERT分类器预测“相关概率为0.87”)。
    适用场景:需要平滑排序的机器学习系统(如推荐算法)。
  4. 自定义业务规则
    电商示例:
    分数 = 购买权重×1 + 加购权重×0.7 + 点击权重×0.3
    范围可能为 [0, 100] 或任意实数。

关键总结
工业界默认:{0, 1}(二元相关),除非业务需要更细粒度。
计算公式适配:
若用标准DCG公式 Σ (relᵢ / log₂(i+1)),relᵢ 可以是任意正数(如 3, 2, 0)。
若用 Σ (2^{relᵢ} - 1) / log₂(i+1),relᵢ 通常设为 0~5 的整数(避免指数爆炸)。
一句话:0/1最简单,0~5最通用,[0,1]概率最平滑,根据场景和标注成本选择。

3 评估检索排序系统可以用什么包

在 Python 中,计算排序评估指标(如 NDCG、MAP、MRR、Precision@K、Recall@K 等)可以使用以下常用包:

✅ 1. 轻量级工具(无需安装额外库)
手写实现(基于 NumPy)
适用于快速测试或小规模数据,代码示例:

import numpy as np

def dcg_at_k(r, k):
    r = np.asfarray(r)[:k]
    return np.sum(r / np.log2(np.arange(2, r.size + 2)))

def ndcg_at_k(r, k):
    dcg_max = dcg_at_k(sorted(r, reverse=True), k)
    return dcg_at_k(r, k) / dcg_max if dcg_max else 0.0
👉 来源:CSDN 示例 

✅ 2. 专用排序/推荐系统库

库名支持指标安装方式特点
rankevalNDCG、MAP、MRR、P@K、R@Kpip install rankeval专为信息检索设计,支持多查询批量计算
ir-measuresNDCG、MAP、MRR、P@K、R@K、Bprefpip install ir-measures支持标准 TREC 格式,兼容 PyTerrier、OpenNIR 等框架
pytrec_evalNDCG、MAP、MRR 等pip install pytrec_evalPython 封装 TREC 官方评估工具,速度快

✅ 3. 推荐系统/深度学习框架内置

框架支持指标示例
torch-rechubNDCG@K、MRR、Recall@K、Precision@K、GAUC 等from torch_rechub.basic.metric import ndcg_score
PyTorch Lightning / torchmetricsRetrievalMRR, RetrievalMAP, RetrievalNormalizedDCGfrom torchmetrics.retrieval import RetrievalNDCG

✅ 4. Scikit-learn(多标签排序)
支持标签排序相关指标:dcg_score

from sklearn.metrics import label_ranking_average_precision_score, coverage_error
适用于多标签分类场景 。

✅ 5. 推荐系统实战工具包
RecBole(推荐系统库)
内置 NDCG@K、MAP@K、MRR@K、HR@K 等,支持自动计算:

from recbole.evaluator import Evaluator

📌 总结:按场景选择

场景推荐库
快速原型/教学NumPy 手写实现
信息检索研究ir-measures, pytrec_eval
推荐系统开发torch-rechub, RecBole, PyTorch Lightning
多标签分类scikit-learn
from evidently.metrics import PrecisionTopKMetric
from evidently.report import Report
import pandas as pd
# 构造推荐结果和真实标签
current_data = pd.DataFrame({
    'user_id': [1, 1, 2, 2],
    'predicted': [[101, 102, 103], [104, 105], [201, 202], [203, 204]],
    'actual': [[101, 106], [105], [202, 203], [204, 205]]
})
# 创建报告
report = Report(metrics=[
    PrecisionTopKMetric(k=3)
])
report.run(current_data=current_data, reference_data=None)
report.save_html("precision_report.html")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值