细说机器学习算法之ROC曲线用于模型评估

news2025/2/1 12:33:27

系列文章目录

第一章:Pyhton机器学习算法之KNN

第二章:Pyhton机器学习算法之K—Means

第三章:Pyhton机器学习算法之随机森林

第四章:Pyhton机器学习算法之线性回归

第五章:Pyhton机器学习算法之有监督学习与无监督学习

第六章:Pyhton机器学习算法之朴素贝叶斯

第七章:Pyhton机器学习算法之XGBoost

第八章:Pyhton机器学习算法之GBDT

第九章:Pyhton机器学习算法之岭回归

第十章:Pyhton机器学习算法之lasso回归

第十一章:Pyhton机器学习算法之逻辑回归

第十二章:Pyhton机器学习算法之ROC曲线


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

系列文章目录

前言

一、基本概念:

二、二分类ROC原理:

三、多分类ROC原理:

四、代码实战:

五、选择阈值:

六、适用场景:

总结



前言

ROC曲线(Receiver Operating Characteristic curve)是一种用于评价分类模型性能的工具,尤其适用于二分类问题,在多分类问题上也有相对广泛的应用。通过在不同阈值下计算模型的真阳性率(True Positive Rate, TPR)和假阳性率(False Positive Rate, FPR)来全面评估分类器的表现,随着机器学习的发展,尤其是在医疗诊断、欺诈检测和金融风险控制等领域,ROC曲线成为衡量分类器性能的标准方法


一、基本概念:

真阳性率(True Positive Rate, TPR):

也被称为召回率(Recall)或灵敏度(Sensitivity),是评估二分类模型性能的一个重要指标。它衡量的是在所有实际为正类的样本中,被模型正确预测为正类的比例。

假阳性率(False Positive Rate, FPR):

假阳性率反映了在所有实际为负类的样本中,被错误地预测为正类的样本所占的比例。

AUC值:

ROC曲线下的面积。AUC值介于0到1之间,AUC越接近1,模型的区分能力越强。一般情况下,AUC值可以这样理解

(1)0.5:模型没有区分能力,和随机猜测差不多

(2)0.5-0.7:模型具有较低的区分能力

(3)0.7-0.9:模型具有较好的区分能力

(4)0.9-1.0:模型的区分能力非常强

二、二分类ROC原理:

真阳性率(True Positive Rate, TPR):TPR = TP / (TP + FN)

其中,TP 表示真正例(True Positive),即实际为正类且被模型预测为正类的样本数;FN 表示假负例(False Negative),即实际为正类但被模型预测为负类的样本数。

真阳性率越高,说明模型在识别正类样本方面的能力越强,即模型能够识别出更多的实际正类样本。然而,提高真阳性率可能会以增加假阳性率(False Positive Rate, FPR)为代价,因为模型可能会将更多的负类样本误判为正类。

假阳性率(False Positive Rate, FPR):FPR = FP / (FP + TN) 

其中,FP表示假正例(False Positive),即实际为负类但被模型预测为正类的样本数;TN表示真负例(True Negative),即实际为负类且被模型预测为负类的样本数。

反映了模型或检测方法在区分负类样本时的能力,即模型将实际未患病的个体误判为患病的概率。

三、多分类ROC原理:

1.多分类问题中的宏平均ROC曲线:

(1)一对多(One-vs-Rest,OvR):将多分类问题中的每个类别当作正类,其他类别作为负类,分别计算每个类别的ROC曲线,并计算其AUC值。

宏平均ROC曲线:首先为每个类别分别计算ROC曲线,然后对这些曲线的TPR和FPR在每个阈值下进行平均,得到宏观的ROC曲线。

宏平均AUC:对所有类别的AUC值进行平均,得到一个全局的AUC值,衡量多分类模型的整体性能。

(2)一对一(One-vs-One,OvO):在每两个类别之间计算二分类的ROC曲线和AUC值,最后通过一定的加权方式计算整体的AUC。

2.扩展到多分类的宏平均ROC曲线:

(1)针对每一个类别,计算它与所有其他类别的ROC曲线,即将该类别视为正类,其他类别视为负类

(2)对于每一类ROC曲线,记录不同阈值下的TPR和FPR

(3)将所有类别的ROC曲线进行平均,得到宏观的ROC曲线

四、代码实战:

二分类模型:

