Python:使用随机森林分类器进行模型评估:ROC 曲线与 AUC 指标计算
前言
这段代码的目标是使用 随机森林分类器(Random Forest Classifier) 来进行二分类任务,并基于每个数据子集计算 ROC 曲线(Receiver Operating Characteristic Curve)以及 AUC(Area Under Curve)。
一、步骤
代码执行以下步骤:
数据预处理:按列选择目标变量和特征:每次循环时,从 newdata 数据中选择前14列作为特征(X),并选择第14列之后的某一列作为目标变量(y)。处理缺失值和无效值:通过将数据转换为数值类型,并删除包含 NaN 或无效值(如 -9999)的行,确保数据的干净和有效。数据标准化:使用 标准化(StandardScaler) 将特征矩阵 X 转换为标准化数据,使得数据的均值为0,标准差为1,从而确保每个特征对模型的贡献是均衡的。训练和验证数据集划分:在每轮循环中,数据被划分为训练集和验证集,比例为 2/5 和 3/5。此划分方式通过计算 split_index 和 train_index 来实现,后续用训练集训练模型,并在验证集上评估性能。模型训练与评估:训练:使用 RandomForestClassifier 对训练集数据进行训练。模型的参数包括 n_estimators=1000(树的数量)和 max_depth=None(树的深度不限制)。验证与 ROC 曲线计算:使用训练好的分类器在验证集上进行预测,并计算 ROC 曲线 和 AUC。ROC 曲线描绘了模型分类性能在不同决策阈值下的变化,AUC 是 ROC 曲线下的面积,表示模型的分类能力。通过 RocCurveDisplay.from_estimator 来计算并显示这些值。存储和平均化性能:曲线插值:为了绘制更平滑的ROC曲线,使用 np.interp 方法对每次计算得到的曲线进行插值,使其与均匀的 mean_fpr 对应。存储每轮(5次)的 TPR(True Positive Rate) 和 AUC,并计算所有折(fold)上的平均 TPR 和 AUC。绘制最终 ROC 曲线:最后,在单一的图表上绘制所有 5 次训练得到的 ROC 曲线,并标注每个模型的 AUC 值,显示在图例中。图表定制:为了符合出版标准,设置了图表的样式,包括坐标轴的宽度、字体大小、图例位置等。使用 Arial 字体 并调整了 ax1(绘制 ROC 曲线的轴)的刻度和标签样式。
代码的核心目的:
模型评估:使用随机森林分类器对数据进行训练,评估模型的分类性能。
ROC 和 AUC 计算:对每个模型计算并展示其 ROC 曲线 和 AUC,这些是评估分类模型性能的常用指标。
多次交叉验证:通过多次训练和评估(5次),保证模型在不同数据子集上的稳健性和泛化能力。
绘图和展示:生成一张带有多个模型 ROC 曲线的图,直观展示各个模型的表现。
代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import RocCurveDisplay, auc
from sklearn.model_selection import StratifiedKFold
from sklearn.preprocessing import StandardScaler
import xgboost as xgb
import numpy as np
import pandas as pd
import os
from matplotlib.font_manager import FontProperties# 创建一个字体属性对象
font_prop = FontProperties(family='Arial', size=20)#%%读取数据 设置默认路径10
outdir='/DATA/'
random_state = np.random.RandomState(0)
fig1, ax1 = plt.subplots(1, 1, figsize=(8, 8)) # 这里设置为 1x1 只包含一个图
Factors= pd.read_excel('T.xlsx', sheet_name='Factors')
MSWEP=pd.read_excel('T.xlsx', sheet_name='MSWEP')
#%%
pres = ['A','B','C']
# 创建子目录(如果不存在)
label_dir = os.path.join(outdir, 'GPM')
os.makedirs(label_dir, exist_ok=True)
mean_fprs = []
mean_tprs = []
mean_aucs = []
std_aucs = []
Factorsnew=Factors.iloc[:, 0:14]
MSWEPdwi = MSWEP.iloc[:, 0:10] ** 0.5
newdata= pd.concat([Factorsnew, MSWEPdwi], axis=1)#根据字符串变量 pre_name 中存储的列名来获取对应的 DataFrame。这种方式可以动态地根据字符串变量来执行代码
for i in range(5):dwidata= pd.concat([newdata.iloc[:, 0:14], newdata.iloc[:, i+14]], axis=1)#根据字符串变量 pre_name 中存储的列名来获取对应的 DataFrame。这种方式可以动态地根据字符串变量来执行代码# 查找包含NaN值的索引dwidata = dwidata.apply(pd.to_numeric, errors='coerce') nan_indices = np.isnan(dwidata)# 删除包含NaN值的行dwidata= dwidata[~np.any(nan_indices, axis=1)]dwidata = dwidata.loc[~dwidata.isin([-9999]).any(axis=1)]y = pd.concat([dwidata.iloc[:, 13]], axis=1)X=pd.concat([dwidata.iloc[:, 0:13],dwidata.iloc[:, 14]], axis=1)scaler = StandardScaler()X= scaler.fit_transform(X)y=y.values#让y重新排列不再有原始序列,因为X标准化过后会生成新的序列y = y.ravel()#将 y 转换为一维数组形式n_splits = 5cv = StratifiedKFold(n_splits=n_splits)classifier = RandomForestClassifier(n_estimators=1000, max_depth=None,random_state=42)tprs = []aucs = []mean_fpr = np.linspace(0, 1, 100)fig, ax = plt.subplots(figsize=(6, 6))for fold, (train, test) in enumerate(cv.split(X, y)):classifier.fit(X[train], y[train])viz = RocCurveDisplay.from_estimator(classifier,X[test],y[test],name=f"ROC fold {fold}",alpha=0.3,lw=1.5,ax=ax,#plot_chance_level=(fold == n_splits - 1),)plt.close('all')ax.clear() # 清空绘图区域 将上面的交叉验证图清除interp_tpr = np.interp(mean_fpr, viz.fpr, viz.tpr)interp_tpr[0] = 0.0tprs.append(interp_tpr)aucs.append(viz.roc_auc)mean_tpr = np.mean(tprs, axis=0)mean_tpr[-1] = 1.0mean_auc = auc(mean_fpr, mean_tpr)std_auc = np.std(aucs)mean_fprs.append(mean_fpr)mean_tprs.append(mean_tpr)mean_aucs.append(mean_auc)std_aucs.append(std_auc)# # Plot all ROC curves together after the loop
for i in range(len(mean_fprs)):ax1.plot(mean_fprs[i],mean_tprs[i],label=f"{pres[i]} (AUC = {mean_aucs[i]:.2f})",lw=2,alpha=0.8,)ax1.legend(loc="best",prop={'size': 10, 'family': 'Arial'}, frameon=False)
ax1.set_xlabel("False Positive Rate", fontsize=15, fontname='Times New Roman')
ax1.set_ylabel("True Positive Rate", fontsize=15, fontname='Times New Roman')
ax1.text(0.1, 1.2, '(a)', transform=ax1.transAxes, fontsize=20, va='top', fontproperties=font_prop)# 设置ax1的样式
ax1.spines['bottom'].set_linewidth(1.5)
ax1.spines['left'].set_linewidth(1.5)
ax1.spines['top'].set_linewidth(1.5)
ax1.spines['right'].set_linewidth(1.5)
ax1.tick_params(axis='both', width=1.5,labelsize=15)
ax1.set_ylim(0.7, 1.1)font = { 'size': 15, 'family':'Arial'} # xlabes
x1_label = ax1.get_xticklabels()
[x1_label_temp.set_font(font) for x1_label_temp in x1_label]
x1_label = ax1.get_yticklabels()
[x1_label_temp.set_font(font) for x1_label_temp in x1_label]del X
del yfig1.show()
print('done')
总结
这段代码的目的是通过 RandomForestClassifier 对数据进行训练并评估其分类性能,通过多轮训练、验证、计算 ROC 曲线 和 AUC,最终生成一张汇总图,比较不同模型的表现。这种方法广泛应用于分类任务的模型评估,特别是在需要评估多个模型或参数组合
相关文章:

