背景
在数据科学与机器学习模型评估的过程中,如何直观地呈现多个模型的多个评价指标始终是一个重要的挑战。传统的柱状图或表格虽然可以准确反映指标,但往往难以在有限空间内实现多维信息的有效展示。该文献提供一种新颖的可视化方法,即通过结合雷达图和柱状图,将多模型、多指标的性能表现整合为直观且易读的环形柱状图——文献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
训练多个回归模型(包括随机森林、梯度提升、支持向量机等),计算了每个模型的关键性能指标(如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()
通过柱状图展示各模型在不同性能指标上的表现对比,但这是一个较为基础的可视化方式,信息传递直观但美观性和信息层次感相对不足,难以充分展现多维对比的效果
环形柱状图:多模型多指标直观展示
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)
定义一个函数实现这种可视化,将所有模型及其评价指标汇总在一个图上,通过不同角度和颜色直观展示各模型在多个指标上的表现。相比之前的基础柱状图,这种方法不仅更美观,还增强了图表的层次感和信息密度,更便于对比和分析模型性能差异,同时通过标签和图例提升了整体的可读性,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系
分类模型可视化
多个分类模型性能评估与指标对比
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
训练多个分类模型(如决策树、随机森林、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()
上述代码通过多个雷达图分别展示分类模型在不同性能指标上的表现,是一种直观的指标可视化方法。然而,由于每个指标占用独立的子图,信息分散且整体美观性和信息集中度相较于环形柱状图稍显不足,不利于快速对比多模型的综合性能
环形柱状图:多模型多指标直观展示
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)
通过环形柱状图展示各分类模型在多个评价指标(如Accuracy、Precision、Recall、F1-score、ROC-AUC)上的表现。不同颜色代表不同指标,柱子的高度体现各模型在对应指标上的得分,这种可视化方法能够将多模型多指标的信息集中在一张图上,直观且清晰地展现模型性能的全局对比,同时提升了整体的美观性和信息传递效率。例如,在Accuracy指标上XGBoost表现最好,而在ROC-AUC指标上随机森林(RF)表现最佳。这种差异在分散的雷达图中难以直接观察,但环形柱状图通过高度集成的信息展示,能够更好地判别不同模型在不同指标上的差异,尤其在不同评价指标侧重方向不同时(如Accuracy关注整体预测准确性,适合样本均衡;ROC-AUC关注区分正负样本能力,适合样本不均衡),更能突出对比的价值,代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系
往期推荐
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现Nature图表——基于PCA降维与模型预测概率的分类效果可视化
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考