机器学习-ROC曲线:技术解析与实战应用

本文全面探讨了ROC曲线(Receiver Operating Characteristic Curve)的重要性和应用,从其历史背景、数学基础到Python实现以及关键评价指标。文章旨在提供一个深刻而全面的视角,以帮助您更好地理解和应用ROC曲线在模型评估中的作用。

file

一、引言

机器学习和数据科学在解决复杂问题时,经常需要评估模型的性能。其中,ROC(Receiver Operating Characteristic)曲线是一种非常有用的工具,被广泛应用于分类问题中。该工具不仅在医学检测、信号处理中有着悠久的历史,而且在近年来的机器学习应用中也显得尤为关键。

ROC曲线简介

ROC曲线用于展示在不同的分类阈值下,模型的真正类率(True Positive Rate, TPR)和假正类率(False Positive Rate, FPR)之间的关系。通常与ROC曲线一起使用的还有AUC(Area Under the Curve)值,用以量化ROC曲线下的面积,进而给出一个关于模型性能的单一指标。


二、ROC曲线的历史背景

了解ROC曲线的历史背景不仅能增加我们对这一工具的尊重,还能更好地理解它在多个领域内的应用价值。因此,本节将探讨ROC曲线从最早的军事应用到现代医学和机器学习领域的发展过程。

二战雷达信号检测

ROC曲线最初的应用场景是二战中的雷达信号检测。当时,盟军需要一种方法来评估雷达系统的性能——特别是系统在检测敌方飞机时的灵敏度和误报率。这就催生了ROC曲线的诞生,它用于度量在不同阈值下,雷达正确检测到目标(True Positive)和误报(False Positive)的情况。

在医学和机器学习中的应用

随着时间的推移,ROC曲线的应用场景逐渐扩大。在20世纪50年代和60年代,该曲线开始在心理测量学和医学诊断中得到应用。比如,在癌症筛查中,ROC曲线用于评估在不同诊断阈值下,筛查测试对正例和负例的分类能力。

进入21世纪,随着机器学习和数据科学的崛起,ROC曲线在这些领域内也获得了广泛应用。它成为了评估分类模型(如支持向量机、随机森林和神经网络等)性能的标准方法之一。

横跨多个领域的普及

值得注意的是,ROC曲线如今已经不仅局限于专业的科研和工程领域。许多业界工具和库(如Scikit-learn、TensorFlow和PyTorch等)都内置了绘制ROC曲线的功能,使得即使是不具备专门训练的个人和小团队也能轻易地应用这一工具。


三、数学基础

file

在深入研究ROC曲线的实际应用之前,我们首先需要理解其背后的数学基础。ROC曲线是建立在一系列重要的统计量之上的,包括True Positive Rate(TPR)和False Positive Rate(FPR)。本节将详细介绍这些概念和计算方法,并提供相关Python代码示例。

True Positive Rate(TPR)与False Positive Rate(FPR)

True Positive Rate(TPR)

TPR也称为灵敏度(Sensitivity)或召回率(Recall),是真正例(True Positive,TP)占所有实际正例(实际正例 = TP + FN)的比例。

file

False Positive Rate(FPR)

FPR也称为1-特异性(1-Specificity),是假正例(False Positive,FP)占所有实际负例(实际负例 = FP + TN)的比例。

file

计算方法

计算TPR和FPR通常涉及到以下几个步骤:

  1. 设置一个分类阈值。

  1. 使用分类模型对数据进行预测。

  1. 根据阈值将预测结果划分为正例或负例。

  1. 计算TP, FP, TN, FN的数量。

  1. 使用上面的公式计算TPR和FPR。

代码示例:计算TPR和FPR

下面是一个用Python和PyTorch来计算TPR和FPR的简单代码示例。

import torch# 真实标签和模型预测概率
y_true = torch.tensor([0, 1, 1, 0, 1])
y_pred = torch.tensor([0.2, 0.8, 0.6, 0.1, 0.9])# 设置阈值
threshold = 0.5# 根据阈值进行分类
y_pred_class = (y_pred > threshold).float()# 计算TP, FP, TN, FN
TP = torch.sum((y_true == 1) & (y_pred_class == 1)).float()
FP = torch.sum((y_true == 0) & (y_pred_class == 1)).float()
TN = torch.sum((y_true == 0) & (y_pred_class == 0)).float()
FN = torch.sum((y_true == 1) & (y_pred_class == 0)).float()# 计算TPR和FPR
TPR = TP / (TP + FN)
FPR = FP / (FP + TN)print(f'TPR = {TPR}, FPR = {FPR}')

