当前位置:首页>python>期刊图片复现|Python进行RF、XGB、CatBoost分类任务多模型评估与混淆矩阵可视化

期刊图片复现|Python进行RF、XGB、CatBoost分类任务多模型评估与混淆矩阵可视化

  • 2026-10-11 08:44:38
期刊图片复现|Python进行RF、XGB、CatBoost分类任务多模型评估与混淆矩阵可视化

代码绘制成果展示

论文:Environmental gradients explain nearshore microplastic distribution patterns: insights from machine learning models
论文原图
仿图
3x3布局混淆矩阵汇总结果图,分别评估了Random Forest、XGBoost 和 CatBoost 三种模型在训练集(On training set)、测试集/留出集(On hold-out set)以及独立验证集(On independent set)上的分类表现。每一列代表不同的分类模型,每一行代表不同的数据集。整幅图采用渐变色调来直观呈现预测准确率,对角线上的深色块代表了模型预测值与真实值的高度一致性。从结果看,第一行的训练集表现最为完美,三大模型的对角线百分比几乎均达到 100%,显示了模型极强的学习能力;而在第二行的留出集和第三行的独立验证集中,虽然在非对角线区域出现了少量的误分类现象,但对角线主要区域的准确率依然普遍保持在70%至100%之间,尤其是随机森林和XGBoost在独立验证集上表现出了非常稳健的泛化能力。
多种配色

代码解释

第一部分

库的导入以及字体设置
# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsfrom matplotlib.colors import LinearSegmentedColormapfrom sklearn.model_selection import train_test_split, GridSearchCV

第二部分

颜色库设置
# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {    1: ["#39738A", "#D0DFE3", "#EB7125"],}

第三部分

绘图函数:配色方案提取,创建画布,定义模型名称、子图编号
# =========================================================================================# ======================================3.绘图函数=======================================# =========================================================================================def plot_confusion_matrices(matrix_data, scheme_id):    current_colors = COLOR_SCHEMES.get(scheme_id, COLOR_SCHEMES[1]) #提取配色方案    current_cmap = LinearSegmentedColormap.from_list("custom_cmap", current_colors) #创建线性渐变颜色映射    #创建画布    fig, axes = plt.subplots(3, 3, figsize=(14, 13))    titles = ['Random Forest', 'XGBoost', 'CatBoost'] #模型标题    letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] #子图编号

第四部分

绘图函数:绘制基础热力图
    #遍历每一个子图    for i, ax in enumerate(axes.flat):        ax.invert_yaxis() #翻转Y轴刻度        #遍历边框线        for _, spine in ax.spines.items():            spine.set_visible(True) #可见            spine.set_color('black') #颜色            spine.set_linewidth(1.5) #粗细        #设置刻度        ax.tick_params(axis='both', #x、y                       which='major', #主刻度线                       width=2, #宽                       length=5, #长                       color='black') #颜色

第五部分

绘图函数:根据背景色的深浅来设置格子内的标注文本
        #遍历行        for y in range(5):                    rgb = current_cmap(val / 100.0) #将百分比归一化到0-1,获取对应背景色的RGB值                    luminance = 0.299 * rgb[0] + 0.587 * rgb[1] + 0.114 * rgb[2] #计算背景色的明暗程度                    text_color = 'white' if luminance < 0.5 else 'black' #若背景暗则采用白色,反之采用黑色                    #格子内文本                    ax.text(x + 0.5, #x                            y + 0.5, #y                            f"{int(np.round(val))}%", #文本                            ha='center', #水平                            va='center', #垂直                            color=text_color, #颜色                            fontsize=12, #字体大小                            fontweight='bold') #加粗

第六部分

绘图函数:设置x、y轴的刻度、子图编号、标题等内容
        ax.set_xticks(np.arange(5) + 0.5) #x轴的主刻度位置        ax.set_xticklabels([0, 1, 2, 3, 4], fontsize=12) #x轴刻度标注        ax.set_yticks(np.arange(5) + 0.5) #y轴刻度位置        ax.set_yticklabels([0, 1, 2, 3, 4], fontsize=12) #y轴刻度标注        ax.set_xlabel('True_Class', fontsize=16, labelpad=8) #x轴标题        ax.set_ylabel('Predicted class', fontsize=16, labelpad=8) #y轴标题        #子图编号        ax.text(-0.15, #x                1.02, #y                letters[i], #字母                transform=ax.transAxes, #坐标系                fontsize=16, #字体大小                fontweight='bold', #加粗                va='bottom', #垂直                ha='right') #水平

