排序算法常用评价指标计算方式AUC

本文详细介绍了AUC(Area Under the Curve)的计算方法,包括阶梯面积法的复杂性、与Wilcoxon-Mann-Witney Test的等价性,以及两种常见计算策略:频率估计和基于样本rank的高效方法。

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

现在的排序评估指标主要包括MAP、NDCG和AUC三个指标。NDCG考虑多指标,MAP和AUC考虑单个指标。

1.AUC

  最直观的,根据AUC这个名称,我们知道,计算出ROC曲线下面的面积,就是AUC的值。事实上,这也是在早期 Machine Learning文献中常见的AUC计算方法。由于我们的测试样本是有限的。我们得到的AUC曲线必然是一个阶梯状的。因此,计算的AUC也就是这些阶梯 下面的面积之和。这样,我们先把score排序(假设score越大,此样本属于正类的概率越大),然后一边扫描就可以得到我们想要的AUC。但是,这么 做有个缺点,就是当多个测试样本的score相等的时候,我们调整一下阈值,得到的不是曲线一个阶梯往上或者往右的延展,而是斜着向上形成一个梯形。此 时,我们就需要计算这个梯形的面积。由此,我们可以看到,用这种方法计算AUC实际上是比较麻烦的。 

    一个关于AUC的很有趣的性质是,它和Wilcoxon-Mann-Witney Test是等价的。这个等价关系的证明留在下篇帖子中给出。而Wilcoxon-Mann-Witney Test就是测试任意给一个正类样本和一个负类样本,正类样本的score有多大的概率大于负类样本的score。有了这个定义,我们就得到了另外一中计 算AUC的办法:得到这个概率。我们知道,在有限样本中我们常用的得到概率的办法就是通过频率来估计之。这种估计随着样本规模的扩大而逐渐逼近真实值。这和上面的方法中,样本数越多,计算的AUC越准确类似,也和计算积分的时候,小区间划分的越细,计算的越准确是同样的道理。具体来说就是统计一下所有的 M×N(M为正类样本的数目,N为负类样本的数目)个正负样本对中,有多少个组中的正样本的score大于负样本的score。当二元组中正负样本的score相等的时候,按照0.5计算。然后除以MN。实现这个方法的复杂度为O(n^2)。n为样本数(即n=M+N) 
     第三种方法实际上和上述第二种方法是一样的,但是复杂度减小了。它也是首先对score从大到小排序,然后令最大score对应的sample 的rank为n,第二大score对应sample的rank为n-1,以此类推。

例如在排在n=5的正样本,共有4个样本与其组合的值小于5。。。

然后把所有的正类样本的rank相加,再减去两个正样本组合的情况。得到的就是所有的样本中有多少对正类样本的score大于负类样本的score。然后再除以M×N。即 

<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、付费专栏及课程。

余额充值