输出:

TPR = 0.6667, FPR = 0.0


四、Python绘制ROC曲线

file

理论基础明确之后,我们将转向如何用Python实现ROC曲线的绘制。这里,我们会使用Python的数据科学库matplotlib和深度学习框架PyTorch进行展示。为了简化问题,我们将使用一个简单的二分类问题作为例子。

导入所需库

首先,让我们导入所有必要的库。

import matplotlib.pyplot as plt
import torch
from sklearn.metrics import roc_curve, auc

准备数据

为了本教程的目的,我们假设已经有了模型预测的概率值和相应的真实标签。

# 真实标签
y_true = torch.tensor([0, 1, 1, 0, 1, 0, 1])# 模型预测的概率值
y_score = torch.tensor([0.1, 0.9, 0.8, 0.2, 0.7, 0.05, 0.95])

计算ROC曲线坐标点

利用sklearn.metrics库的roc_curve函数可以方便地计算出ROC曲线的各个点。

fpr, tpr, thresholds = roc_curve(y_true, y_score)

计算AUC值

AUC(Area Under Curve)是ROC曲线下方的面积,通常用于量化模型的整体性能。

roc_auc = auc(fpr, tpr)

绘制ROC曲线

使用matplotlib进行绘图。

plt.figure()
lw = 2  # 线宽
plt.plot(fpr, tpr, color='darkorange', lw=lw, label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic Example')
plt.legend(loc='lower right')
plt.show()

这段代码会生成一个标准的ROC曲线,其中橙色的线表示ROC曲线,虚线表示随机分类器的性能。

完整代码示例

以下是前面所有代码段的合并,形成一个完整的例子。

import matplotlib.pyplot as plt
import torch
from sklearn.metrics import roc_curve, auc# 真实标签和模型预测的概率
y_true = torch.tensor([0, 1, 1, 0, 1, 0, 1])
y_score = torch.tensor([0.1, 0.9, 0.8, 0.2, 0.7, 0.05, 0.95])# 计算ROC曲线的各个点
fpr, tpr, thresholds = roc_curve(y_true, y_score)# 计算AUC值
roc_auc = auc(fpr, tpr)# 绘制ROC曲线
plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange', lw=lw, label=f'ROC curve (area = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic Example')
plt.legend(loc='lower right')
plt.show()

五、ROC曲线的评价指标

在深入了解如何绘制ROC曲线后,接下来我们将专注于如何使用ROC曲线来评价模型的性能。ROC曲线本身提供了一个直观的方式来观察模型在不同阈值下的性能,但除此之外,还有其他一些重要的评价指标。

AUC(Area Under Curve)

AUC是ROC曲线下的面积,范围在0到1之间。AUC值可以用于总体评价模型的分类性能。

  • AUC = 1,表示模型有完美的分类性能。

  • 0.5 < AUC < 1,表示模型具有一定的分类能力。

  • AUC = 0.5,表示模型没有分类能力,相当于随机猜测。

AUC的计算通常使用数值积分方法,如梯形法则。

Youden's Index

file

F1 Score

虽然F1 Score不是直接从ROC曲线中获得的,但它是一个与阈值相关的评价指标。它是精确率和召回率的调和平均。

file

代码示例:计算AUC和Youden's Index

以下Python代码段使用sklearn.metrics库来计算AUC,并手动计算Youden's Index。

from sklearn.metrics import roc_curve, auc# 计算ROC曲线
fpr, tpr, thresholds = roc_curve(y_true, y_score)# 计算AUC
roc_auc = auc(fpr, tpr)
print(f'AUC: {roc_auc}')# 计算Youden's Index
youdens_index = tpr - fpr
best_threshold = thresholds[torch.argmax(torch.tensor(youdens_index))]
print(f"Best threshold according to Youden's Index: {best_threshold}")

输出:

AUC: 0.94
Best threshold according to Youden's Index: 0.7


六、总结

本文全面而深入地探讨了ROC曲线的各个方面,从其历史背景和数学基础到具体的Python实现以及相关的评价指标。通过这一流程,我们不仅能更加深刻地理解ROC曲线作为一个模型评估工具的价值,而且还可以洞察到其在现代机器学习和数据科学中的应用广度和深度。

技术洞见

虽然ROC曲线和AUC通常被视为分类模型性能的金标准,但值得注意的是,它们并不总是适用于所有场景。例如,在高度不平衡的数据集中,ROC曲线可能会给出过于乐观的性能评估。这是因为ROC曲线对假正例和假负例的处理是平等的,而在不平衡数据集中,这种平等处理可能会掩盖模型在较少类别上的性能不足。

另外,虽然ROC曲线能够很好地评价模型的整体性能,但它并不能提供关于模型在不同类别或群体间公平性的信息。在一些应用场景中,如医疗诊断和金融风险评估,模型的公平性是一个重要的考量因素。

展望未来

随着机器学习和人工智能技术的不断发展,评估模型性能的方法也在逐渐演化。在深度学习、自然语言处理和强化学习等领域,研究人员正在开发出更为复杂和精细的评价机制。因此,理解和掌握ROC曲线只是起点,未来还有更多富有挑战性和创新性的工作等待我们去探索。

通过本文,我们希望能够提供一个全面而深入的视角,以助您在复杂的模型评估问题中做出更加明智和准确的决策。正如数据科学中常说的,了解并正确使用各种评价指标,就是走向建模成功的关键第一步。

文章转载自:techlead_krischang

原文链接:https://www.cnblogs.com/xfuture/p/17874545.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198983.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【新手解答8】深入探索 C 语言:递归与循环的应用

C语言的相关问题解答 写在最前面问题&#xff1a;探索递归与循环在C语言中的应用解析现有代码分析整合循环示例代码修改注意事项结论 延伸&#xff1a;递归和循环的退出条件设置解析使用递归使用循环选择适合的方法 写在最前面 一位粉丝私信交流&#xff0c;回想起了当初的我C…

Zabbix HA高可用集群搭建

Zabbix HA高可用集群搭建 Zabbix HA高可用集群搭建一、Zabbix 高可用集群&#xff08;Zabbix HA&#xff09;二、部署Zabbix高可用集群1、两个服务端配置1.1主节点 Zabbix Server 配置1.2 备节点 Zabbix Server 配置1.3 主备节点添加监控主机1.4 查看高可用集群状态 2、两个客户…

【数据结构与算法】JavaScript实现二叉搜索树

文章目录 一、二叉搜索树的封装1.插入数据2.遍历数据2.1.先序遍历2.2.中序遍历2.3.后续遍历 3.查找数据3.1.查找最大值&最小值3.2.查找特定值 4.删除数据4.1.情况1&#xff1a;没有子节点4.2.情况2&#xff1a;有一个子节点4.3.情况3&#xff1a;有两个子节点4.4.完整实现 …

成为AI产品经理——回归模型评估(MSE、RMSE、MAE、R方)

分类问题的评估是看实际类别和预测类别是否一致&#xff0c;它的评估指标主要有混淆矩阵、AUC、KS。回归问题的评估是看实际值和预测值是否一致&#xff0c;它的评估指标包括MAE、MSE、RMSE、R方。 如果我们预测第二天某支股票的价格&#xff0c;给一个模型 y1.5x&#xff0c;…

查询绑定了所有id的name

1、如图&#xff0c;绑定了所有id的有A,B两个name 2、第一种Sql及效率 explain SELECT name,count(id) as count from test GROUP BY name HAVING count(id)(SELECT count(DISTINCT id) from test); 3、第二种sql及效率 explain select * from (SELECT name,count(id) as co…

SQL自学通之简介

目录 一、SQL 简史 二、数据库简史 1、Dr. Codds 对关系型数据库系统的十二条规则 2、设计数据库的结构 3、数据库的前景 4、对于什么是客户机/服务器型电脑系统 BernardH.Boar的定义如下&#xff1a; 5、交互式语言 6、易于实现 7、SQL 总览 三、流行的 SQL 开发工具…

MFC 绘制单一颜色圆形、渐变颜色边框圆形、渐变填充圆形以及绘制三角函数正弦函数曲线.

MFC 绘制三种不同圆形以及绘制正弦函数曲线 本文使用visual Studio MFC 平台实现绘制单一颜色圆形、渐变颜色边框圆形、渐变填充圆形以及绘制三角函数正弦函数曲线. 关于基础工程的创建请参考 01-Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线 02-vis…

【【FPGA 之 MicroBlaze XADC 实验】】

FPGA 之 MicroBlaze XADC 实验 Vivado IP 核提供了 XADC 软核&#xff0c;XADC 包含两个模数转换器&#xff08;ADC&#xff09;&#xff0c;一个模拟多路复用器&#xff0c;片上温度和片上电压传感器等。我们可以利用这个模块监测芯片温度和供电电压&#xff0c;也可以用来测…

【五分钟】熟练使用np.interp函数函数(干货!!!)

引言 np.interp函数可对一维数组进行线性插值。具体来说&#xff0c;如果已知xp和yp&#xff0c;并且xp和yp具有确定的对应关系(比如ypsin(xp))&#xff0c;那么对于新的一维数组x&#xff0c;可通过np.interp函数得到数组y&#xff0c;y是基于 xp和yp的映射关系 通过【线性插…

Spring之AOP理解与应用

1. AOP的认识 面向切面编程&#xff1a;基于OOP基础之上新的编程思想&#xff0c;OOP面向的主要对象是类&#xff0c;而AOP面向的主要对象是切面&#xff0c;在处理日志、安全管理、事务管理等方面有非常重要的作用。AOP是Spring中重要的核心点&#xff0c;AOP提供了非常强…

面了一个测试工程师要求月薪26K,总感觉他背了很多面试题

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

Nacos 安装下载

Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比Eureka功能更加丰富&#xff0c;在国内受欢迎程度较高。 1、Windows安装 开发阶段采用单机安装即可 1.1 下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nac…

uniapp到底用什么ui框架最合适-关于uni-app的ui库、ui框架、ui组件

文章目录 直接看答案关于uni-app的ui库、ui框架、ui组件组件的概念扩展组件的选择uni ui如何使用uni ui 综上&#xff0c;官方对组件的使用建议是&#xff1a;附录&#xff1a;其他全端兼容ui库参考文章&#xff1a; 直接看答案 如果想自己纯手写&#xff0c;直接用内置组件。…

it统一运维平台怎么样?有可以推荐的品牌吗?

随着互联网化&#xff0c;随着信息化的不断发展&#xff0c;企业IT系统的规模和复杂性也在日益增加。在这个背景下&#xff0c;IT统一运维平台就应用而生了。它以一种全面、集成的方式管理企业IT资源&#xff0c;从而提高效率、降低成本、改善服务&#xff0c;为企业提供更快更…

「词令」2023年12月5日支付宝蚂蚁庄园今日问题答案是什么?12.5蚂蚁庄园今日问题正确答案

问题&#xff1a;我国哪个城市有“四面荷花三面柳&#xff0c;一城山色半城湖”的美誉&#xff1f; 选项&#xff1a;A、济南 B、泉州 答案&#xff1a;济南 解析&#xff1a;一城山色&#xff1a;千佛山在城南&#xff0c;为附近最高的山&#xff0c;全城人都能看到它苍翠的…

Linux last命令教程:如何查看用户的登录和注销历史(附案例详解和注意事项)

Linux last命令介绍 last命令在Linux中用于显示自文件/var/log/wtmp创建以来所有用户的登录和注销列表。可以给出一个或多个用户名作为参数&#xff0c;以显示他们的登录&#xff08;和注销&#xff09;时间和主机名。 Linux last命令适用的Linux版本 last命令在大多数Linux…

Comprehension from Chaos: Towards Informed Consent for Private Computation

目录 笔记后续的研究方向摘要引言 Comprehension from Chaos: Towards Informed Consent for Private Computation CCS 2023 笔记 本文探讨了用户对私有计算的理解和期望&#xff0c;其中包括多方计算和私有查询执行等技术。该研究进行了 22 次半结构化访谈&#xff0c;以调查…

14、SQL注入——HTTP文件头注入

文章目录 一、HTTP Header概述1.1 HTTP工作原理1.2 HTTP报文类型1.3 较重要的HTTP Header内容 二、HTTP Header注入2.1 HTTP Header注入的前提条件2.2 常见的HTTP Header注入类型 一、HTTP Header概述 1.1 HTTP工作原理 1.2 HTTP报文类型 &#xff08;1&#xff09;请求报文 …

软件设计模式原则(五)接口隔离原则

顾名思义&#xff0c;该原则说的是&#xff1a;客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。 一.定义 核心思想&#xff1a; 使用多个专门的接口比使用单一的总接口要好。一个类对另外一个类的依赖性应当是建立在最小的接口上的。一个接口…

博客文章SEO:提升博客排名和吸引更多读者的方法来啦!

互联网发展到现在&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;一直发挥着不可替代的作用。搜索引擎的流量往往更加定向&#xff0c;来自搜索引擎的流量转化率更高&#xff0c;可以帮助企业更好地实现销售和推广目标。因此&#xff0c;通过合理的SEO策略&#xff0c;你…