当前位置:首页>python>期刊图片复现|Python绘制多种机器学习模型(RF, XGBoost, CatBoost)的多分类性能综合评估雷达图

期刊图片复现|Python绘制多种机器学习模型(RF, XGBoost, CatBoost)的多分类性能综合评估雷达图

  • 2026-10-11 08:42:49
期刊图片复现|Python绘制多种机器学习模型(RF, XGBoost, CatBoost)的多分类性能综合评估雷达图

代码绘制成果展示

论文:Environmental gradients explain nearshore microplastic distribution patterns: insights from machine learning models
论文原图
三个雷达图分别用于对比机器学习模型在训练集(training set)、测试集(hold-out set)以及独立验证集(independent validation set)上的分类性能评估结果。每个雷达图包含15根箭头轴线,这些轴线按颜色被划分为三个区域以代表不同的预测模型CatBoost,随机森林,XGBoost。在每个模型对应的区域内,五根轴线依次被标记为C0至C4,对应任务中的五个具体分类类别。雷达图的中心点用一个带有黑色外框的白色实心圆遮挡代表径向坐标数值的起始底线;0.5和0.65的白色虚线同心圆作为衡量指标得分高低参考。雷达图主体部分由三个堆叠透明彩色多边形构成,代表了三种不同的性能评价指标精确率(Precision),召回率(Recall),F1分数(F1 score)。多边形的顶点在任意一根类别轴线上距离中心圆的远近,反映了特定模型在预测该特定类别时所获得的具体指标得分(顶点越靠近外围箭头,说明性能分数越高),最底部的图例阐明了线条颜色、填充色、节点形状与各分类模型及评价指标之间的详细映射关系。
仿图
多种配色

代码解释

第一部分

库的导入以及字体设置
# =========================================================================================# ====================================== 1. 环境设置 =======================================# =========================================================================================import numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom sklearn.model_selection import train_test_split, GridSearchCVfrom sklearn.metrics import precision_recall_fscore_support

第二部分

颜色库
# =========================================================================================# ======================================2.颜色库=======================================# =========================================================================================COLOR_SCHEMES = {    1: {'rf_main': '#3E7E38', 'xgb_main': '#1F618D', 'cb_main': '#8B2525', 'rf_edge': '#8FBC8F', 'xgb_edge': '#85C1E9', 'cb_edge': '#F1948A', 'f1_box': '#C5E0B4', 'rec_box': '#AED6F1', 'prec_box': '#F5C1C1'},}

第三部分

绘图函数:初始化画布,创建一个一行三列的画布,采用极坐标系。定义了3个子图的标题、对应的数据集名称、子图编号,以及在周围一圈分布的标签。根据15根轴线,将360度等分。将 Precision, Recall, F1 score 指标映射到具体的线色、填充色和标记形状。
# =========================================================================================# ======================================3.绘图函数=======================================# =========================================================================================def plot_radar_charts(radar_data_dict, scheme_id=1):    colors = COLOR_SCHEMES[scheme_id]  # 提取配色方案    # 创建画布    fig, axes = plt.subplots(1,  # 行                             3,  # 列                             figsize=(18, 7),  # 尺寸                             subplot_kw=dict(polar=True))  # 极坐标系    N = len(categories)  # 总类别,轴线数量    angles = [n / float(N) * 2 * np.pi for n in range(N)]  #均分360度,计算出每根轴线在极坐标系里的角度    angles += angles[:1]  #为了让多边形首尾相连形成闭合区域,将第一个角度添加到列表的最末尾    # 评价指标所对应的绘制样式(边框色、背景填充色、节点形状)    metric_styles = {        'Precision': {'line': colors['cb_main'], 'fill': colors['prec_box'], 'marker': '^'},        'Recall': {'line': colors['xgb_main'], 'fill': colors['rec_box'], 'marker': '^'},        'F1 score': {'line': colors['rf_main'], 'fill': colors['f1_box'], 'marker': '^'}    }

第四部分

绘图函数:循环配置3个子图。把0度设置在正北方,绘制方向为顺时针。设置最外围轮廓范围,配置外围类别标签,并根据位置设置对应的颜色。去掉默认的网格线、边框线,清空了默认的Y轴刻度,后面自己加。
    # 遍历子图对象    for i, ax in enumerate(axes.flat):        ax.set_theta_offset(np.pi / 2)  # 设置雷达图0度指向正上方        ax.set_theta_direction(-1)  # 顺时针方向        ax.set_ylim(0, 1.15)  # 径向范围        ax.set_xticks(angles[:-1])  # 将各轴线角度设为x轴刻度,排除最后一个用于闭合的重复点        ax.set_xticklabels(categories, fontsize=13)  # 设置x轴刻度字体大小        ax.tick_params(axis='x', pad=10)  # x轴刻度标签与雷达图之间的间距        ax.set_yticks([])  # 设置径向刻度        # labels = ax.set_yticklabels(['0.5', '0.65'], color="black", size=11)  #设置径向刻度标签文本        ax.set_rlabel_position(0)  # 设置径向刻度标签绘制在0度轴线

第五部分