Python:使用随机森林分类器进行模型评估:ROC 曲线与 AUC 指标计算
前言 这段代码的目标是使用 随机森林分类器(Random Forest Classifier) 来进行二分类任务,并基于每个数据子集计算 ROC 曲线(Receiver Operating Characteristic Curve)以及 AUC(Area Under Curve…...
数据库表约束完全指南:提升数据完整性和准确性
数据库表约束完全指南:提升数据完整性和准确性 在数据库设计中,表约束是确保数据完整性和准确性的关键工具。本文将详细介绍各种类型的表约束及其使用方法,包括非空约束、唯一约束、主键约束、外键约束、默认值约束、检查约束以及自动递增约…...

【JavaEE】多线程(6)
一、用户态与内核态 【概念】 用户态是指用户程序运行时的状态,在这种状态下,CPU只能执行用户态下的指令,并且只能访问受限的内存空间 内核态是操作系统内核运行时的状态,内核是计算机系统的核心部分,CPU可以执行所有…...

BERT和RoBERTa;双向表示与单向的简单理解
目录 BERT和RoBERTa大型预训练语言模型 BERT的原理 RoBERTa的原理 举例说明 双向表示与单向的简单理解 除了预训练语言模型,还有什么模型 一、模型类型与结构 二、训练方式与数据 三、应用场景与功能 四、技术特点与优势 BERT和RoBERTa大型预训练语言模型 BERT(Bi…...
Pytorch使用手册-计算机视觉迁移学习教程(专题十三)
在本教程中,你将学习如何使用迁移学习训练一个卷积神经网络进行图像分类。更多关于迁移学习的内容可以参考 CS231n 课程笔记。 引用课程笔记中的内容: 实际上,很少有人从头开始训练一个完整的卷积网络(随机初始化),因为拥有足够大数据集的情况相对罕见。相反,通常会在非…...
Jackson - Java对象与JSON相互转换
在这篇文章中,我将向您展示如何使用Jackson-databind API来实现Java对象与JSON之间的绑定,以及如何将JSON数据转换为Java对象。 对于Java开发者来说,将JSON转换为Java对象及反向操作是一个常见的任务,因此我将通过示例演示如何完…...
怎麼解決路由器IP地址衝突?
路由器IP地址衝突通常發生在網路中有兩個設備嘗試使用相同的IP地址時。這種衝突會導致網路連接問題,因為每個設備需要一個唯一的IP地址才能正常通信。 1. 重啟設備 重啟路由器和設備:有時候簡單的重啟可以解決問題,設備重新獲取一個新的IP地…...

趣味数学 2.3.7 | 完全免费,无注册登录,简约纯净
趣味数学是一款完全免费的数学学习软件,支持安卓系统。它无需登录注册,界面简约纯净,分类详细,涵盖趣味数学、数学初练、应用计算、数字推理、图形推理、数字2048、题目练习和数学知识等多个分类。每个分类包含丰富的题目和关卡&a…...

Oracle ASM特性介绍和增删盘操作
1. 介绍 1.1. 在没有ASM之前ORACLE数据库靠什么去解决存储问题: 裸设备:裸设备就是没有被文件系统格式化的分区或者是直接挂载到操作系统上的磁盘。ORACLE可以直接将数据写入到裸设备中,读写能非常优异。像ORACLE的数据文件、控制文件、REDO日志在过去…...
深度优先搜索迷宫路径
深度优先搜索迷宫路径 问题描述 我们需要编写一个程序,通过深度优先搜索(DFS)找到从迷宫左上角到右下角的一条通路。 迷宫的表示: 迷宫由 0 和 1 构成的二维数组表示。0 表示可以走的路径,1 表示障碍。用户输入迷宫的…...
多媒体技术的 发展阶段----高中信息技术教资面试
上课,同学们好!请坐 在正式上课之前,老师带来 了一段微课视频,请同学们认真观看大屏幕。等下来回答老师的问题。 好,视频播放完成了,现在老师想问问大家。大家从视频中都看到了什么尼?好&…...

行为型设计模式之《责任链模式》实践
定义 责任链模式(Chain Of Responsibility Pattern)顾名思义,就是为请求创建一条处理链路,链路上的每个处理器都判断是否可以处理请求,如果不能处理则往后走,依次从链头走到链尾,直到有处理器可…...

中酱黑松露手工古法酱油,邂逅独特 “酱油红”
在美食的世界里,调味品往往扮演着画龙点睛的角色,它们虽不似主食材那般夺目,却能悄无声息地赋予菜肴灵魂与韵味。而今天,要带大家走进的,便是中酱手工古法酱油所营造出的独特美味天地,去领略那一抹别具魅力…...
Java NIO channel
channel(通道),byteBuffer(缓冲区),selector(io多路复用),通道FileChannel,SocketChannel的transferTo,transferFrom,MappedByteBuffer实现了零拷贝。 JVM调操作系统方法,read,write,都可以送字…...

智能交通(8)——腾讯开悟智能交通信号灯调度赛道
本文档用于记录参加腾讯开悟智能信号灯调度赛道的模型优化过程。官方提供了dqn和target_dqn算法,模型的优化在官方提供的代码基础上进行。最终排名是在榜单16,没能进入最后的决赛。 一.赛题介绍 赛题简介:在本地赛题中,参赛团队…...

ip所属地址是什么意思?怎么改ip地址归属地
在数字化时代,IP地址作为网络设备的唯一标识符,不仅关乎设备间的通信,还涉及到用户的网络身份与位置信息。IP所属地址,即IP地址的归属地,通常反映了设备连接互联网时的地理位置。本文将深入解析IP所属地址的含义&#…...

攻防世界 ctf刷题 新手区1-10
unserialize3 因为我上个笔记写了 php返序列化 所以先趁热打铁 看这个题目名字 我们就知道是 反序列化呀 因为flag有值所以 我们先输个 111 看看有没有线索 没线索但是这边 有个发现就是他是使用get方式传参的 可能他会把我们的输入 进行传入后台有可能进行反…...
Node做一个自动删除指定文件和文件夹工具
node14 可以搭配脚手架工具实现自动实现删除 // 引入path模块,用于处理文件路径 const path require(path); // 引入fs模块的promises API,用于异步文件操作 const fs2 require(fs).promises; // 引入fs模块,用于同步文件操作 const fs …...

陈若尧新歌《一来二去》陆续登陆全球音乐平台
由青年演员,歌手陈若尧带来的全新创作单曲《一来二去》由索尼音乐发行,于2024年11月18日陆续全球上线。这也是陈若尧与索尼音乐合作的第一首单曲。探索古典风格与流行音乐的新结合。歌曲上线不久,就因优美抒情的动人旋律,诗意而意味深远的歌词…...

【Docker】针对开发环境、测试环境、生产环境如何编排?
目录 一、引言 二、Docker Compose 文件基础 三、针对不同环境的 Docker 编排 开发环境 测试环境 生产环境 四、配置文件全局变量的编写 五、总结 一、引言 在软件开发和部署的过程中,不同的环境有着不同的需求和配置。Docker 作为一种强大的容器化技术&…...

网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...