推荐系统之ROC和AUC详解

2023-05-16

前言

这个绝对是重量级内容了,也是很基础的东西。对于模型来讲, 不同的阈值会有不同的泛化能力, 这时候,如果想比较两个模型的泛化能力, 这个阈值的高低也会受到影响, 所以就需要能够综合考虑着所有阈值下的模型的泛化性能,这样还可以使得模型适应与不同的任务, 那这时候应该怎么评估模型呢? ROC曲线是常用的工具。

在这里和我们前面说过的PR曲线是类似的(mAP),但是在之前的PR 曲线中横纵坐标是查准率和查全率。但是在这里就换成了真正例率(TPR)和假正例率(FPR),这两个也是根据混淆矩阵来计算的,这里看不懂的可以去看看我之前的文章目标检测指标mAP详解。

1、PR曲线和ROC曲线的区别

首先来说一下ROC曲线的定义,先看一下下面的图:

在这里插入图片描述

 真正例率TPR: 这个就是查全率, 真实情况为正的样本中,模型预测为正的比例,公式\frac{1}{1+ 2 }

 正例率FPR: 这个就是真实情况为负的样本中,模型预测为正的比例, 公式\frac{3}{3+4}

这两个就是ROC曲线的横纵坐标了,那么为什么大家在推荐系统中不会使用PR曲线了呢?

这是因为在推荐系统中很容易发生正负样本不均衡的情况,相比PR曲线,ROC曲线有个特点就是,当正负样本的分布发生变化时, ROC曲线的形状能够基本保持不变, 而P-R曲线的形状一般会发生剧烈的变化, 这个特点让ROC曲线能够尽量降低不同测试集带来的干扰, 更加客观的衡量模型本身的性能。很多实际问题中, 正负样本的数量往往不均衡,比如计算广告中,正样本往往是负样本的1/10000, 若选择不同的测试集,P-R曲线的变化就会非常大, 而ROC曲线则能够更加稳定的反映模型的好坏,这也是为啥ROC曲线应用广泛的原因。当然, 选择PR曲线还是ROC曲线还是应该因实际问题而定, 如果希望更多的看到模型在特定数据集上的表现, PR曲线则能够更加直观的反映性能。在反欺诈场景下,假设正常用户为正类(设占比 99.9%),欺诈用户为负类(设占比 0.1%)。如果使用准确率评估,则将所有用户预测为正类即可获得 99.9%的准确率。这并不是一个很好的预测结果,因为欺诈用户全部未能找出。使用AUC评估,则此时FPR=1,TPR=1,对应的AUC=0.5 。AUC成功的指出了这并不是一个很好的预测结果。

2、AUC物理意义以及计算

AUC代表的肯定就是ROC曲线下的面积,但是它的真实代表含义是随机给定一个正样本和一个负样本,正样本预测 分数大于负样本预测分数的概率。AUC越大, 表示模型预测样本为正样本的概率比模型预测样本为负样本的概率大, 书上说的样本预测排序质量的度量,与排序误差有紧密关系。如:AUC=0.8表示:给定一个正样本和一个负样本,在 80% 的情况下,模型对正样本预测为正类的概率大于对负样本预测为正类的概率。(将正样本排在负样本前面的概率)。所以在正负样本不均衡的地方AUC仍然适用。

其中AUC的好处还有如下所示:

  • 使用精确率,召回率和F1值进行模型评估时需要设定阈值,阈值的大小会影响模型的泛化能力,使用AUC评估模型性能时可以不设定阈值
  • AUC计算主要与排序有关,它对排序敏感,而对预测分数没那么敏感(排序结果更重要,不管预测值是多少,只要正例的预测概率都大于负例就行,将预测概率同乘以1.2,AUC值不变)
  • 在一定条件下,RankBoost算法优化的全局函数就是AUC,可以使用RankBoost算法优化AUC的近似值或对AUC进行局部优化。(paper);xgboost提供了直接优化AUC的功能,目标函数设置为:objective = ‘rank:pairwise’。
  • 当正负样本的分布发生变化时,P-R曲线的形状一般会发生比较剧烈的变化,而ROC曲线的形状能够基本保持不变。这使得ROC曲线能够尽量降低不同测试集带来的干扰,更加客观地衡量模型本身的性能。

代码:

def auc(y_label, y_pred):
	
	n = len(y_label)
	pos_pred = [y_pred[i] for i in range(n) if y_label[i] == 1]
	neg_pred = [y_pred[i] for i in range(n) if y_label[i] == 0]
	n_pos = len(pos_pred)   # 正样本的个数
	n_neg = len(neg_pred)   # 负样本的个数
	auc = 0
	# 对任一一对pair, 正 > 负的pair个数除以pair对的总数就是auc
	for i in range(n_pos):
		for j in range(n_neg):
			if pos_pred[i] > neg_pred[j]:
				auc += 1
			elif pos_pred[i] == neg_pred[j]:
				auc += 0.5
	
	return auc / (n_pos * n_neg)



def auc(y_label, y_pred):
	# 先按照预测概率从小到大排序,然后找正样本所在的索引值
	n_pos = sum(y_label)
	n_neg = len(y_label) - n_pos
	label_pred = list(zip(y_label, y_pred))
	label_pred.sort(key=lambda x: x[1])   # 按照概率从小到大排序
	
	pos_label_index_acc = 0
	for i, (label, pred) in enumerate(label_pred):
		if label == 1:
			pos_label_index_acc += i
	
	acc_1_m = n_pos * (n_pos - 1) / 2
	return (pos_label_index_acc - acc_1_m) / (n_pos * n_neg)

参考:翻滚的小强

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

