背景
本篇文章将带领大家复现一篇模型评估的可视化,帮助大家更好地理解如何比较模型在不同指标上的表现,将通过在训练集和测试集上评估模型的准确率、灵敏度、特异性等关键指标,直观地分析模型的优缺点,并最终得出最佳的模型选择策略
图D、E展示了六种不同预测模型(RF, KNN, Logistic, GNB, SVM, MLP)在训练集和测试集上的评估指标,以便比较它们的性能,这些指标包括准确率(accuracy)、灵敏度(sensitivity)、特异性(specificity)、正预测值(Positive predictive value)、负预测值(Negative predictive value)、F1分数(F1 score)和Kappa分数(Kappa score)
左图(D)表示各模型在训练集上的表现,而右图(E)则是测试集上的表现。通过对比训练集和测试集的结果,可以分析模型的泛化能力和稳定性,找出在特定指标上表现最优的模型,同时判断是否存在过拟合或欠拟合的情况。这种比较能够帮助选择最适合的数据集和任务的预测模型
代码实现
数据读取处理
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
# 读取数据
df = pd.read_excel('2024-11-1-公众号Python机器学习AI—class.xlsx')
# 划分特征和目标变量
X = df.drop(['目标'], axis=1)
y = df['目标']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42, stratify=df['目标'])
读取数据,划分特征和目标变量,然后将数据分为训练集和测试集,以便后续的机器学习模型训练和评估
模型训练
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score, confusion_matrix, cohen_kappa_score
# 初始化并训练随机森林模型
rf_model = RandomForestClassifier(random_state=42)
rf_model.fit(X_train, y_train)
# 初始化并训练KNN模型
knn_model = KNeighborsClassifier(n_neighbors=5)
knn_model.fit(X_train, y_train)
# 初始化并训练Logistic回归模型
logistic_model = LogisticRegression(max_iter=1000, random_state=42)
logistic_model.fit(X_train, y_train)
# 初始化并训练GNB模型
gnb_model = GaussianNB()
gnb_model.fit(X_train, y_train)
# 初始化并训练SVM模型
svm_model = SVC(random_state=42)
svm_model.fit(X_train, y_train)
# 初始化并训练MLP模型
mlp_model = MLPClassifier(max_iter=1000, random_state=42)
mlp_model.fit(X_train, y_train)
始化并训练了六种常用的机器学习模型(随机森林、KNN、Logistic回归、朴素贝叶斯、SVM、MLP),采用默认参数进行模型构建,未进行参数调优,主要目的是复现文献中的分组折线图展示各模型的性能对比
模型评价指标计算函数
# 定义函数计算评价指标
def calculate_metrics(y_true, y_pred):
accuracy = accuracy_score(y_true, y_pred)
sensitivity = recall_score(y_true, y_pred) # 敏感性(召回率)
specificity = confusion_matrix(y_true, y_pred)[0, 0] / (confusion_matrix(y_true, y_pred)[0, 0] + confusion_matrix(y_true, y_pred)[0, 1])
positive_predictive_value = precision_score(y_true, y_pred)
negative_predictive_value = confusion_matrix(y_true, y_pred)[1, 1] / (confusion_matrix(y_true, y_pred)[1, 1] + confusion_matrix(y_true, y_pred)[1, 0])
f1 = f1_score(y_true, y_pred)
kappa = cohen_kappa_score(y_true, y_pred)
return [accuracy, sensitivity, specificity, positive_predictive_value, negative_predictive_value, f1, kappa]
定义一个 calculate_metrics 函数,用于计算模型的多种评价指标,包括准确率(accuracy)、敏感性(sensitivity)、特异性(specificity)、正预测值(positive predictive value)、负预测值(negative predictive value)、F1分数(f1)和Kappa系数(kappa),这些指标能够全面评估模型的分类性能,便于后续在不同模型之间进行比较
模型训练集预测结果汇总
# 随机森林模型预测
rf_pred = rf_model.predict(X_train)
rf_metrics = calculate_metrics(y_train, rf_pred)
# KNN模型预测
knn_pred = knn_model.predict(X_train)
knn_metrics = calculate_metrics(y_train, knn_pred)
# Logistic回归模型预测
logistic_pred = logistic_model.predict(X_train)
logistic_metrics = calculate_metrics(y_train, logistic_pred)
# GNB模型预测
gnb_pred = gnb_model.predict(X_train)
gnb_metrics = calculate_metrics(y_train, gnb_pred)
# SVM模型预测
svm_pred = svm_model.predict(X_train)
svm_metrics = calculate_metrics(y_train, svm_pred)
# MLP模型预测
mlp_pred = mlp_model.predict(X_train)
mlp_metrics = calculate_metrics(y_train, mlp_pred)
# 创建DataFrame并添加所有模型的结果
metrics_df_train = pd.DataFrame({
'Metrics': ['accuracy', 'sensitivity', 'specificity', 'Positive predictive value', 'Negative predictive value', 'F1 score', 'Kappa score'],
'RF': rf_metrics,
'KNN': knn_metrics,
'Logistic': logistic_metrics,
'GNB': gnb_metrics,
'SVM': svm_metrics,
'MLP': mlp_metrics
})
metrics_df_train
对训练集数据进行模型预测,计算每个模型的多项评价指标,并将各模型的结果整理成DataFrame,以便后续进行可视化展示和性能比较
模型测试集预测结果汇总
# 随机森林模型预测
rf_pred = rf_model.predict(X_test)
rf_metrics = calculate_metrics(y_test, rf_pred)
# KNN模型预测
knn_pred = knn_model.predict(X_test)
knn_metrics = calculate_metrics(y_test, knn_pred)
# Logistic回归模型预测
logistic_pred = logistic_model.predict(X_test)
logistic_metrics = calculate_metrics(y_test, logistic_pred)
# GNB模型预测
gnb_pred = gnb_model.predict(X_test)
gnb_metrics = calculate_metrics(y_test, gnb_pred)
# SVM模型预测
svm_pred = svm_model.predict(X_test)
svm_metrics = calculate_metrics(y_test, svm_pred)
# MLP模型预测
mlp_pred = mlp_model.predict(X_test)
mlp_metrics = calculate_metrics(y_test, mlp_pred)
# 创建DataFrame并添加所有模型的结果
metrics_df_test = pd.DataFrame({
'Metrics': ['accuracy', 'sensitivity', 'specificity', 'Positive predictive value', 'Negative predictive value', 'F1 score', 'Kappa score'],
'RF': rf_metrics,
'KNN': knn_metrics,
'Logistic': logistic_metrics,
'GNB': gnb_metrics,
'SVM': svm_metrics,
'MLP': mlp_metrics
})
metrics_df_test
对测试集数据进行模型预测,计算每个模型的多项评价指标,并将各模型的结果整理成DataFrame,以便与训练集结果对比,全面评估各模型在新数据上的泛化能力
模型评价指标可视化函数
def plot_metrics(metrics_df, title="Metrics Plot", save_path=None):
colors = ['#ff3522', 'brown', 'orange', 'purple', '#0D99D4', '#4fbe5e', 'blue']
plt.figure(figsize=(8, 6), dpi=1200)
for idx, model in enumerate(metrics_df.columns[1:]):
plt.plot(metrics_df['Metrics'], metrics_df[model], marker='o', label=model, color=colors[idx % len(colors)])
ax = plt.gca()
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.yaxis.set_major_locator(ticker.MultipleLocator(0.25))
ax.yaxis.set_minor_locator(ticker.MultipleLocator(0.125))
ax.yaxis.set_minor_formatter(ticker.NullFormatter())
plt.title(title)
plt.ylim(0.1, 1.0)
plt.yticks([0.25, 0.50, 0.75, 1.00]) # 设置主要刻度
plt.xticks(rotation=45, ha='right')
plt.legend(title=" ", loc='center left', bbox_to_anchor=(1, 0.5), frameon=False)
plt.grid(which='both', linestyle='-', linewidth=0.5, color='gray')
if save_path:
plt.savefig(save_path, format='pdf', bbox_inches='tight') # 使用 `bbox_inches='tight'` 确保内容不会被裁剪
plt.tight_layout()
plt.show()
定义一个 plot_metrics 函数,通过折线图展示各模型在不同评价指标上的表现,可直观比较不同模型的性能
训练集可视化
plot\_metrics(metrics\_df\_train, title="Training Set Metrics", save\_path="Training\_Set\_Metrics.pdf")
测试集可视 化
plot\_metrics(metrics\_df\_test, title="Test Set Metrics", save\_path="Test\_Set\_Metrics.pdf")
两个可视化分别展示了各模型在训练集、测试集上不同评价指标的表现,通过折线图可以直观地比较随机森林(RF)、KNN、逻辑回归(Logistic)、朴素贝叶斯(GNB)、支持向量机(SVM)和多层感知机(MLP)模型的准确性、灵敏性、特异性等多项性能指标,为模型选择提供依据
🎁 赠书活动来啦! 🎁
支持知识分享,畅享学习乐趣!即日起,只需点赞、在看、转发此文章,作者将从后台随机抽取一位幸运儿,免费包邮赠送《深度序列模型与自然语言处理:基于TensorFlow 2实践》这本精彩书籍📚!
💡 赶快参与,一键三连,说不定你就是那位幸运读者哦!
往期推荐
SCI图表复现:利用小提琴图折线图综合展示训练集、验证集、测试集模型性能对比
复现SCI文章 SHAP 依赖图可视化以增强机器学习模型的可解释性
复现 Nature 图表——基于PCA的高维数据降维与可视化实践及其扩展
复现 Nature 图表可视化——基于模型残差分析与显著性检验的模型解释
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考