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

本文详细介绍了信息检索领域的关键评估指标,包括精确率(Precision)、平均精确率(Average Precision, AP)、平均平均精确率(Mean Average Precision, MAP)、平均倒数排名(Mean Reciprocal Rank, MRR)及归一化折减累积增益(Normalized Discounted Cumulative Gain, NDCG),并阐述了它们的计算方法和应用场景。

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

转载自: http://www.yongfeiyan.cn/post/md/3

P@n

前 n 个结果的准确度, P指的是Precision. 如果用 y i = 0 , 1 y_i=0,1 yi=0,1分别表示第 i 个结果相关、不相关, 则
P @ n = 1 n ∑ i = 1 n y i P@n = \frac{1}{n} \sum_{i=1}^ny_i P@n=n1i=1nyi
在评测系统的 P@n 时, 对每个查询的结果计算P@n, 取这些值的平均值作为系统的P@n.
参考:

MAP

Average Precision(AP): P@n的一个平均, 计算方式如下:
A P = 1 R ∑ r = 1 R P @ r AP = \frac{1}{R} \sum_{r=1}^RP@r AP=R1r=1RP@r
其中R是预定义的. 在评测系统的AP时, 对每个查询的结果计算AP, 取这些值的平均值作为系统的AP.

Mean Average Precision (MAP): 在评价一个系统的性能, 有时会用不同主题的查询进行检索, 评价系统的整体性能. 在第t类查询, 系统的AP记作 A P i AP_i APi的话, MAP计算方式如下:
M A P = 1 T ∑ t = 1 A P i MAP = \frac{1}{T} \sum_{t=1}^AP_i MAP=T1t=1APi
参考

MRR

Mean Reciprocal Rank (MRR). 对每个查询 q i q_i qi, 记它第一个相关的结果排在位置 k i k_i ki, 即rank为 k i k_i ki, 则Reciprocal Rank(RR)得分计作 1 / k i 1 / k_i 1/ki.
对所有query的RR取平均, 即为MRR:
M R R = 1 N ∑ i 1 / k i MRR = \frac{1}{N}\sum_i 1/ k_i MRR=N1i1/ki

DCG和NDCG

Discounted Cumulative Gain (DCG): 指的, Cumulative为将所有的结果累加起来, Discounted指给排在后面的结果加一个折扣系数, 排序位置越考后, 折扣系数越小.
DCG@N的计算方式如下
D C G @ N = ∑ i = 1 N r i ∗ D i DCG@N = \sum_{i=1}^N r_i * D_i DCG@N=i=1NriDi
其中 r i r_i ri指每条结果的收益(Gain), D i D_i Di指折扣系数, 排序位置越考后, 折扣系数越小, 常用的是 1 / l o g ( 1 + i ) 1 / log(1 + i) 1/log(1+i).
一种常用的形式如下:
D C G @ N = ∑ i = 1 N 2 r e l i − 1 log ⁡ ( i + 1 ) DCG@N = \sum_{i=1}^N \frac{2^{rel_i} - 1} {\log (i + 1)} DCG@N=i=1Nlog(i+1)2reli1

Normalized Discounted Cumulative Gain (NDCG): 对于不同query, DCG的量级可能不同, 比如一个query对应的文档相关性都较差, 另一个query对应的文档都很好, 这样评价指标就会偏向第二个query. Normalized指将一个query对应的文档所有排序中最大的DCG求出来, 不妨计作 I D C G @ N IDCG@N IDCG@N, 则
N D C G @ N = D C G @ N / I D C G @ N NDCG@N = DCG@N / IDCG@N NDCG@N=DCG@N/IDCG@N
举例来说, query下有4个文档, 相关性分别为1 2 3 0. 则最好的排序是 3 2 1 0, 在这种排序情况下计算出来的DCG就是IDCG.

### 关于二分类评估指标P@k、MAPMRR的解释 #### P@k (Precision at k) 对于给定查询,返回的结果列表中前$k$项里有多少是相关的。具体来说,在推荐系统或搜索引擎中,如果用户可能只查看前几个结果,则此度量非常重要。 $$ \text{P}@k = \frac{\sum_{i=1}^{k}\mathbb{I}(r_i)} {min(k, R)}, $$ 其中$\mathbb{I}$是一个指示函数,当第$i$个文档相关时取值为1;否则为0;而$R$表示实际存在的正样本总数[^1]。 ```python def precision_at_k(relevant_items, retrieved_items, k): relevant_and_retrieved = set(relevant_items).intersection(set(retrieved_items[:k])) return len(relevant_and_retrieved) / min(len(retrieved_items), k) ``` #### MAP (Mean Average Precision) 平均精度均值衡量的是在整个排名列表上的表现情况。它考虑到了所有位置上正确检索到的相关项目,并给予早期找到更多权重。对于每个查询$q$: $$ AP(q)=\frac {\sum _{{n}}(precision(n)\cdot rel(n))}{number\_of\_relevant\_documents}, $$ 最终通过求解多个查询下的AP值得到整体性能评价标准——即MAP: $$ MAP=\frac {{\sum }_{{q}}AP(q)}{|Q|}. $$ 这里$n$代表排序后的索引编号,$rel()$判断该条目是否属于目标类别[^2]。 ```python import numpy as np def mean_average_precision(actuals, predictions): ap_scores = [] for actual, prediction in zip(actuals, predictions): sorted_indices = np.argsort(prediction)[::-1] true_positives = 0 precisions_sum = 0 for i, idx in enumerate(sorted_indices): if actual[idx]: true_positives += 1 precisions_sum += true_positives / (i + 1) if sum(actual) != 0: ap_scores.append(precisions_sum / sum(actual)) return np.mean(ap_scores) ``` #### MRR (Mean Reciprocal Rank) 倒数第一命中率用于测量首次遇到正确答案的位置。假设有一个查询集$Q$以及对应的第一个正确响应$r_q$所在位次${rank}_q$,那么可以定义如下公式来计算整个系统的MRR得分: $$ MRR(Q)=\frac {1}{|Q|}\sum _{{q∈Q}}{\frac {1}{{rank}_{q}}}.$$ 这意味着越早给出准确答复越好,因为分母会更小从而使得分数更高[^3]。 ```python def reciprocal_rank(true_item, ranked_list): try: rank = ranked_list.index(true_item) + 1 return 1.0 / rank except ValueError: return 0.0 def mean_reciprocal_rank(ranked_lists, correct_items): rr_values = [reciprocal_rank(item, lst) for item, lst in zip(correct_items, ranked_lists)] return sum(rr_values)/len(rr_values) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值