第七部分

绘图函数:颜色条设置
    #颜色条坐标轴    cbar_ax = fig.add_axes([0.94, #左                            0.35, #下                            0.02, #宽                            0.3]) #高    #构建一个数据到颜色的可映射对象    sm = plt.cm.ScalarMappable(cmap=current_cmap,norm=plt.Normalize(vmin=0, vmax=100))    cbar.outline.set_color('black') #外框线色    cbar.outline.set_linewidth(1.5) #线宽    cbar.ax.tick_params(length=0)  #去掉颜色条刻度线

第八部分

执行部分:数据加载与提取
# =========================================================================================# ======================================4.执行部分=======================================# =========================================================================================if __name__ == '__main__':    excel_filename = r'microplastic_data.xlsx' #原始数据路径    df_main = pd.read_excel(excel_filename) #读取    X_main = df_main.drop(columns=['Target_Class']).values #特征    y_main = df_main['Target_Class'].values #目标    # 划分数据    X_train, X_test, y_train, y_test = train_test_split(X_main, y_main, test_size=0.2, random_state=42)    ind_excel_filename = r'independent_validation_data.xlsx' #独立验证数据    df_ind = pd.read_excel(ind_excel_filename) #读取    X_ind = df_ind.drop(columns=['Target_Class']).values #特征    y_ind = df_ind['Target_Class'].values  #目标

第九部分

执行部分:交叉验证与网格搜索
    # 保存筛选出来的带有最佳参数的三个模型    best_models = {}    # 模型名称    model_names = ['Random Forest', 'XGBoost', 'CatBoost']    # RF超参数网格    rf_param = {'n_estimators': [50, 100],                'max_depth': [5, 10, None]}    # 配置网格搜索    cb_grid = GridSearchCV(CatBoostClassifier(random_state=42, verbose=0), cb_param, cv=3, n_jobs=-1)    cb_grid.fit(X_train, y_train)#拟合    best_models['CatBoost'] = cb_grid.best_estimator_ #最佳CatBoost模型

第十部分

执行部分:计算混淆矩阵及绘图执行
    # 需要评估的数据集字典,训练集、测试集和独立验证集    evaluation_datasets = [(X_train, y_train),                           (X_test, y_test),                           (X_ind, y_ind)]    matrix_data = [] #存放混淆矩阵数据    #遍历三种不同的评估数据集    for X_eval, y_eval in evaluation_datasets:        #遍历模型        for name in model_names:            #保存            matrix_data.append(cm_percentage)

如何应用到你自己的数据

1.设置是一次绘制一张图还是一次性绘制出所有配色的图,执行部分:

plot_all = True

2.设置训练集和测试集的全量数据集的保存路径,执行部分:

excel_filename = r'microplastic_data.xlsx' #原始数据路径

3.设置独立验证数据集的保存路径,执行部分:

ind_excel_filename = r'independent_validation_data.xlsx' #独立验证数据

4.提取特征数据,执行部分:

X_main = df_main.drop(columns=['Target_Class']).values #特征

5.提取目标数据,执行部分:

y_main = df_main['Target_Class'].values #目标

6.定义模型名称,执行部分:

model_names = ['Random Forest', 'XGBoost', 'CatBoost']

7.设置模型超参数网格,执行部分:

rf_param = {'n_estimators': [50, 100],            'max_depth': [5, 10, None]}

8.设置子图编号,执行部分:

etters = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] #子图编号

9.设置绘图结果的保存地址,执行部分:

plt.savefig(fr'confusion_matrices{scheme_id}.png', dpi=300, bbox_inches='tight')

推荐

期刊图片复现|Python绘制二维偏依赖PDP图
期刊复现|python绘制基于SHAP分析和GAM模型拟合的单特征依赖图
期刊复现|用Python绘制SHAP特征重要性总览图、依赖图、双特征交互效应SHAP图,解锁XGBoost模型的终极奥秘
期刊图片复现|Python绘制shap重要性蜂巢图+单特征依赖图+交互效应强度气泡图+交互效应依赖图(回归+二分类+分类)

获取方式

公众号中的所有所有的免费代码都已经下架了,都并入到付费部分里了,付费合集代码和数据的购买通道已经开通,全部合集100元,后续将会持续更新,决定购买请后台私信我,注意只会分享练习数据和代码文件,不会提供答疑服务,代码文件中已经包含了每行代码的完整注释,购买前请确保真的需要!!!

最新文章

随机文章