期刊配图:如何有效呈现回归、分类模型的评价指标

向量数据库大模型机器学习

picture.image

背景

picture.image

picture.image

picture.image

在数据科学与机器学习模型评估的过程中,如何直观地呈现多个模型的多个评价指标始终是一个重要的挑战。传统的柱状图或表格虽然可以准确反映指标,但往往难以在有限空间内实现多维信息的有效展示。该文献提供一种新颖的可视化方法,即通过结合雷达图和柱状图,将多模型、多指标的性能表现整合为直观且易读的环形柱状图——文献b可视化。这种方法在同时展示模型性能对比、突出关键指标的差异方面具有显著优势

代码实现

回归模型可视化

数据整理


          
import pandas as pd
          
import numpy as np
          
import matplotlib.pyplot as plt 
          
import warnings
          
warnings.filterwarnings("ignore")
          

          
plt.rcParams['font.family'] = 'Times New Roman'
          
plt.rcParams['axes.unicode_minus'] = False
          
df = pd.read_excel('2024-11-27-regression公众号Python机器学习AI.xlsx')
          

          
from sklearn.model_selection import train_test_split, KFold
          

          
X = df.drop(['Y'],axis=1)
          
y = df['Y']
          

          
# 划分训练集和测试集
          
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, 
          
                                                    random_state=42)
      

通过加载数据集并进行预处理,将特征变量X和目标变量y分开,并将数据集随机划分为训练集和测试集,方便后续用于回归模型的训练与评估;数据仅为演示目的,不具备实际应用意义

多模型回归性能评估


          
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor, ExtraTreesRegressor
          
from sklearn.svm import SVR
          
from sklearn.neighbors import KNeighborsRegressor
          
from sklearn.neural_network import MLPRegressor
          
from sklearn.metrics import r2_score, mean_squared_error, mean_absolute_error, explained_variance_score
          

          
# 结果存储列表
          
results = []
          

          
# 定义函数用于计算指标
          
def evaluate_model(model_name, y_test, y_pred):
          
    r2 = r2_score(y_test, y_pred)
          
    rmse = mean_squared_error(y_test, y_pred, squared=False)
          
    mae = mean_absolute_error(y_test, y_pred)
          
    mape = np.mean(np.abs((y_test - y_pred) / y_test)) if np.all(y_test != 0) else np.nan
          
    ev = explained_variance_score(y_test, y_pred)
          
    results.append({
          
        "R²": r2,
          
        "RMSE": rmse,
          
        "MAE": mae,
          
        "MAPE": mape,
          
        "EV": ev,
          
        "Model": model_name
          
    })
          

          
# RandomForestRegressor
          
rfr = RandomForestRegressor(random_state=42)
          
rfr.fit(X_train, y_train)
          
y_pred_rfr = rfr.predict(X_test)
          
evaluate_model("RFR", y_test, y_pred_rfr)
          

          
# ExtraTreesRegressor
          
etr = ExtraTreesRegressor(random_state=42)
          
etr.fit(X_train, y_train)
          
y_pred_etr = etr.predict(X_test)
          
evaluate_model("ETR", y_test, y_pred_etr)
          

          
# GradientBoostingRegressor
          
gbr = GradientBoostingRegressor(random_state=42)
          
gbr.fit(X_train, y_train)
          
y_pred_gbr = gbr.predict(X_test)
          
evaluate_model("GBR", y_test, y_pred_gbr)
          

          
# SVR
          
svr = SVR(kernel='rbf')
          
svr.fit(X_train, y_train)
          
y_pred_svr = svr.predict(X_test)
          
evaluate_model("SVR", y_test, y_pred_svr)
          

          
# MLPRegressor
          
bpnn = MLPRegressor(random_state=42, max_iter=1000)
          
bpnn.fit(X_train, y_train)
          
y_pred_bpnn = bpnn.predict(X_test)
          
evaluate_model("BPNN", y_test, y_pred_bpnn)
          

          
# KNeighborsRegressor
          
knn = KNeighborsRegressor()
          
knn.fit(X_train, y_train)
          
y_pred_knn = knn.predict(X_test)
          
evaluate_model("KNN", y_test, y_pred_knn)
          

          
# 转为 DataFrame 并显示
          
results_df = pd.DataFrame(results)
          
results_df
      

picture.image

训练多个回归模型(包括随机森林、梯度提升、支持向量机等),计算了每个模型的关键性能指标(如R^2、RMSE、MAE、MAPE、EV),并将结果保存到一个DataFrame中,需要说明的是,这里的代码仅为演示目的,直接使用了各模型的默认参数,未进行模型的超参数调优或深入优化,因此结果仅用于展示多模型性能指标的对比方法,并不代表实际模型在该数据的最佳表现