#以上根据你的数据集训练二分类模型。。。。


#绘制roc曲线
from sklearn.metrics import roc_curve, auc
# 预测概率
y_score = rf_model.predict_proba(X_test)[:, 1]
# 计算ROC曲线
fpr_rf, tpr_rf, _ = roc_curve(y_test, y_score)roc_auc_rf = auc(fpr_rf, tpr_rf)

# 绘制ROC曲线
plt.figure(dpi=1200)
plt.plot(fpr_rf, tpr_rf, color='darkorange', lw=2, label='ROC curve (area = %0.4f)' % roc_auc_rf)
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver Operating Characteristic')
plt.legend(loc="lower right")
plt.savefig("Receiver Operating Characteristic_1.pdf", bbox_inches='tight')
plt.show()

多分类模型:

#以上为根据数据集训练多分类模型

from sklearn import metrics
from sklearn.preprocessing import label_binarize
# 预测并计算概率
ytest_proba_rf = rf_model.predict_proba(X_test)
# 将y标签转换成one-hot形式
ytest_one_rf = label_binarize(y_test, classes=[0, 1, 2])

# 宏平均法计算AUC
rf_AUC = {}
rf_FPR = {}
rf_TPR = {}

for i in range(ytest_one_rf.shape[1]):
    rf_FPR[i], rf_TPR[i], thresholds = metrics.roc_curve(ytest_one_rf[:, i], ytest_proba_rf[:, i])
    rf_AUC[i] = metrics.auc(rf_FPR[i], rf_TPR[i])
print(rf_AUC)


#合并所有的fpr并排列去重
rf_FPR_final = np.unique(np.concatenate([rf_FPR[i] for i in range(ytest_one_rf.shape[1])]))


# 计算宏平均
TPRrf_TPR_all = np.zeros_like(rf_FPR_final)
for i in range(ytest_one_rf.shape[1]):    
    rf_TPR_all += np.interp(rf_FPR_final, rf_FPR[i], rf_TPR[i])
rf_TPR_final = rf_TPR_all / ytest_one_rf.shape[1]


# 计算最终的宏平均
AUCrf_AUC_final = metrics.auc(rf_FPR_final, rf_TPR_final)AUC_final_rf = rf_AUC_final 
# 最终AUC
print(f"Macro Average AUC with Random Forest: {AUC_final_rf}")


plt.figure(figsize=(10, 10), dpi=1200)
# 使用不同的颜色和线型
plt.plot(rf_FPR[0], rf_TPR[0], color='#1f77b4', linestyle='-', label='Class 0 ROC  AUC={:.4f}'.format(rf_AUC[0]), lw=2)
plt.plot(rf_FPR[1], rf_TPR[1], color='#ff7f0e', linestyle='-', label='Class 1 ROC  AUC={:.4f}'.format(rf_AUC[1]), lw=2)
plt.plot(rf_FPR[2], rf_TPR[2], color='#2ca02c', linestyle='-', label='Class 2 ROC  AUC={:.4f}'.format(rf_AUC[2]), lw=2)
# 宏平均ROC曲线
plt.plot(rf_FPR_final, rf_TPR_final, color='#000000', linestyle='-', label='Macro Average ROC  AUC={:.4f}'.format(rf_AUC_final), lw=3)
# 45度参考线
plt.plot([0, 1], [0, 1], color='gray', linestyle='--', lw=2, label='45 Degree Reference Line')
plt.xlabel('False Positive Rate (FPR)', fontsize=15)
plt.ylabel('True Positive Rate (TPR)', fontsize=15)
plt.title('Random Forest Classification ROC Curves and AUC', fontsize=18)
plt.grid(linestyle='--', alpha=0.7)
plt.legend(loc='lower right', framealpha=0.9, fontsize=12)
plt.savefig('RF_optimized.pdf', format='pdf', bbox_inches='tight')
plt.show()

示意图:

五、选择阈值:

对于分类模型输出的每个预测概率或得分,选择一个阈值。如果预测概率或得分高于该阈值,则预测为正类;否则,预测为负类。

六、适用场景:

ROC曲线和AUC值提供了一个全面评估模型性能的指标,特别适用于不平衡数据集或当需要比较不同模型性能时。


总结