绘图函数:绘制自定义的带箭头的径向线
        # 遍历绘制每根刻度轴线        for j, angle in enumerate(angles[:-1]):            # 绘制线            ax.plot([angle, angle],  # 起点和终点角度                    [0.2, 1.02],  # 径向起点、终点                    color=arrow_color,  # 颜色                    linewidth=1.5,  # 线粗细                    zorder=1)  # 层            # 绘制箭头            ax.annotate('',  # 文本                        xy=(angle, 1.2),  # 角度、径向                        xytext=(angle, 1.02),  # 角度、径向                        arrowprops=dict(arrowstyle="-|>",  # 样式                                        color=arrow_color,  # 颜色                                        lw=1.5,  # 箭头线条宽度                                        mutation_scale=16),  # 缩放倍率                        annotation_clip=False,  # 允许箭头画在子图默认边界外面                        zorder=1)  # 层

第六部分

绘图函数:绘制上面的封闭多边形。针对当前的数据集,提取三个模型特定评价指标在各自分类上的结果进行绘制。
        # 通过外层循环获取数据集名称        dataset_name = datasets[i]            # 绘制雷达图多边形外框和标记            ax.plot(angles,  # 角度                    values,  # 径向                    linewidth=0,  # 轮廓线宽度                    linestyle='-',  # 样式                    label=metric_name,  # 图例标签                    color=style['line'],  # 颜色                    marker=style['marker'],  # 节点标记                    markersize=7,  # 标记大小                    markerfacecolor=style['line'],  # 标记填充色                    markeredgecolor='white',  # 标记边缘色                    zorder=3)  # 层            # 多边形填充            ax.fill(angles,  # 角度                    values,  # 径向范围                    color=style['fill'],  # 填充色                    alpha=0.65,  # 透明度                    zorder=2)  # 层

第七部分

绘图函数:绘制参考的白色虚线圆与文本标注(表示刻度标注)。生成平滑的角度点来画圆。在中心位置绘制一个半径0.2的纯白色的实心圆覆盖底部的重叠点,加上黑色外圈,添加文本标注。添加子图标题和子图编号。
         # 构成完整圆周度数        theta = np.linspace(0, 2 * np.pi, 200)        # 0.5处的圆圈        ax.plot(theta,  # 角度                np.full_like(theta, 0.5),  # 半径                color='white',  # 颜色                linestyle='--',  # 样式                linewidth=1.8,  # 线宽                zorder=4)  # 层 #边框色                    alpha=0,  #透明度        # 子图编号        ax.text(-0.1,  # x                1.15,  # y                letters[i],  # 文本                transform=ax.transAxes,  # 坐标系                fontsize=18,  # 字体大小                fontweight='bold',  # 加粗                va='top',  # 垂直                ha='right')  # 水平

第八部分

绘图函数:图例设置以及绘图结果保存。
     # 手动创建填充色图例    legend_elements_models = [        Line2D([0],  # 占位               [0],  # 占位               color='w',  # 线段颜色               marker='s',  # 标记点               markerfacecolor=colors['rf_main'],  # 填充色               markeredgecolor=colors['rf_edge'],  # 边缘色               markersize=14,  # 大小               label='Random Forest'),  # 文字标签        Line2D([0], [0], color='w', marker='s', markerfacecolor=colors['xgb_main'], markeredgecolor=colors['xgb_edge'],               markersize=14, label='XGBoost'),        Line2D([0], [0], color='w', marker='s', markerfacecolor=colors['cb_main'], markeredgecolor=colors['cb_edge'],               markersize=14, label='CatBoost')    ]    legend_elements_metrics = [        (prec_tri, prec_box),        (rec_tri, rec_box),        (f1_tri, f1_box)    ]    labels_metrics = ['Precision', 'Recall', 'F1 score']  # 配置图例元素文本               handler_map={tuple: HandlerTuple(ndivide=None, pad=0.3)})    plt.subplots_adjust(wspace=0.3, bottom=0.22)  # 自动调节子图    # 保存    plt.savefig(fr'radar_charts_scheme_{scheme_id}.png', dpi=300,                bbox_inches='tight')    plt.savefig(fr'radar_charts_scheme_{scheme_id}.pdf', bbox_inches='tight')    plt.close()

第九部分

执行部分:数据读取,特征变量和目标变量分离。
# =========================================================================================# ======================================4.执行部分=======================================# =========================================================================================if __name__ == '__main__':    excel_filename = r'simulated_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  # 目标

第十部分

执行部分:模型训练及参数网格搜索,分别定义了RF、XGBoost、CatBoost等模型的参数网格选项。利用GridSearchCV进行交叉验证寻找最佳参数并保存。
    print("正在训练模型并进行超参数寻优")    # 保存筛选出来的带有最佳参数的三个模型    best_models = {}    # 模型名称    model_names = ['Random Forest', 'XGBoost', 'CatBoost']    # 超参数网格    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 = {        'Training': (X_train, y_train),        'Hold-out': (X_test, y_test),        'Independent': (X_ind, y_ind)    }    # 用于存储每个数据集下各模型的性能指标数据    radar_data_dict = {'Training': {}, 'Hold-out': {}, 'Independent': {}}            # 将三项指标按字典结构存储,以便画图时按指标调用            radar_data_dict[dataset_name][name] = {                'Precision': precision,                'Recall': recall,                'F1 score': f1            }

如何应用到你自己的数据

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

# 决定是否批量绘制plot_all = True

2.设置模型数据集保存路径,执行部分:

excel_filename = r'simulated_microplastic_data.xlsx' 

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

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

4.设置目标变量,执行部分:

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

5.设置特征变量,执行部分:

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

6.设置超参数,执行部分:

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

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

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

推荐

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

获取方式

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

最新文章

随机文章