多模型评价指标柱状图对比


          
models = results_df['Model']
          
metrics = results_df.iloc[:, :-1].columns
          
fig, ax = plt.subplots(figsize=(10, 6))
          
width = 0.1  # 每个柱子的宽度
          
x = np.arange(len(metrics))  # 评价指标的位置
          
# 绘制每个模型的柱状图(竖直排列)
          
for i, model in enumerate(models):
          
    ax.bar(x + (i - 2.5) * width, results_df.iloc[i, :-1], width=width, label=model)
          
ax.set_xticks(x)
          
ax.set_xticklabels(metrics)
          
ax.set_ylabel('Performance Metric Values')
          
ax.set_title('Performance Metrics for Each Model')
          
ax.legend(title='Models')
          
plt.savefig("1.pdf", format='pdf', bbox_inches='tight', dpi=1200)
          
plt.show()
          
plt.tight_layout()
          
plt.show()
      

picture.image

通过柱状图展示各模型在不同性能指标上的表现对比,但这是一个较为基础的可视化方式,信息传递直观但美观性和信息层次感相对不足,难以充分展现多维对比的效果

环形柱状图:多模型多指标直观展示


          
from matplotlib.lines import Line2D
          
from matplotlib import cm
          

          
def plot_radar_bars(data, num_metrics, num_models):
          
    """
          
    参数:
          
    - data: 包含模型在各个评价指标上得分的DataFrame,必须包含模型列和评价指标列
          
    - num_metrics: 评价指标的数量
          
    - num_models: 模型的数量
          
    """
          
    ......
          
# 调用函数:例如5个指标和6个模型
          
plot_radar_bars(results_df, 5, 6)
      

picture.image

定义一个函数实现这种可视化,将所有模型及其评价指标汇总在一个图上,通过不同角度和颜色直观展示各模型在多个指标上的表现。相比之前的基础柱状图,这种方法不仅更美观,还增强了图表的层次感和信息密度,更便于对比和分析模型性能差异,同时通过标签和图例提升了整体的可读性,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系

分类模型可视化

多个分类模型性能评估与指标对比


          
import pandas as pd
          
import numpy as np
          
import matplotlib.pyplot as plt
          
from sklearn.model_selection import train_test_split
          
plt.rcParams['font.family'] = 'Times New Roman'
          
plt.rcParams['axes.unicode_minus'] = False
          

          
df = pd.read_excel('2024-11-23-classify公众号Python机器学习AI.xlsx')
          
# 划分特征和目标变量
          
X = df.drop(['y'], axis=1)
          
y = df['y']
          
# 划分训练集和测试集
          
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, 
          
                                                    random_state=42, stratify=df['y'])
          
                                                    
          
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score
          
from sklearn.tree import DecisionTreeClassifier
          
from sklearn.ensemble import RandomForestClassifier
          
from xgboost import XGBClassifier
          
from catboost import CatBoostClassifier
          
from sklearn.svm import SVC
          
from sklearn.neighbors import KNeighborsClassifier
          

          
# 初始化结果存储
          
results = []
          

          
# 定义函数计算并保存指标
          
def evaluate_model(model_name, model, X_test, y_test):
          
    y_pred = model.predict(X_test)
          
    y_prob = model.predict_proba(X_test)[:, 1] if hasattr(model, "predict_proba") else None
          

          
    # 计算指标
          
    accuracy = accuracy_score(y_test, y_pred)
          
    precision = precision_score(y_test, y_pred, average='weighted')
          
    recall = recall_score(y_test, y_pred, average='weighted')
          
    f1 = f1_score(y_test, y_pred, average='weighted')
          
    roc_auc = roc_auc_score(y_test, y_prob, multi_class='ovr') if y_prob is not None else np.nan
          

          
    # 存储结果
          
    results.append({
          
        "Accuracy": accuracy,
          
        "Precision": precision,
          
        "Recall": recall,
          
        "F1-score": f1,
          
        "ROC-AUC": roc_auc,
          
        "Model": model_name
          
    })
          

          
# Decision Tree
          
dt = DecisionTreeClassifier(random_state=42)
          
dt.fit(X_train, y_train)
          
evaluate_model("DT", dt, X_test, y_test)
          

          
# Random Forest
          
rf = RandomForestClassifier(random_state=42)
          
rf.fit(X_train, y_train)
          
evaluate_model("RF", rf, X_test, y_test)
          

          
# XGBoost
          
xgb = XGBClassifier(use_label_encoder=False, eval_metric='logloss', random_state=42)
          
xgb.fit(X_train, y_train)
          
evaluate_model("XGBoost", xgb, X_test, y_test)
          

          
# CatBoost
          
