背景
上图为参考,在机器学习的回归分析中,选择合适的模型对于数据预测至关重要。通过多模型构建,包括线性回归、决策树回归、随机森林、XGBoost等,发现它们在训练集和测试集上的实际表现
在这篇文章中,不仅会对比各个回归模型的核心评价指标(如R²、RMSE和MAE),还将展示如何通过可视化技术对这些指标进行有效呈现。通过对比不同模型的训练和测试效果,可以更好地选择最适合特定任务的回归算法,进一步提升数据分析和预测的精度,对于参考可视化的散点图部分参考往期文章——期刊配图:如何同时可视化多个回归模型在训练集与测试集上的预测效果,这里主要是对R²、RMSE和MAE进行可视化复现,下图为复现改良结果
代码实现
数据预处理
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('2025-2-9-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.linear_model import LinearRegression, Ridge, Lasso
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor, ExtraTreesRegressor
from sklearn.svm import SVR
from sklearn.neighbors import KNeighborsRegressor
import xgboost as xgb
import lightgbm as lgb
# 定义并训练模型1:线性回归
linear_reg = LinearRegression()
linear_reg.fit(X_train, y_train)
# 定义并训练模型2:岭回归
ridge_reg = Ridge()
ridge_reg.fit(X_train, y_train)
# 定义并训练模型3:拉索回归
lasso_reg = Lasso()
lasso_reg.fit(X_train, y_train)
# 定义并训练模型4:决策树回归
decision_tree_reg = DecisionTreeRegressor()
decision_tree_reg.fit(X_train, y_train)
# 定义并训练模型5:随机森林回归
random_forest_reg = RandomForestRegressor()
random_forest_reg.fit(X_train, y_train)
# 定义并训练模型6:Extra Trees回归 (ET)
et_reg = ExtraTreesRegressor()
et_reg.fit(X_train, y_train)
# 定义并训练模型7:K近邻回归
knn_reg = KNeighborsRegressor()
knn_reg.fit(X_train, y_train)
# 定义并训练模型8:XGBoost回归
xgb_reg = xgb.XGBRegressor()
xgb_reg.fit(X_train, y_train)
# 定义并训练模型9:LightGBM回归
lgb_reg = lgb.LGBMRegressor()
lgb_reg.fit(X_train, y_train)
定义并训练了九种不同的回归模型,包括线性回归、岭回归、拉索回归、决策树回归、随机森林回归、Extra Trees回归、K近邻回归、XGBoost回归和LightGBM回归,使用相同的训练集(X_train和y_train)进行训练,为后续的模型评估与对比做准备
评价指标计算
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
# 定义一个字典来存储每个模型在训练集和测试集上的评价指标
metrics = {
'Model': [],
'R²_train': [],
'RMSE_train': [],
'MAE_train': [],
'R²_test': [],
'RMSE_test': [],
'MAE_test': []
}
# 定义模型列表
models = [linear_reg, ridge_reg, lasso_reg, decision_tree_reg, random_forest_reg, et_reg, knn_reg, xgb_reg, lgb_reg]
model_names = ['LR1', 'LR2', 'LASSO', '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)
# 计算评价指标
metrics['Model'].append(model_name)
metrics['R²_train'].append(r2_score(y_train, y_train_pred))
metrics['RMSE_train'].append(np.sqrt(mean_squared_error(y_train, y_train_pred)))
metrics['MAE_train'].append(mean_absolute_error(y_train, y_train_pred))
metrics['R²_test'].append(r2_score(y_test, y_test_pred))
metrics['RMSE_test'].append(np.sqrt(mean_squared_error(y_test, y_test_pred)))
metrics['MAE_test'].append(mean_absolute_error(y_test, y_test_pred))
metrics_df = pd.DataFrame(metrics)
metrics_df
计算并存储九个回归模型在训练集和测试集上的三个评价指标(R²、RMSE、MAE),并将这些指标整理成一个DataFrame,以便后续分析和比较模型表现
针对训练集进行一个初步的可视化
fig, ax = plt.subplots(figsize=(10, 6))
# 设置绘图区背景色为淡灰色
ax.set_facecolor('#F0F0F0')
# 设置Y轴的总范围,并划分为5等份
ax.set_ylim(0, 1)
# 设置评价指标的名称及其对应的Y轴位置
evaluation_metrics = ['R²', 'RMSE', 'MAE']
y_positions = [0.8, 0.5, 0.2] # 将R²、RMSE、MAE分别放置在适当位置
# 为每个评价指标绘制圆点
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([0.8, 0.5, 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()
通过散点图展示不同回归模型在训练集上的三个评价指标(R²、RMSE、MAE),圆点大小与指标数值成正比,并将其可视化在同一图中,虽然简单直观,但与文献中的精美可视化形式有所差距。接下来,可以通过优化散点的样式、增加更多的设计细节(如边框、颜色搭配、参考线等),以及更为精细的排版,来提升图表的美观度,达到文献中常见的高质量可视化效果
训练集、测试集文献可视化
这里分别展示了回归模型在训练集和测试集上的评价指标,通过两个单独的图表进行可视化。每个图表包括三个评价指标(R²、RMSE、MAE)的圆点可视化,且训练集和测试集分别使用不同的背景色和圆点大小表示。虽然每个数据集的可视化效果已经较为清晰,但它们被分为两个单独的图表,这可能导致对比效果不够直观
接下来,为了实现文献中的可视化形式,可以将训练集和测试集的可视化合并在一个画布下,来同时展示它们的对比。这样可以在同一画布中更清楚地看到模型在训练集和测试集上的表现差异
这样就和文献的可视化所表达的形式一模一样了,完整 代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系 ,但是细心的读者肯定能发现参考可视化中一个小问题
以XGBoost模型为案例通过散点图可以发现该模型在训练集、测试集上的R²分别为0.953和0.349是存在较大差异的也就是模型过拟合,但是通过下面的这个组合可视化中又可以发现训练集、测试集的散点大小映射是差不多的看不出来模型存在过拟合的情况,这就是在参考可视化中散点映射是针对训练集、测试集单独一个系统进行映射,导致训练集和测试集的大小差异不明显,也就是我们上面的可视化代码实现方法(当然作者这里是模拟数据本身不存在严重的过拟合所以这种情况不明显),为了避免这种情况的产生,接下来进行一个改进把训练集、测试集看作一个系统进行散点大小映射
通过这种改进后的可视化方法,训练集和测试集的散点大小映射会显得更为一致,且差异更易察觉。对于过拟合模型,训练集和测试集之间的差异将更加突出,避免了之前由于单独映射导致的信息丢失,最后把这个可视化和往期文章——期刊配图:如何同时可视化多个回归模型在训练集与测试集上的预测效果进行组合就得到了参考配图可视化形式,完整 代码与数据集获取:如需获取本文的源代码和数据集,请添加作者微信联系
往期推荐
聚类与解释的结合:利用K-Means聚类辅助SHAP模型解释并可视化
期刊配图:SHAP可视化改进依赖图+拟合线+边缘密度+分组对比
期刊配图:SHAP蜂巢图与柱状图多维组合解读特征对模型的影响
基于mRMR筛选和递归特征选择的多模型性能评估与AUC可视化对比
期刊配图:SHAP可视化进阶蜂巢图与特征重要性环形图的联合展示方法
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考