ROC曲线作为分类器评估的经典方法,在处理二分类和多分类问题时都具有广泛的应用。对于二分类问题,ROC曲线能够直观地展示模型的分类能力;在多分类问题中,通过宏平均ROC,可以得到一个全局的评价指标。AUC作为ROC曲线的衍生指标,为模型的比较提供了更简洁有效的方式。

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

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

相关文章

DeepSeek本地部署(windows)

一、下载并安装Ollama 1.下载Ollama Ollama官网:Ollama 点击"Download",会跳转至下载页面。 点击"Download for Windows"。会跳转Github进行下载,如下载速度过慢,可在浏览器安装GitHub加速插件。 2.安装Ollama 双击下载的安装文件,点击"Inst…

简要介绍C语言/C++的三目运算符

三元运算符是C语言和C中的一种简洁的条件运算符&#xff0c;它的形式为&#xff1a; 条件表达式 ? 表达式1 : 表达式2; 三元运算符的含义 条件表达式&#xff1a;这是一个布尔表达式&#xff0c;通常是一个比较操作&#xff08;如 >、<、 等&#xff09;。 表达式1&am…

SpringCloud系列教程:微服务的未来(十九)请求限流、线程隔离、Fallback、服务熔断

前言 前言 在现代微服务架构中&#xff0c;系统的高可用性和稳定性至关重要。为了解决系统在高并发请求或服务不可用时出现的性能瓶颈或故障&#xff0c;常常需要使用一些技术手段来保证服务的平稳运行。请求限流、线程隔离、Fallback 和服务熔断是微服务中常用的四种策略&…

STM32 对射式红外传感器配置

这次用的是STM32F103的开发板&#xff08;这里面的exti.c文件没有how to use this driver 配置说明&#xff09; 对射式红外传感器 由一个红外发光二极管和NPN光电三极管组成&#xff0c;M3固定安装孔&#xff0c;有输出状态指示灯&#xff0c;输出高电平灯灭&#xff0c;输出…

(动态规划路径基础 最小路径和)leetcode 64

视频教程 1.初始化dp数组&#xff0c;初始化边界 2、从[1行到n-1行][1列到m-1列]依次赋值 #include<vector> #include<algorithm> #include <iostream>using namespace std; int main() {vector<vector<int>> grid { {1,3,1},{1,5,1},{4,2,1}…

嵌入式C语言:什么是共用体?

在嵌入式C语言编程中&#xff0c;共用体&#xff08;Union&#xff09;是一种特殊的数据结构&#xff0c;它允许在相同的内存位置存储不同类型的数据。意味着共用体中的所有成员共享同一块内存区域&#xff0c;因此&#xff0c;在任何给定时间&#xff0c;共用体只能有效地存储…

QT简单实现验证码(字符)

0&#xff09; 运行结果 1&#xff09; 生成随机字符串 Qt主要通过QRandomGenerator类来生成随机数。在此之前的版本中&#xff0c;qrand()函数也常被使用&#xff0c;但从Qt 5.10起&#xff0c;推荐使用更现代化的QRandomGenerator类。 在头文件添加void generateRandomNumb…

【4Day创客实践入门教程】Day2 探秘微控制器——单片机与MicroPython初步

Day2 探秘微控制器——单片机与MicroPython初步 目录 Day2 探秘微控制器——单片机与MicroPython初步MicroPython语言基础开始基础语法注释与输出变量模块与函数 单片机基础后记 Day0 创想启程——课程与项目预览Day1 工具箱构建——开发环境的构建Day2 探秘微控制器——单片机…

[论文阅读] (37)CCS21 DeepAID:基于深度学习的异常检测(解释)

祝大家新春快乐&#xff0c;蛇年吉祥&#xff01; 《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座&#xff0c;并分享给大家&#xff0c;希望您喜欢。由于作者的英文水平和学术能力不高&#xff0c;需要不断提升&#xff0c;所以还请大家批评指正&#xff0…

Java面试题2025-并发编程进阶(线程池和并发容器类)

线程池 一、什么是线程池 为什么要使用线程池 在开发中&#xff0c;为了提升效率的操作&#xff0c;我们需要将一些业务采用多线程的方式去执行。 比如有一个比较大的任务&#xff0c;可以将任务分成几块&#xff0c;分别交给几个线程去执行&#xff0c;最终做一个汇总就可…

【算法应用】基于鲸鱼优化算法求解OTSU多阈值图像分割问题