cat = CatBoostClassifier(verbose=0, random_state=42)
          
cat.fit(X_train, y_train)
          
evaluate_model("catBoost", cat, X_test, y_test)
          

          
# SVM
          
svm = SVC(probability=True, random_state=42)
          
svm.fit(X_train, y_train)
          
evaluate_model("SVM", svm, X_test, y_test)
          

          
# KNN
          
knn = KNeighborsClassifier()
          
knn.fit(X_train, y_train)
          
evaluate_model("KNN", knn, X_test, y_test)
          

          
# 转为 DataFrame 并显示
          
results_df = pd.DataFrame(results)
          
results_df
      

picture.image

训练多个分类模型(如决策树、随机森林、XGBoost等),计算并保存每个模型的关键性能指标(如准确率、精确率、召回率、F1分数和ROC-AUC),以便后续进行模型性能对比分析

分类模型指标的多雷达图可视化


          
metrics = ["Accuracy", "Precision", "Recall", "F1-score", "ROC-AUC"]
          
categories = results_df["Model"].tolist()
          
angles = np.linspace(0, 2 * np.pi, len(categories), endpoint=False).tolist()
          
angles += angles[:1]  
          

          
fig, axs = plt.subplots(2, 3, figsize=(15, 10), subplot_kw=dict(polar=True))
          
axs = axs.flatten()
          

          
for i, metric in enumerate(metrics):
          
    values = results_df[metric].tolist()
          
    values += values[:1]  # Close the radar
          
    axs[i].fill(angles, values, alpha=0.25, label=metric)
          
    axs[i].plot(angles, values, marker='o')
          
    axs[i].set_ylim(0, 1.001)
          
    axs[i].set_xticks(angles[:-1])
          
    axs[i].set_xticklabels(categories, fontsize=10)
          
    axs[i].set_title(metric, pad=20)
          
    axs[i].set_yticklabels([])
          

          
fig.delaxes(axs[-1])
          
plt.savefig("3.pdf", format='pdf', bbox_inches='tight', dpi=1200)
          
plt.tight_layout()
          
plt.show()
      

picture.image

上述代码通过多个雷达图分别展示分类模型在不同性能指标上的表现,是一种直观的指标可视化方法。然而,由于每个指标占用独立的子图,信息分散且整体美观性和信息集中度相较于环形柱状图稍显不足,不利于快速对比多模型的综合性能

环形柱状图:多模型多指标直观展示


          
from matplotlib.lines import Line2D
          
from matplotlib import cm
          

          
def plot_polar_bars(data, num_metrics, num_models):
          
    """
          
    参数:
          
    - data: 包含模型得分的 DataFrame,必须包含 'Model' 列和指标列
          
    - num_metrics: 指标数量
          
    - num_models: 模型数量
          
    """
          
    
          
plot_polar_bars(results_df, 5, 6)
      

picture.image

通过环形柱状图展示各分类模型在多个评价指标(如Accuracy、Precision、Recall、F1-score、ROC-AUC)上的表现。不同颜色代表不同指标,柱子的高度体现各模型在对应指标上的得分,这种可视化方法能够将多模型多指标的信息集中在一张图上,直观且清晰地展现模型性能的全局对比,同时提升了整体的美观性和信息传递效率。例如,在Accuracy指标上XGBoost表现最好,而在ROC-AUC指标上随机森林(RF)表现最佳。这种差异在分散的雷达图中难以直接观察,但环形柱状图通过高度集成的信息展示,能够更好地判别不同模型在不同指标上的差异,尤其在不同评价指标侧重方向不同时(如Accuracy关注整体预测准确性,适合样本均衡;ROC-AUC关注区分正负样本能力,适合样本不均衡),更能突出对比的价值,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系

往期推荐

SCI图表复现:整合数据分布与相关系数的高级可视化策略

SCI图表:基于相关性和标准差的多模型评价——泰勒图解析

期刊文章配图:基于分组折线图的多机器学习模型表现评估对比

复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性

SCI图表复现:优化SHAP特征贡献图展示更多模型细节

复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展

复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化

SCI图表复现:特征相关性气泡热图展示

一图胜千言:回归预测模型训练集与测试集的进阶可视化

期刊文章配图:基于雷达图的多机器学习模型表现评估对比

期刊文章配图:斯皮尔曼相关系数热图反应非线性变量相关性

picture.image

如果你对类似于这样的文章感兴趣。

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
字节跳动 XR 技术的探索与实践
火山引擎开发者社区技术大讲堂第二期邀请到了火山引擎 XR 技术负责人和火山引擎创作 CV 技术负责人,为大家分享字节跳动积累的前沿视觉技术及内外部的应用实践,揭秘现代炫酷的视觉效果背后的技术实现。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论