推荐系统排序(Rank)评价指标总结

本文详细介绍了信息检索领域中常见的评估指标,包括Mean Average Precision (MAP)、Mean Reciprocal Rank (MRR)、Normalized Discounted Cumulative Gain (nDCG)以及Kendall tau distance等,并通过实例说明了这些指标的计算方法。

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

1.Mean Average Precision (MAP)

AP=nij=1P(j).yi,jnij=1yi,j
其中,
yi,j:排序中第j个元素对于查询i是否是相关的;相关为1,不相关为0。
P(j)=k:πi(k)πi(j)y(i,k)πi(j)
其中,
πi(j)为j的排序位置。

例如,
rank_no    是否相关
1        1
2        0
3        1
4        0
5        1
6        0
则根据AP计算公式:
AP = (1*1 + (1/2) *0+ (2/3)*1 + (2/4)*0 + (3/5)*0 + (3/6)*0) /3 = …

举例,第一项,P(1) = 它前面的项(包括自己)相关的个数除所在排序的位置(也就是1)。第一位及前面(前面没有)相关的个数就是它本身,所以P()的分子就是1,分母也是1.所以取值为1。同时y值为1.最终的对应AP中的项就是1
其他以此类推。
AP的最大值为1(也就是当相关的全部排在不相关的前面的时候)
MAP就是对所有query的AP求平均。

2.Mean Reciprocal Rank (MRR)

这里写图片描述
其中|Q|是查询个数,ranki是第i个查询,第一个相关的结果所在的排列位置。
举例:
这里写图片描述
对于三个查询,每个查询的ranki分别为3、2、1。所以,
MRR=1/3(1/3+1/2+1/1)
(参考自Wikipedia)

3.NDCG

首先是DCG的定义:
这里写图片描述

其中,
reli为排在第i个位置的物品实际的评价分值(也就是和查询相关的程度)
举例:
这里写图片描述
所以:
这里写图片描述

理想的DCG,也就是排序是最理想的情况(3,3,2,2,1,0):
这里写图片描述

最终的NDCG为:
这里写图片描述
(参考自Wikipedia)
以上是信息检索中常用的nDCG指标。考虑推荐中(二值评分–0,1)的情况。参考文献【1】中,给出了更适合的描述(实际定义都是一样。只是上面描述时,评分是连续的分值;而【1】中的描述考虑的是[0,1]分值):
这里写图片描述

4.Kendall tau distance

也就是两个排序间,评价存在分歧的对的数量。具体定义如下:
这里写图片描述
其中,τ1(i)τ2(i)分别为元素i在两个排序中的序位
如果两个排序完全一样。则Kendall tau distance位0。否则,如果两个排序完全相反,则为n(n1)/2
通常 Kendall tau distance都会通过除以n(n1)/2来归一化。

举例:
这里写图片描述

这里写图片描述

从中可以看出有4个元素对在两个排序中存在分歧。所以归一化后的Kendall tau distance为:
这里写图片描述
(参考自Wikipedia)
此外,参考文献【1】中也有这个指标的介绍。略有不同,下面直接截取供大家参考:
这里写图片描述
5、Spearman’s ρ (斯皮尔曼的ρ)[1]
基本思想类似Kendall tau distance:比较两个排序(通常一个是理想排序)的(排序值的)皮尔逊相关系数。
比如在推荐中,一个推荐排序列表采用物品实际的评分值(用户实际的偏好程度) 排序。一个是你的模型对物品的实际排序。si,j表示你模型预测中,物品j在用户i的推荐列表上的排序位置;yi,j表示按实际用户i对物品的评分来排序时物品j在i的推荐列表上的排序位置。s¯ 表示si,j的平均值;y¯ 表示yi,j的平均值.。则:
这里写图片描述
其中Ωtest为测试集

更多参考文献:
【1】 Statistical Methods for Recommender Systems

<think>好的,用户需要推荐系统算法评价指标的代码实现,使用Python或其他语言的示例。首先,我需要确定常见的评价指标有哪些,比如准确率、召回率、F1值、RMSE、MAE、AUC、NDCG等。然后,我得回忆这些指标的计算方法,并考虑如何在代码中实现。 接下来,用户可能希望看到具体的代码示例,所以我要选择几个关键指标来展示。比如,准确率和召回率适用于分类问题,而RMSE和MAE适用于评分预测。AUC和NDCG可能更复杂一些,但也是推荐系统中常用的指标。 然后,我需要检查这些指标的实现是否正确。例如,准确率是正确推荐数除以总推荐数,召回率是正确推荐数除以用户实际喜欢的项目数。对于RMSE,需要计算预测评分与实际评分之间的均方根误差。MAE则是平均绝对误差。 对于AUC,可能需要计算ROC曲线下的面积,可以通过sklearn库中的函数来实现。而NDCG则需要考虑排名位置和折扣因子,需要逐步计算每个位置的折损累计增益,再归一化处理。 还要考虑用户可能需要不同语言的代码,但Python是最常用的,所以优先提供Python示例,并提到其他语言如Java或R的实现可能依赖特定库。 然后,我需要引用相关的资料,比如提到协同过滤中的评价指标实现,或者参考已有的代码示例,如用户提供的引用中的车牌识别代码结构,虽然内容不同,但代码结构可能有参考价值。 最后,生成相关问题,帮助用户进一步探索,比如如何选择指标、处理冷启动问题,或者比较不同指标的优缺点。确保问题与推荐系统评价相关,并引导用户深入思考。</think>以下为您提供推荐系统常用评价指标的Python实现示例及说明: ### 一、分类评价指标 ```python # 准确率 & 召回率 def precision_recall(y_true, y_pred, k=10): common = set(y_true) & set(y_pred[:k]) precision = len(common) / k recall = len(common) / len(y_true) return precision, recall # F1-Score def f1_score(precision, recall): return 2 * (precision * recall) / (precision + recall + 1e-8) ``` ### 二、评分预测指标 ```python import numpy as np # RMSE(均方根误差) def rmse(y_true, y_pred): return np.sqrt(np.mean((np.array(y_true) - np.array(y_pred))**2)) # MAE(平均绝对误差) def mae(y_true, y_pred): return np.mean(np.abs(np.array(y_true) - np.array(y_pred))) ``` ### 三、排序评价指标 ```python from sklearn.metrics import roc_auc_score # AUC计算 y_score = [0.8, 0.6, 0.4, 0.3] # 预测得分 y_true = [1, 1, 0, 0] print(f"AUC: {roc_auc_score(y_true, y_score)}") # NDCG(归一化折损累计增益) def ndcg(y_true_rank, k=10): dcg = sum(np.divide([2**r -1 for r in y_true_rank[:k]], np.log2(np.arange(2, k+2)))) idcg = sum(np.divide([2**r -1 for r in sorted(y_true_rank, reverse=True)[:k]], np.log2(np.arange(2, k+2)))) return dcg / (idcg + 1e-8) ``` ### 四、其他语言实现提示 1. **Java**:使用Apache Commons Math库实现RMSE/MAE 2. **R语言**:利用`recommenderlab`包中的评估函数 3. **Spark**:调用MLlib的RegressionMetrics/RankingMetrics类 推荐系统评估时需注意:离线评估应保留时间窗口划分数据,在线评估可采用A/B测试[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值