背景
在机器学习和数据分析的过程中,评价指标的选择和展示至关重要。为了更直观地呈现不同模型的表现,本篇文章通过图表和数据表的结合,详细展示了在测试集上的五个关键指标:准确率(Accuracy)、敏感性(Sensitivity)、特异性(Specificity)、F1值(F1)、以及AUC值(AUC)。通过这种方式,不仅能够快速识别各个模型的优劣,还能够深入分析每个模型在不同评价维度上的具体表现,当然这种形式也可以引入到回归分析中参考往期文章——期刊配图:回归模型对比如何精美可视化训练集与测试集的评价指标
代码实现
数据整理
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
import warnings
# 忽略所有警告
warnings.filterwarnings("ignore")
df = pd.read_excel('2025-2-10公众号Python机器学习AI.xlsx')
from sklearn.model_selection import train_test_split
# 划分特征和目标变量
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.3,
random_state=42, stratify=df['y'])
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier, ExtraTreesClassifier
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
import xgboost as xgb
import lightgbm as lgb
# 设置随机种子
random_seed = 42
# 定义并训练模型1:逻辑回归
logistic_reg = LogisticRegression(random_state=random_seed)
logistic_reg.fit(X_train, y_train)
# 定义并训练模型2:决策树分类
decision_tree_class = DecisionTreeClassifier(random_state=random_seed)
decision_tree_class.fit(X_train, y_train)
# 定义并训练模型3:随机森林分类
random_forest_class = RandomForestClassifier(random_state=random_seed)
random_forest_class.fit(X_train, y_train)
# 定义并训练模型4:Extra Trees分类 (ET)
et_class = ExtraTreesClassifier(random_state=random_seed)
et_class.fit(X_train, y_train)
# 定义并训练模型5:K近邻分类
knn_class = KNeighborsClassifier()
knn_class.fit(X_train, y_train)
# 定义并训练模型6:XGBoost分类
xgb_class = xgb.XGBClassifier(random_state=random_seed)
xgb_class.fit(X_train, y_train)
# 定义并训练模型7:LightGBM分类
lgb_class = lgb.LGBMClassifier(random_state=random_seed, verbose=-1)
lgb_class.fit(X_train, y_train)
通过构建多种常见机器学习模型(如逻辑回归、决策树、随机森林、K近邻、XGBoost、LightGBM等)对一个模拟数据集进行训练,并准备对比它们的性能表现
性能计算
from sklearn.metrics import accuracy_score, confusion_matrix, f1_score, roc_auc_score, roc_curve
# 定义一个字典来存储每个模型的评价指标
metrics = {
'Model': [],
'Accuracy_train': [],
'Sensitivity_train': [],
'Specificity_train': [],
'F1_train': [],
'AUC_train': [],
'Accuracy_test': [],
'Sensitivity_test': [],
'Specificity_test': [],
'F1_test': [],
'AUC_test': []
}
# 定义模型列表
models = [logistic_reg, decision_tree_class, random_forest_class, et_class, knn_class, xgb_class, lgb_class]
model_names = ['LR', 'CART', 'RF', 'ET', 'KNN', 'XGBoost', 'LightGBM']
# 遍历模型,计算评价指标
for model, model_name in zip(models, model_names):
# 在训练集和测试集上进行预测
y_train_pred = model.predict(X_train)
y_test_pred = model.predict(X_test)
# 计算 accuracy
accuracy_train = accuracy_score(y_train, y_train_pred)
accuracy_test = accuracy_score(y_test, y_test_pred)
# 计算 confusion matrix,用于计算 sensitivity 和 specificity
cm_train = confusion_matrix(y_train, y_train_pred)
cm_test = confusion_matrix(y_test, y_test_pred)
# 从 confusion matrix 获取 TP, TN, FP, FN
tn_train, fp_train, fn_train, tp_train = cm_train.ravel()
tn_test, fp_test, fn_test, tp_test = cm_test.ravel()
# 计算 Sensitivity 和 Specificity
sensitivity_train = tp_train / (tp_train + fn_train)
specificity_train = tn_train / (tn_train + fp_train)
sensitivity_test = tp_test / (tp_test + fn_test)
specificity_test = tn_test / (tn_test + fp_test)
# 计算 F1 分数
f1_train = f1_score(y_train, y_train_pred)
f1_test = f1_score(y_test, y_test_pred)
# 计算 AUC-ROC
auc_train = roc_auc_score(y_train, model.predict_proba(X_train)[:, 1])
auc_test = roc_auc_score(y_test, model.predict_proba(X_test)[:, 1])
# 将结果存储到字典中
metrics['Model'].append(model_name)
metrics['Accuracy_train'].append(accuracy_train)
metrics['Sensitivity_train'].append(sensitivity_train)
metrics['Specificity_train'].append(specificity_train)
metrics['F1_train'].append(f1_train)
metrics['AUC_train'].append(auc_train)
metrics['Accuracy_test'].append(accuracy_test)
metrics['Sensitivity_test'].append(sensitivity_test)
metrics['Specificity_test'].append(specificity_test)
metrics['F1_test'].append(f1_test)
metrics['AUC_test'].append(auc_test)
metrics_df = pd.DataFrame(metrics)
metrics_df
通过遍历多个机器学习模型,计算并存储每个模型在训练集和测试集上的准确率、敏感性、特异性、F1值和AUC值等评价指标,从这些评价指标中可以看出,部分模型可能存在过拟合现象,但这里的重点是对模型的评价指标进行可视化展示,因此不必过多关注过拟合问题
可视化
fig, ax = plt.subplots(figsize=(10, 6))
# 设置绘图区背景色为淡灰色
ax.set_facecolor('#F0F0F0')
# 设置Y轴的总范围,并划分为5等份
ax.set_ylim(0, 1.2)
# 设置评价指标的名称及其对应的Y轴位置
evaluation_metrics = ['Accuracy', 'Sensitivity', 'Specificity', 'F1', 'AUC']
y_positions = [1.0, 0.8, 0.6, 0.4, 0.2] # 为每个指标分配位置
# 为每个评价指标绘制圆点
for i, metric in enumerate(evaluation_metrics):
ax.scatter(metrics_df['Model'], [y_positions[i]] * len(metrics_df),
s=metrics_df[f'{metric}_train'] * 500, # 根据训练集指标值调整圆点大小
label=metric,
alpha=0.6) # 设置透明度,避免圆点重叠
# 设置图表标签和标题,字体加粗
ax.set_ylabel('Evaluation Metrics', fontsize=12, fontweight='bold')
ax.set_xlabel('Model', fontsize=12, fontweight='bold')
ax.set_title('Model Comparison: Training Metrics', fontsize=14, fontweight='bold')
# 设置Y轴的标签位置
ax.set_yticks([1.0, 0.8, 0.6, 0.4, 0.2]) # 设置评价指标显示在这些位置
ax.set_yticklabels(evaluation_metrics, fontweight='bold') # 显示评价指标名称并加粗
# 调整X轴标签的角度,字体加粗
ax.set_xticklabels(metrics_df['Model'], rotation=45, ha='right', fontweight='bold')
ax.legend().set_visible(False)
plt.savefig("1.pdf", format='pdf', bbox_inches='tight', dpi=1200)
plt.tight_layout()
plt.show()
这里针对训练集创建一个基础的可视化图,展示了不同模型在训练集上的五个评价指标(准确率、敏感性、特异性、F1值和AUC)作为散点图。每个散点的大小是根据相应模型在训练集上的评价指标值调整的。这个图的背景色为淡灰色,圆点的透明度设置为0.6,以避免重叠。通过此可视化,我们可以初步比较各模型的训练效果。
随后,代码进一步对这个图进行细化增加细节,这个图依然保留了与前一个图的相似结构,但提供了更多视觉线索来帮助辨认和比较模型的表现。这个更复杂的版本为接下来的数据分析提供了更清晰的呈现
有时会着重展示测试集,为了进一步增强展示效果,还可以在图表下方添加了一个详细的表格,列出了每个模型在测试集上的五个评价指标,保留了三位小数。这种结合图表和表格的方式,有助于读者在视觉上快速识别每个模型的优劣,同时也能更精确地查看每个模型在各个评价维度上的具体值
最后还可以把这个训练集、测试集可视化合并在一个画布下进行展示,完整 代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系
往期推荐
聚类与解释的结合:利用K-Means聚类辅助SHAP模型解释并可视化
期刊配图:SHAP可视化改进依赖图+拟合线+边缘密度+分组对比
期刊配图:SHAP蜂巢图与柱状图多维组合解读特征对模型的影响
基于mRMR筛选和递归特征选择的多模型性能评估与AUC可视化对比
期刊配图:SHAP可视化进阶蜂巢图与特征重要性环形图的联合展示方法
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考