百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

ROC 曲线和 AUC:直观的方法和实施指南

itomcoil 2024-12-28 13:35 31 浏览

介绍

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编程实现求解高次方程_python求次幂
Python编程实现求解高次方程_python求次幂

#头条创作挑战赛#编程求解一元多次方程,一般情况下对于高次方程我们只求出近似解,较少的情况可以得到精确解。这里给出两种经典的方法,一种是牛顿迭代法,它是求解方程根的有效方法,通过若干次迭代(重复执行部分代码,每次使变量的当前值被计算出的新值...

2025-10-23 03:58 itomcoil

python常用得内置函数解析——sorted()函数

接下来我们详细解析Python中非常重要的内置函数sorted()1.函数定义sorted()函数用于对任何可迭代对象进行排序,并返回一个新的排序后的列表。语法:sorted(iterabl...

Python入门学习教程:第 6 章 列表

6.1什么是列表?在Python中,列表(List)是一种用于存储多个元素的有序集合,它是最常用的数据结构之一。列表中的元素可以是不同的数据类型,如整数、字符串、浮点数,甚至可以是另一个列表。列...

Python之函数进阶-函数加强(上)_python怎么用函数

一.递归函数递归是一种编程技术,其中函数调用自身以解决问题。递归函数需要有一个或多个终止条件,以防止无限递归。递归可以用于解决许多问题,例如排序、搜索、解析语法等。递归的优点是代码简洁、易于理解,并...

Python内置函数range_python内置函数int的作用

range类型表示不可变的数字序列,通常用于在for循环中循环指定的次数。range(stop)range(start,stop[,step])range构造器的参数必须为整数(可以是内...

python常用得内置函数解析——abs()函数

大家号这两天主要是几个常用得内置函数详解详细解析一下Python中非常常用的内置函数abs()。1.函数定义abs(x)是Python的一个内置函数,用于返回一个数的绝对值。参数:x...

如何在Python中获取数字的绝对值?

Python有两种获取数字绝对值的方法:内置abs()函数返回绝对值。math.fabs()函数还返回浮点绝对值。abs()函数获取绝对值内置abs()函数返回绝对值,要使用该函数,只需直接调用:a...

贪心算法变种及Python模板_贪心算法几个经典例子python

贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法策略。以下是贪心算法的主要变种、对应的模板和解决的问题特点。1.区间调度问题问题特点需要从一组区间中选择最大数...

Python倒车请注意!负步长range的10个高能用法,让代码效率翻倍

你是否曾遇到过需要倒着处理数据的情况?面对时间序列、日志文件或者矩阵操作,传统的遍历方式往往捉襟见肘。今天我们就来揭秘Python中那个被低估的功能——range的负步长操作,让你的代码优雅反转!一、...

Python中while循环详解_python怎么while循环

Python中的`while`循环是一种基于条件判断的重复执行结构,适用于不确定循环次数但明确终止条件的场景。以下是详细解析:---###一、基本语法```pythonwhile条件表达式:循环体...

简单的python-核心篇-面向对象编程

在Python中,类本身也是对象,这被称为"元类"。这种设计让Python的面向对象编程具有极大的灵活性。classMyClass:"""一个简单的...

简单的python-python3中的不变的元组

golang中没有内置的元组类型,但是多值返回的处理结果模拟了元组的味道。因此,在golang中"元组”只是一个将多个值(可能是同类型的,也可能是不同类型的)绑定在一起的一种便利方法,通常,也...

python中必须掌握的20个核心函数——sorted()函数

sorted()是Python的内置函数,用于对可迭代对象进行排序,返回一个新的排序后的列表,不修改原始对象。一、sorted()的基本用法1.1方法签名sorted(iterable,*,ke...

12 个 Python 高级技巧,让你的代码瞬间清晰、高效

在日常的编程工作中,我们常常追求代码的精简、优雅和高效。你可能已经熟练掌握了列表推导式(listcomprehensions)、f-string和枚举(enumerate)等常用技巧,但有时仍会觉...

Python的10个进阶技巧:写出更快、更省内存、更优雅的代码

在Python的世界里,我们总是在追求效率和可读性的完美平衡。你不需要一个数百行的新框架来让你的代码变得优雅而快速。事实上,真正能带来巨大提升的,往往是那些看似微小、却拥有高杠杆作用的技巧。这些技巧能...