前言
这段代码的目标是使用 随机森林分类器(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 = [

最低0.47元/天 解锁文章
1318

被折叠的 条评论
为什么被折叠?



