ROC 曲线和 AUC:直观的方法和实施指南
itomcoil 2024-12-28 13:35 13 浏览
介绍
ROC曲线是二战期间的一个概念,旨在评估雷达系统(接收器)区分敌方物体和信号噪声的能力1。这一历史渊源导致了首字母缩略词受试者工作特征 (ROC) 曲线。随着时间的流逝,ROC 曲线越来越受欢迎2,成为分析分类器性能的最广泛工具之一。
本文旨在提供一种直观且非技术性的ROC曲线方法。它进一步介绍了与之相关的最关键指标之一——曲线下面积 (AUC)。最后一部分深入探讨了使用 Python 实现 ROC 和 AUC 的细节。
一、逐步建设中华民国
ROC 曲线是与基于概率模型的分类器相关的概念。例如,您可以考虑与本文中相同的分类器,该分类器基于逻辑回归模型,旨在预测患者是否患有糖尿病。如果您不熟悉分类器、决策阈值或概率模型的概念,或者想要复习一下,本文还介绍了必要的基础知识。
此分类器的决策阈值将表示为“d”,这意味着如果模型返回受测患者患有糖尿病的概率“p”,并且“p”高于或等于“d”,则这是阳性测试,并且将假定患者确实患有糖尿病。相反,如果“p”<“d”,则检测结果为阴性,假定患者没有糖尿病。
考虑决策阈值 d 为 0.5 的情况。
使用测试数据集,将决策阈值设置为此值会导致 38 名患者被确定为阳性,其中 13 名患者实际上是阴性(导致假阳性结果)。此外,116 名患者被归类为阴性,其中 28 名实际上是阳性病例(导致假阴性结果)。这些结果总结在以下混淆矩阵中:
然后,您可以对 d = 0.3 和 d = 0.7 重复该过程,从而产生两个不同的混淆矩阵:)
由于比较完全混淆矩阵可能具有挑战性,因此可以使用性能指标,例如误报率和真阳性率。对于三个决策阈值,“误报率”和“真阳性率”值如下所示:
通过使用“误报率”和“真阳性率”列,您可以在与每个决策阈值相对应的 2D 图形上绘制点
您可以对 100、1000 甚至更多决策阈值重复此过程。下面是 1000 个决策阈值(范围为 0 到 1)的真阳性率与假阳性率的关系图。
在绘制大量决策阈值的真阳性率与假阳性率时,通过连接图表上的点会出现一条曲线。此结果曲线称为 ROC 曲线。它通常使用“1 — 特异性”和“灵敏度”作为轴标签进行可视化。此外,随机分类器的 ROC 曲线通常用作比较点。
据观察,随机数的 ROC 曲线对应于单位平方的对角线。它将图形的原点(模型不生成正样本(以决策阈值 1 实现)连接到模型仅生成正样本且真阳性率和假阳性率均为 100%(决策阈值为 0 时实现)的点。
二、关键质量指标:AUC
一个好的分类模型往往会表现出较高的真阳性率和较低的假阳性率,从而导致点集中在图表的左上角。
因此,相对较好的模型的 ROC 曲线往往会接近左上角,而性能较差的模型往往会靠近对角线,如果模型的性能比随机分类器差,甚至会跌破对角线。
这反过来又导致曲线下面积 (AUC) 的增加,使其成为分类器的常用整体质量指标。AUC 也是一个有用的指标,用于比较给定分类任务中不同模型的性能。
对于我们用作示例的模型,AUC 等于 0.77
但是,需要注意的是,一旦设置了决策阈值,分类器的性能仅对应于 ROC 曲线上的一个点。一个有趣的观察结果是,两个不同的模型可以有不同的 ROC 曲线,但具有相同的 AUC,从而提供了对真阳性率和假阳性率之间不同平衡点的访问。
因此,虽然 ROC 和 AUC 的比较无疑有助于模型选择、超参数微调、特征准备等,但重要的是要记住,定义决策阈值仍然至关重要。有必要对模型的性能进行全面分析,并考虑其预期使用的环境,以确定一个决策阈值,该阈值在特定用例的误报率 (FPR) 和真阳性率 (TPR) 之间提供最佳权衡。
从数学的角度来看,AUC 可以解释为模型对随机正样本的排名高于随机负样本3的概率。与此定义一致,理想分类器的 AUC 为 1,即单位平方的面积,而随机分类器的 ROC 不是 0 而是 0.5。模型的 AUC 可以低于 0.5,如果它始终预测错误的结果,它甚至会为 0。幸运的是,有时可以将一个糟糕的模型变成一个好的模型,但只需扭转其预测即可。
三、实施
Python 提供了多个库,使 ROC 曲线的实现和 AUC 的计算变得简单明了。一个流行的选择是 Scikit-Learn?。
首先,您需要建立一个模型并计算每个测试患者的阳性概率。下面是代码的精简版本,用于重构到目前为止讨论的分类模型。数据可以从 Kaggle? 获取,有关此代码的更深入解释,可以参考本文。
import warnings
from sklearn.model_selection import train_test_split
import pandas as pd
from sklearn.linear_model import LogisticRegression
warnings.filterwarnings("ignore")
# Preparing the data
df = pd.read_csv("diabetes.csv")
Xtrain, X_test, y_train, y_test = train_test_split(df[df.columns[:-1]], df[df.columns[-1:]], test_size=0.2, random_state=50)
# Creating and fitting a logitic regression model
model = LogisticRegression(random_state=50, solver='lbfgs', max_iter=1000).fit(Xtrain, y_train)
# Predicting probabilities
y_proba = model.predict_proba(X_test)[:,1]
接下来,可以使用预测的概率向量在 2 行代码中获得 ROC 曲线。此外,该图会自动包含随机分类器的 AUC 和 ROC 曲线。
from sklearn.metrics import RocCurveDisplay
RocCurveDisplay.from_predictions(y_test, y_proba, plot_chance_level= True)
AUC 值也可以从预测的概率向量中获取并保存为变量。
from sklearn.metrics import roc_auc_score
roc_auc = roc_auc_score(y_test, y_proba)
roc_auc
0.774
绘制 ROC 曲线的另一种类似解决方案使用特征和标签向量以及模型。
from sklearn.metrics import RocCurveDisplay
RocCurveDisplay.from_estimator(model, X_test, y_test,plot_chance_level=True)
另一种选择涉及使用假阳性率和真阳性率的向量。这些向量可以使用 metrics.roc_curve 函数获得。
from sklearn import metrics
fpr, tpr, thresholds = metrics.roc_curve(y_test, y_proba, pos_label=1)
再说一次,下面的代码将计算 AUC 并显示 ROC 曲线。
roc_auc = metrics.auc(fpr, tpr)
display = metrics.RocCurveDisplay(fpr=fpr, tpr=tpr, roc_auc=roc_auc, estimator_name='ROC curve')
display.plot()
在这种情况下,值得注意的是,在绘制图形时,AUC 参数是可选的。
以模型和数据集为例,您可能会观察到曲线呈现“步骤”。这一特征是样本量相对较小的结果。较大的样品将产生更平滑的曲线。有多种方法可以将曲线拟合到实验 ROC,其中双正态模型是最常用的?。但是,本主题超出了本文的范围
结论
本文为二元分类模型评估中 ROC 曲线和 AUC 这两个基本概念的实现提供了一种直观的方法和实用的解决方案。通过提供构建 ROC 曲线的详细分步指南,本文为模型评估提供了实用的见解,并介绍了 AUC 作为模型质量的有意义的度量。重要的是,本文强调了与决策阈值的相互作用,强调仅依靠 ROC 和 AUC 可能不足以进行模型评估,并强调在开发概率分类模型时需要深思熟虑地考虑决策阈值。
相关推荐
- 第十章:优化设计与自动化工作流(优化设计是)
-
以下重点讲解优化设计、自动化脚本编写以及与其他工具(如Python、优化算法库)的集成,提升CFD仿真的工程应用效率。目标:掌握参数化扫描、优化算法集成和批量任务管理,实现从单次模拟到自动化设计探索的...
- 安装python语言,运行你的第一行代码
-
#01安装Python访问Python官方(https://www.python.org/),下载并安装最新版本的Python。确保安装过程中勾选“Addpython.exetoPAT...
- Python安装(python安装的库在哪个文件夹)
-
Windows系统1.安装python1.1下载Python安装包打开官方网站:https://www.python.org/downloads/点击"DownloadPython3.1...
- 比pip快100倍的Python包安装工具(python2.7.5安装pip)
-
简介uv是一款开源的Python包安装工具,GitHubstar高达56k,以性能极快著称,具有以下特性(官方英文原文):Asingletooltoreplacepip,pip-tool...
- 【跟着豆包AI学Python】Python环境的安装,编写第一个程序
-
最近几年,人工智能越来越走进人们的日常生活,国内各大公司都推出了自己的AI助手,例如:阿里旗下的通义千问、百度旗下的文心一言、腾讯的腾讯元宝、深度求索的deepseek等,元宝就是字节跳动公司推出的A...
- Python3+ 变量命名全攻略:PEP8 规范 + 官方禁忌...
-
Python3+变量命名规则与约定详解一、官方命名规则(必须遵守)1.合法字符集变量名只能包含:大小写字母(a-z,A-Z)数字(0-9)下划线(_)2.禁止数字开头合法:user_age,...
- Python程序打包为EXE的全面指南:从入门到精通
-
引言在Python开发中,将程序打包成可执行文件(EXE)是分发应用程序的重要环节。通过打包,我们可以创建独立的可执行文件,让没有安装Python环境的用户也能运行我们的程序。本篇文章将详细介绍如何使...
- 别再纸上谈兵了!手把手教你安装GraalVM,让你的代码瞬间起飞!
-
各位老铁们,是不是每次看到我吹嘘GraalVM的各种神迹,心里都痒痒的?想让自己的Java程序秒启动?想让Python脚本跑得比平时快好几倍?想体验一把多语言无缝协作的快感?但一想到要下载、配置、敲命...
- 纠结坏了!从 Python 3.8 升级到 3.14 真有必要吗?
-
点赞、收藏、加关注,下次找我不迷路"我电脑里装的Python3.8,现在都出3.14了,要不要赶紧升级啊?会不会像手机系统更新一样,越升级越卡?"相信很多刚入门的朋友都有类...
- win10下python3.13.3最新版本解释器的下载与安装
-
一、python3.13.3下载官方下载地址:https://www.python.org/1.浏览器访问https://www.python.org/这个地址,进入python的网站,点击【Dowl...
- Python简介与开发环境搭建详细教程
-
1.1Python简介与开发环境搭建详细教程一、Python语言简介1.Python的核心特点2.Python的应用领域表1.1Python主要应用领域领域典型应用常用库Web开发网站后端D...
- python开发小游戏案例(python游戏开发入门经典教程)
-
#头条创作挑战赛#假设你正在开发一个小型游戏,需要实现角色移动、障碍物生成、碰撞检测等功能。你可以使用Python和Pygame库来开发这个游戏。输入以下命令来安装Pygame:pipinstall...
- Python编程:从入门到实践 第十一、二 章 武装飞船
-
假设我们有一个名为AnonymousSurvey的类,用于收集匿名调查的答案。该类包含以下方法:classAnonymousSurvey:def__init__(self,questi...
- 「Python系列」python几个重要模块的安装(二)
-
一、python的pygame的安装:安装地址:https://www.cnblogs.com/charliedaifu/p/9938542.htmlpyagme包下载地址:https://down...
- python如何绘制消消乐小游戏(python字母消消乐)
-
要开发一款消消乐的小游戏界面,我们可以使用Python的pygame库。首先需要安装pygame库,然后创建一个窗口,加载游戏素材,处理游戏逻辑,以及绘制游戏界面。以下是一个简单的消消乐游戏界面实现:...
- 一周热门
- 最近发表
-
- 第十章:优化设计与自动化工作流(优化设计是)
- 安装python语言,运行你的第一行代码
- Python安装(python安装的库在哪个文件夹)
- 比pip快100倍的Python包安装工具(python2.7.5安装pip)
- 【跟着豆包AI学Python】Python环境的安装,编写第一个程序
- Python3+ 变量命名全攻略:PEP8 规范 + 官方禁忌...
- Python程序打包为EXE的全面指南:从入门到精通
- 别再纸上谈兵了!手把手教你安装GraalVM,让你的代码瞬间起飞!
- 纠结坏了!从 Python 3.8 升级到 3.14 真有必要吗?
- win10下python3.13.3最新版本解释器的下载与安装
- 标签列表
-
- ps图案在哪里 (33)
- super().__init__ (33)
- python 获取日期 (34)
- 0xa (36)
- super().__init__()详解 (33)
- python安装包在哪里找 (33)
- linux查看python版本信息 (35)
- python怎么改成中文 (35)
- php文件怎么在浏览器运行 (33)
- eval在python中的意思 (33)
- python安装opencv库 (35)
- python div (34)
- sticky css (33)
- python中random.randint()函数 (34)
- python去掉字符串中的指定字符 (33)
- python入门经典100题 (34)
- anaconda安装路径 (34)
- yield和return的区别 (33)
- 1到10的阶乘之和是多少 (35)
- python安装sklearn库 (33)
- dom和bom区别 (33)
- js 替换指定位置的字符 (33)
- python判断元素是否存在 (33)
- sorted key (33)
- shutil.copy() (33)