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

系列文章目录

第一章: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.mzph.cn/pingmian/68679.shtml

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

相关文章

ROS_noetic-打印hello(√)

笔者创建的路径如下 进入到src, catkin_create_pkg helloworld roscpp rospy std_msgs Helloworld-C hello_C.cpp #include "ros/ros.h" int main(int argc, char *argv[]) { //执行 ros 节点初始化 ros::init(argc,argv,"hello"); //创…

冲刺蓝桥杯之速通vector!!!!!

文章目录 知识点创建增删查改 习题1习题2习题3习题4:习题5: 知识点 C的STL提供已经封装好的容器vector,也可叫做可变长的数组,vector底层就是自动扩容的顺序表,其中的增删查改已经封装好 创建 const int N30; vecto…

Golang 并发机制-2:Golang Goroutine 和竞争条件

在今天的软件开发中,我们正在使用并发的概念,它允许一次执行多个任务。在Go编程中,理解Go例程是至关重要的。本文试图详细解释什么是例程,它们有多轻,通过简单地使用“go”关键字创建它们,以及可能出现的竞…

尚硅谷spring框架视频教程——学习笔记一(IOC、AOP)

文章目录 前言一、控制反转(IOC)1. 底层原理2. 两种实现方式(接口)3. bean管理(基于xml方式)4. bean管理(基于注解方式) 二、面向切面编程(AOP)1. 底层逻辑2.…

C++并发编程指南07

文章目录 [TOC]5.1 内存模型5.1.1 对象和内存位置图5.1 分解一个 struct,展示不同对象的内存位置 5.1.2 对象、内存位置和并发5.1.3 修改顺序示例代码 5.2 原子操作和原子类型5.2.1 标准原子类型标准库中的原子类型特殊的原子类型备选名称内存顺序参数 5.2.2 std::a…

智慧园区如何融合五大技术实现全方位智能管理与服务创新

内容概要 在现代社会,智慧园区正逐渐成为管理与服务创新的风向标。以快鲸智慧园区管理系统为例,它为园区的数字化管理提供了一种全新的模式。该系统的核心在于如何充分应用物联网技术,自动化与信息化的结合,使得园区能够实现实时…

opencv裁剪视频区域

import cv2 # 打开视频文件 video_path input.mp4 cap cv2.VideoCapture(video_path) # 获取视频的帧率、宽度和高度 fps int(cap.get(cv2.CAP_PROP_FPS)) width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 定义裁剪区…

JxBrowser 7.41.7 版本发布啦!

JxBrowser 7.41.7 版本发布啦! • 已更新 #Chromium 至更新版本 • 实施了多项质量改进 🔗 点击此处了解更多详情。 🆓 获取 30 天免费试用。

【微服务与分布式实践】探索 Sentinel

参数设置 熔断时长 、最小请求数、最大RT ms、比例阈值、异常数 熔断策略 慢调⽤⽐例 当单位统计时⻓内请求数⽬⼤于设置的最⼩请求数⽬,并且慢调⽤的⽐例⼤于阈值,则接下来的熔断时⻓内请求会⾃动被熔断 异常⽐例 当单位统计时⻓内请求数⽬⼤于设置…

DeepSeek R1-Zero vs. R1:强化学习推理的技术突破与应用前景

📌 引言:AI 推理的新时代 近年来,大语言模型(LLM) 的规模化扩展成为 AI 研究的主流方向。然而,LLM 的扩展是否真的能推动 通用人工智能(AGI) 的实现?DeepSeek 推出的 R1…

python学opencv|读取图像(四十七)使用cv2.bitwise_not()函数实现图像按位取反运算

【0】基础定义 按位与运算:两个等长度二进制数上下对齐,全1取1,其余取0。按位或运算:两个等长度二进制数上下对齐,有1取1,其余取0。 按位取反运算:一个二进制数,0变1,1变0。 【1】…

【Pandas】pandas Series cumsum

Pandas2.2 Series Computations descriptive stats 方法描述Series.abs()用于计算 Series 中每个元素的绝对值Series.all()用于检查 Series 中的所有元素是否都为 True 或非零值(对于数值型数据)Series.any()用于检查 Series 中是否至少有一个元素为 T…

第十四讲 JDBC数据库

1. 什么是JDBC JDBC(Java Database Connectivity,Java数据库连接),它是一套用于执行SQL语句的Java API。应用程序可通过这套API连接到关系型数据库,并使用SQL语句来完成对数据库中数据的查询、新增、更新和删除等操作…

Cocos Creator 3.8 2D 游戏开发知识点整理

目录 Cocos Creator 3.8 2D 游戏开发知识点整理 1. Cocos Creator 3.8 概述 2. 2D 游戏核心组件 (1) 节点(Node)与组件(Component) (2) 渲染组件 (3) UI 组件 3. 动画系统 (1) 传统帧动画 (2) 动画编辑器 (3) Spine 和 …

游戏开发领域 - 游戏引擎 UE 与 Unity

游戏引擎 游戏引擎是用于开发电子游戏的软件框架,它提供图形渲染、物理模拟、音频处理、动画系统、脚本编写等功能,帮助开发者高效创建电子游戏 但是,游戏引擎也不仅限于游戏开发,还广泛应用于其他领域,例如&#xff…

低代码系统-产品架构案例介绍、轻流(九)

轻流低代码产品定位为零代码产品,试图通过搭建来降低企业成本,提升业务上线效率。 依旧是从下至上,从左至右的顺序 名词概述运维层底层系统运维层,例如上线、部署等基础服务体系内置的系统能力,发消息、组织和权限是必…

第一届“启航杯”网络安全挑战赛WP

misc PvzHE 去这个文件夹 有一张图片 QHCTF{300cef31-68d9-4b72-b49d-a7802da481a5} QHCTF For Year 2025 攻防世界有一样的 080714212829302316092230 对应Q 以此类推 QHCTF{FUN} 请找出拍摄地所在位置 柳城 顺丰 forensics win01 这个软件 云沙盒分析一下 md5 ad4…

基于Python的人工智能患者风险评估预测模型构建与应用研究(上)

一、引言 1.1 研究目标与内容 本研究旨在运用 Python 语言,整合多种人工智能技术,构建高精度、高可靠性且具有良好可解释性的患者风险评估预测模型,为医疗领域的临床决策提供强有力的支持。具体研究内容涵盖以下几个方面: 人工智能技术在风险评估中的应用研究:深入剖析机…

指针空值——nullptr(C++11)——提升指针安全性的利器

C11引入的nullptr是对指针空值的正式支持,它提供了比传统NULL指针更加安全和明确的指针空值表示方式。在C语言中,指针操作是非常基础且常见的,而如何安全地处理指针空值,一直是开发者关注的重要问题。本文将详细讲解nullptr的引入…

Linux C openssl aes-128-cbc demo

openssl 各版本下载 https://openssl-library.org/source/old/index.html#include <stdio.h> #include <string.h> #include <openssl/aes.h> #include <openssl/rand.h> #include <openssl/evp.h>#define AES_KEY_BITS 128 #define GCM_IV_SIZ…