推荐系统之ROC和AUC详解 的相关文章

  • stata绘制roc曲线_绘制ROC曲线、找截断值,教你两种软件操作方法!

    我们在前面学习过用SPSS SPSS操作 多项测量指标的ROC曲线分析 和Stata Stata教程 ROC曲线下面积的比较 绘制ROC曲线 但是 最佳临界点 截断值 cut off point 该怎么选取呢 今天我们来讲一下如何用SPSS
  • 推荐系统之AUC指标的一些理解

    以下是在一些整理的和自己的关于AUC的理解 1 AUC和GAUC的区别 auc反映的是整体样本间的一个排序能力 在计算广告领域 实际要衡量的是不同用户对不同广告之间的排序能力 因此实际应该更关注的是同一个用户对不同广告间的排序能力 GAUC
  • 推荐系统之ROC和AUC详解

    前言 这个绝对是重量级内容了 xff0c 也是很基础的东西 对于模型来讲 xff0c 不同的阈值会有不同的泛化能力 xff0c 这时候 xff0c 如果想比较两个模型的泛化能力 xff0c 这个阈值的高低也会受到影响 xff0c 所以就需要
  • 推荐系统评价指标/ROC/AUC(附代码)

    推荐系统评价指标 精确率 xff1a 分类正确的正样本数 分类器判定为正样本数 召回率 xff1a 分类正确的正样本数 真正的正样本数 在排序问题中 xff0c Top N就是模型判定的正样本 xff0c 然后计算前N个位置上的准确率Pre
  • 机器学习推荐系统评价指标之AUC

    机器学习推荐系统评价指标之AUC 综述AUC的计算过程AUC的优势 综述 AUC是机器学习模型中常见评价指标 xff0c 在推荐系统中也十分常见 和常见的评价指标Acc xff0c P xff0c R相比 xff0c AUC具备一定的优势
  • 准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F值(F-Measure)、AUC、ROC的理解

    一 准确率 精确率 召回率和 F 值 是选出目标的重要评价指标 不妨看看这些指标的定义先 1 若一个实例是正类 但是被预测成为正类 即为真正类 True Postive TP 2 若一个实例是负类 但是被预测成为负类 即为真负类 True
  • 如何修复 ValueError:不支持多类格式[重复]

    这个问题在这里已经有答案了 这是我的代码 我尝试计算 ROC 分数 但我遇到 ValueError 问题 不支持多类格式 我已经在寻找 sci kit learn 但它没有帮助 最后 我仍然有 ValueError 不支持多类格式 这是我的
  • 二进制向量作为 roc_curve 的 y_score 参数

    sklearn roc curve文档字符串 states y score 数组 形状 n samples 目标分数可以是正类的概率估计 置信度值或二元决策 在什么情况下将 y score 设置为二元向量 二元决策 才有意义 这会不会导致
  • 如何在Python中计算One Class SVM的AUC?

    我在 python 中绘制 OneClassSVM 的 AUC 图时遇到困难 我使用 sklearn 生成混淆矩阵 例如 tp fp fn tn with fn tn 0 from sklearn metrics import roc cu
  • sklearn 中留一交叉验证的 ROC 曲线

    我想绘制一个ROC曲线的分类器使用留一法交叉验证 好像有人问过类似的问题here但没有任何答复 在另一个问题中here据称 为了使用 LeaveOneOut 获得有意义的 ROC AUC 您需要 计算每次折叠的概率估计 每个折叠只包含 一个
  • 如何使用 ROCR 包计算 AUC

    我已经安装了 SVM 模型并使用 ROCR 包创建了 ROC 曲线 如何计算曲线下面积 AUC set seed 1 tune out tune svm Negative Positive data trainSparse kernel r
  • StatsModels的predict函数如何与scikit-learn的roc_auc_score交互?

    我正在尝试理解predictPython statsmodels 中用于 Logit 模型的函数 它的文档是here https www statsmodels org stable generated statsmodels discre
  • 来自插入符号中的训练数据的 ROC 曲线

    使用R包插入符号 如何根据train 函数的交叉验证结果生成ROC曲线 比如说 我执行以下操作 data Sonar ctrl lt trainControl method cv summaryFunction twoClassSummar
  • R中PRROC包的精确召回曲线计算

    我的问题与this https stackoverflow com questions 25020788 in r calculate area under precision recall curve aupr问题 我对计算精确召回曲线
  • 如何使用 matplotlib/python 绘制 ROC 曲线 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想绘制一条 ROC 曲线python with matplotlib并想像这样展示它 假设我们有 0 0 到 1 0 的预测y sc
  • sklearn RandomForestClassifier 与 auc 方法中 ROC-AUC 分数的差异

    我分别从 sklearn 的 RandomForestClassifier 和 roc curve auc 方法收到不同的 ROC AUC 分数 以下代码得到了 0 878 的 ROC AUC 即 gs best score def tra
  • 绘制多个类别的 ROC 曲线

    我正在按照此链接绘制多个类别的 ROC 曲线的文档 http scikit learn org stable auto examples model selection plot roc html http scikit learn org
  • Scikit - 如何定义绘制 roc 曲线的阈值

    我有一个增强树模型以及测试数据集的概率和分类 我正在尝试绘制相同的 roc curve 但我无法弄清楚如何在 scikit learn 中定义 roc 曲线的阈值 alpha from sklearn metrics import prec
  • 如何用tensorflow计算AUC?

    我已经使用 Tensorflow 构建了一个二元分类器 现在我想使用 AUC 和准确性来评估分类器 就准确性而言 我可以轻松地这样做 X tf placeholder float None n input y tf placeholder
  • scikit-learn - 具有置信区间的 ROC 曲线

    我可以使用 ROC 曲线scikit learn with fpr tpr thresholds metrics roc curve y true y pred pos label 1 where y true是基于我的黄金标准的值列表 即

随机推荐