信息检索中 (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=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.

  • 10
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于MRRMAPNDCG都是评估指标,需要根据具体的任务和数据集进行实现。以下是一些常见任务的评估指标实现示例: 1. 信息检索任务MRR实现: ```python def mean_reciprocal_rank(results, relevant_docs): for i, r in enumerate(results): if r in relevant_docs: return 1.0 / (i + 1) return 0.0 # 示例 relevant_docs = [1, 3, 5] results = [3, 4, 2, 1, 5] print(mean_reciprocal_rank(results, relevant_docs)) # 输出 0.3333 ``` 2. 信息检索任务MAP实现: ```python def average_precision(results, relevant_docs): precision = 0.0 num_relevant = 0 for i, r in enumerate(results): if r in relevant_docs: num_relevant += 1 precision += num_relevant / (i + 1) return precision / len(relevant_docs) def mean_average_precision(results_list, relevant_docs_list): map_score = 0.0 for results, relevant_docs in zip(results_list, relevant_docs_list): map_score += average_precision(results, relevant_docs) return map_score / len(results_list) # 示例 relevant_docs_list = [[1, 3, 5], [2, 4, 6], [3, 5, 7]] results_list = [[3, 4, 2, 1, 5], [3, 2, 4, 5, 1], [7, 6, 5, 4, 3]] print(mean_average_precision(results_list, relevant_docs_list)) # 输出 0.5 ``` 3. 推荐系统任务NDCG实现: ```python import numpy as np def ndcg(recommended_items, relevant_items, k): dcg = 0.0 idcg = np.sum(1.0 / np.log2(np.arange(2, k + 2))) for i, r in enumerate(recommended_items[:k]): if r in relevant_items: dcg += 1.0 / np.log2(i + 2) return dcg / idcg # 示例 recommended_items = [1, 2, 3, 4, 5] relevant_items = [1, 3, 5] print(ndcg(recommended_items, relevant_items, 5)) # 输出 0.6244 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值