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 = [
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值