目录 1.鲸鱼优化算法WOA 原理2.OTSU多阈值图像分割模型3.结果展示4.参考文献5.代码获取 1.鲸鱼优化算法WOA 原理 SCI二区|鲸鱼优化算法&#xff08;WOA&#xff09;原理及实现 2.OTSU多阈值图像分割模型 Otsu 算法&#xff08;最大类间方差法&#xff09;设灰度图像有 L L …

设计模式的艺术-策略模式

行为型模式的名称、定义、学习难度和使用频率如下表所示&#xff1a; 1.如何理解策略模式 在策略模式中&#xff0c;可以定义一些独立的类来封装不同的算法&#xff0c;每个类封装一种具体的算法。在这里&#xff0c;每个封装算法的类都可以称之为一种策略&#xff08;Strategy…

7. 马科维茨资产组合模型+金融研报AI长文本智能体(Qwen-Long)增强方案(理论+Python实战)

目录 0. 承前1. 深度金融研报准备2. 核心AI函数代码讲解2.1 函数概述2.2 输入参数2.3 主要流程2.4 异常处理2.5 清理工作2.7 get_ai_weights函数汇总 3. 汇总代码4. 反思4.1 不足之处4.2 提升思路 5. 启后 0. 承前 本篇博文是对前两篇文章&#xff0c;链接: 5. 马科维茨资产组…

安装Maven(安装包+步骤)

1. 安装: 通过网盘分享的文件&#xff1a;apache-maven-3.9.9 链接: https://pan.baidu.com/s/16AE_brICuw6sS0tC6tmE1Q?pwda74r 提取码: a74r --来自百度网盘超级会员v3的分享 2.新建应该系统变量: 3.path中添加bin文件夹路径 4.建议在这里建一个仓库文件夹 博主的: 5.I…

【云安全】云原生-K8S-搭建/安装/部署

一、准备3台虚拟机 务必保证3台是同样的操作系统&#xff01; 1、我这里原有1台centos7&#xff0c;为了节省资源和效率&#xff0c;打算通过“创建链接克隆”2台出来 2、克隆之前&#xff0c;先看一下是否存在k8s相关组件&#xff0c;或者docker相关组件 3、卸载原有的docker …

单细胞-第四节 多样本数据分析,下游画图

文件在单细胞\5_GC_py\1_single_cell\2_plots.Rmd 1.细胞数量条形图 rm(list ls()) library(Seurat) load("seu.obj.Rdata")dat as.data.frame(table(Idents(seu.obj))) dat$label paste(dat$Var1,dat$Freq,sep ":") head(dat) library(ggplot2) lib…

【算法】动态规划专题① ——线性DP python

目录 引入简单实现稍加变形举一反三实战演练总结 引入 楼梯有个台阶&#xff0c;每次可以一步上1阶或2阶。一共有多少种不同的上楼方法&#xff1f; 怎么去思考&#xff1f; 假设就只有1个台阶&#xff0c;走法只有&#xff1a;1 只有2台阶&#xff1a; 11&#xff0c;2 只有3台…

知识管理平台在数字经济时代推动企业智慧决策与知识赋能的路径分析

内容概要 在数字经济时代&#xff0c;知识管理平台被视为企业智慧决策与知识赋能的关键工具。其核心作用在于通过高效地整合、存储和分发企业内部的知识资源&#xff0c;促进信息的透明化与便捷化&#xff0c;使得决策者能够在瞬息万变的市场环境中迅速获取所需信息。这不仅提…

LabVIEW微位移平台位移控制系统

本文介绍了基于LabVIEW的微位移平台位移控制系统的研究。通过设计一个闭环控制系统&#xff0c;针对微位移平台的通信驱动问题进行了解决&#xff0c;并提出了一种LabVIEW的应用方案&#xff0c;用于监控和控制微位移平台的位移&#xff0c;从而提高系统的精度和稳定性。 项目背…

java求职学习day23

MySQL 单表 & 约束 & 事务 1. DQL操作单表 1.1 创建数据库,复制表 1) 创建一个新的数据库 db2 CREATE DATABASE db2 CHARACTER SET utf8; 2) 将 db1 数据库中的 emp 表 复制到当前 db2 数据库 1.2 排序 通过 ORDER BY 子句 , 可以将查询出的结果进行排序 ( 排序只…