期刊配图:如何同时可视化多个回归模型在训练集与测试集上的预测效果

机器学习算法数据库

picture.image

背景

picture.image

上图为参考,在机器学习实践中,回归模型广泛应用于预测连续变量。在本文中,通过多种回归算法(如线性回归、岭回归、拉索回归、决策树回归、随机森林回归、XGBoost回归等)对数据进行建模,并展示如何通过可视化来评估每个模型在训练集和测试集上的表现

首先,通过将数据集分为训练集和测试集,使用不同的回归模型进行训练并进行预测。然后,通过绘制每个模型的预测结果,可以直观地看到模型的拟合效果,包括训练集和测试集的预测值与真实值之间的关系

每个回归模型都生成了散点图,其中:

  • 训练集数据以空心小圆圈表示,并用回归线展示其拟合效果
  • 测试集数据也以空心小圆圈表示,回归线则展示测试集的拟合情况
  • 在图中,标注各个模型的性能指标(如R²、RMSE、MAE等),以便更全面地评估每个模型的表现

帮助深入了解各个模型的预测能力,还能在实际应用中选择最适合的数据建模方法。接下来,将展示如何通过代码和图形化展示这一过程

picture.image

代码实现

数据处理


          
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)
      

加载数据集,提取特征和目标变量,并将数据集划分为训练集和测试集,测试集占比为20%

模型构建


          
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)
      

定义并训练9个不同的回归模型,包括线性回归、岭回归、拉索回归、决策树回归、随机森林回归、Extra Trees回归、K近邻回归、XGBoost回归和LightGBM回归,所有模型都使用了默认的参数设置,但在实际应用中,可以通过调参来优化这些模型的性能,读者根据自身代码进行替换即可

调用模型进行预测


          
# 定义模型字典
          
models = {
          
    'LR': linear_reg,
          
    'RR': ridge_reg,
          
    'Lasso': lasso_reg,
          
    'DT': decision_tree_reg,
          
    'RF': random_forest_reg,
          
    'ET': et_reg,
          
    'KNN': knn_reg,
          
    'XGB': xgb_reg,
          
    'LGBM': lgb_reg
          
}
          

          
# 创建空的DataFrame来存储训练集和测试集的预测结果
          
train_preds = pd.DataFrame()
          
test_preds = pd.DataFrame()
          

          
# 使用循环对每个模型进行预测并存储结果
          
for name, model in models.items():
          
    train_preds[name] = model.predict(X_train)
          
    test_preds[name] = model.predict(X_test)
          

          
train_preds
      

picture.image


        
            

          test\_preds
        
      

picture.image

定义一个包含多个回归模型的字典,并使用循环对每个模型进行预测,将训练集和测试集的预测结果分别存储在train_preds和test_preds的DataFrame中

这里的模型字典 models 包含了之前训练的9个回归模型,包括线性回归(LR)、岭回归(RR)、拉索回归(Lasso)、决策树回归(DT)、随机森林回归(RF)、Extra Trees回归(ET)、K近邻回归(KNN)、XGBoost回归(XGB)和LightGBM回归(LGBM)。在实际使用中,读者可以将这些模型替换为自己经过调参和训练的模型,进行预测和评估即可

模型评价指标计算


          
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
          

          
# 创建空的DataFrame来存储训练集和测试集的评价指标
          
train_metrics = pd.DataFrame()
          
test_metrics = pd.DataFrame()
          

          
# 使用循环对每个模型进行预测并计算评价指标
          
for name, model in models.items():
          
    # 对训练集进行预测
          
    train_pred = model.predict(X_train)
          
    # 对测试集进行预测
          
    test_pred = model.predict(X_test)
          
    
          
    # 计算训练集上的评价指标
          
    r2_train = r2_score(y_train, train_pred)
          
    rmse_train = np.sqrt(mean_squared_error(y_train, train_pred))
          
    mae_train = mean_absolute_error(y_train, train_pred)
          
    
          
    # 计算测试集上的评价指标
          
    r2_test = r2_score(y_test, test_pred)
          
    rmse_test = np.sqrt(mean_squared_error(y_test, test_pred))
          
    mae_test = mean_absolute_error(y_test, test_pred)
          
    
          
    # 将结果存储在DataFrame中
          
    train_metrics[name] = [r2_train, rmse_train, mae_train]
          
    test_metrics[name] = [r2_test, rmse_test, mae_test]
          

          
# 设置索引为评价指标名称
          
train_metrics.index = ['R2', 'RMSE', 'MAE']
          
test_metrics.index = ['R2', 'RMSE', 'MAE']
          
train_metrics 
      

picture.image


        
            

          test\_metrics
        
      

picture.image

计算每个模型在训练集和测试集上的R²、RMSE和MAE评价指标,并将结果存储在train_metrics和test_metrics的DataFrame中,以便对各个模型的性能进行比较

单个模型可视化


          
# 从 train_preds 和 test_preds 获取 LR 的预测数据
          
train_preds_lr = np.array(train_preds['LR'])
          
test_preds_lr = np.array(test_preds['LR'])
          

          
# 转换真实值为 numpy 数组
          
y_train_np = np.array(y_train)
          
y_test_np = np.array(y_test)
          

          
# 从 train_metrics 和 test_metrics 获取 LR 的评价指标
          
train_metrics_lr = train_metrics['LR']
          
test_metrics_lr = test_metrics['LR']
          

          
# 创建训练集评价指标文本
          
train_metrics_text = f"R2: {train_metrics_lr[0]:.3f}\nRMSE: {train_metrics_lr[1]:.3f}\nMAE: {train_metrics_lr[2]:.3f}"
          

          
# 创建测试集评价指标文本
          
test_metrics_text = f"R2: {test_metrics_lr[0]:.3f}\nRMSE: {test_metrics_lr[1]:.3f}\nMAE: {test_metrics_lr[2]:.3f}"
          

          
# 创建正方形画布
          
fig, ax = plt.subplots(figsize=(6, 6), dpi=1200)
          

          
# 设置绘图区背景色为淡灰色
          
ax.set_facecolor('#F0F0F0')
          

          
# 训练集散点(#6A9ACE 训练集空心小圆圈)
          
ax.scatter(y_train_np, train_preds_lr, edgecolors='#6A9ACE', facecolors='none')
          

          
# 测试集散点(#F1766D 测试集空心小圆圈)
          
ax.scatter(y_test_np, test_preds_lr, edgecolors='#F1766D', facecolors='none')
          

          
# 绘制训练集回归线
          
train_coef = np.polyfit(y_train_np, train_preds_lr, 1)
          
train_line = np.poly1d(train_coef)
          
ax.plot(y_train_np, train_line(y_train_np), '#6A9ACE', linestyle='-')
          

          
# 绘制测试集回归线
          
test_coef = np.polyfit(y_test_np, test_preds_lr, 1)
          
test_line = np.poly1d(test_coef)
          
ax.plot(y_test_np, test_line(y_test_np), '#F1766D', linestyle='-')
          

          
# 添加 x=y 参考线(黑色虚线)
          
x_min, x_max = min(y_train_np.min(), y_test_np.min()), max(y_train_np.max(), y_test_np.max())
          
ax.plot([x_min, x_max], [x_min, x_max], 'k--')
          

          
# 设置标签(英文)并加粗字体和增大字体
          
ax.set_xlabel('True Value', fontsize=16, fontweight='bold')
          
ax.set_ylabel('Predicted Value', fontsize=16, fontweight='bold')
          
ax.set_title('LR', fontsize=18, fontweight='bold')
          

          
# 关闭网格线和图例
          
ax.grid(False)
          
ax.legend().set_visible(False)
          

          
# 显示训练集评价指标在左上角,关闭文本框背景
          
ax.text(0.05, 0.95, f"Train Metrics\n{train_metrics_text}", transform=ax.transAxes, fontsize=15, fontweight='bold',
          
        verticalalignment='top', horizontalalignment='left', color='#6A9ACE')
          

          
# 显示测试集评价指标在右下角,关闭文本框背景
          
ax.text(0.95, 0.05, f"Test Metrics\n{test_metrics_text}", transform=ax.transAxes, fontsize=15, fontweight='bold',
          
        verticalalignment='bottom', horizontalalignment='right', color='#F1766D')
          

          
plt.savefig("1.pdf", format='pdf', bbox_inches='tight')
          
plt.show()
      

picture.image

针对单个回归模型(线性回归LR)绘制了训练集和测试集的散点图与回归线,并显示各自的评价指标;要绘制所有模型的可视化,只需要将这部分代码放入一个循环中,依次处理每个模型即可

绘制所有模型可视化


          
# 创建3x3的子图布局
          
fig, axes = plt.subplots(3, 3, figsize=(18, 18), dpi=1200)
          

          
# 设置子图之间的间距
          
fig.subplots_adjust(hspace=0.3, wspace=0.3)
          

          
# 模型名称列表
          
model_names = train_preds.columns
          

          
# 使用循环对每个模型进行可视化
          
for i, (model_name, model) in enumerate(models.items()):
          
    # 获取模型的预测值
          
    train_preds_lr = np.array(train_preds[model_name])
          
    test_preds_lr = np.array(test_preds[model_name])
          

          
    # 获取真实值
          
    y_train_np = np.array(y_train)
          
    y_test_np = np.array(y_test)
          

          
    # 获取模型的评价指标
          
    train_metrics_lr = train_metrics[model_name]
          
    test_metrics_lr = test_metrics[model_name]
          

          
    # 创建评价指标文本
          
    train_metrics_text = f"R2: {train_metrics_lr[0]:.3f}\nRMSE: {train_metrics_lr[1]:.3f}\nMAE: {train_metrics_lr[2]:.3f}"
          
    test_metrics_text = f"R2: {test_metrics_lr[0]:.3f}\nRMSE: {test_metrics_lr[1]:.3f}\nMAE: {test_metrics_lr[2]:.3f}"
          

          
    # 确定位置
          
    row, col = divmod(i, 3)
          
    ax = axes[row, col]
          

          
    # 设置背景色
          
    ax.set_facecolor('#F0F0F0')
          

          
    # 绘制训练集散点
          
    ax.scatter(y_train_np, train_preds_lr, edgecolors='#6A9ACE', facecolors='none', label='Train Data')
          

          
    # 绘制测试集散点
          
    ax.scatter(y_test_np, test_preds_lr, edgecolors='#F1766D', facecolors='none', label='Test Data')
          

          
    # 绘制训练集回归线
          
    train_coef = np.polyfit(y_train_np, train_preds_lr, 1)
          
    train_line = np.poly1d(train_coef)
          
    ax.plot(y_train_np, train_line(y_train_np), '#6A9ACE', linestyle='-', label='Train Fit')
          

          
    # 绘制测试集回归线
          
    test_coef = np.polyfit(y_test_np, test_preds_lr, 1)
          
    test_line = np.poly1d(test_coef)
          
    ax.plot(y_test_np, test_line(y_test_np), '#F1766D', linestyle='-', label='Test Fit')
          

          
    # 添加 x=y 参考线
          
    x_min, x_max = min(y_train_np.min(), y_test_np.min()), max(y_train_np.max(), y_test_np.max())
          
    ax.plot([x_min, x_max], [x_min, x_max], 'k--')
          

          
    # 设置标签
          
    ax.set_xlabel('True Value', fontsize=12, fontweight='bold')
          
    ax.set_ylabel('Predicted Value', fontsize=12, fontweight='bold')
          
    ax.set_title(model_name, fontsize=14, fontweight='bold')
          

          
    # 显示训练集评价指标在左上角
          
    ax.text(0.05, 0.95, f"Train Metrics\n{train_metrics_text}", transform=ax.transAxes, fontsize=15, fontweight='bold',
          
            verticalalignment='top', horizontalalignment='left', color='#6A9ACE')
          

          
    # 显示测试集评价指标在右下角
          
    ax.text(0.95, 0.05, f"Test Metrics\n{test_metrics_text}", transform=ax.transAxes, fontsize=15, fontweight='bold',
          
            verticalalignment='bottom', horizontalalignment='right', color='#F1766D')
          

          
    # 关闭网格和图例
          
    ax.grid(False)
          
    ax.legend().set_visible(False)
          
plt.savefig("2.pdf", format='pdf', bbox_inches='tight')
          
plt.show()
      

picture.image

代码创建一个3x3的子图布局,使用循环对每个回归模型进行可视化,绘制训练集和测试集的散点图、回归线以及相应的评价指标,最终生成并保存一个包含所有模型可视化的PDF文件

结语

picture.image

参考可视化最后还展示了回归预测模型的评价指标(R²、RMSE和MAE),并以不同颜色的圆点表示不同模型在训练集和测试集上的表现。这里没有在当前代码中提供实现这一类型可视化的具体代码,但这种可视化不仅适用于回归模型,还可以扩展到分类模型的评价指标。所以后续的文章中将详细展示如何在回归、分类任务中复现类似的可视化方法

往期推荐

SHAP值+模型预测概率解读机器学习模型的决策过程

聚类与解释的结合:利用K-Means聚类辅助SHAP模型解释并可视化

期刊配图:RFE结合随机森林与K折交叉验证的特征筛选可视化

期刊配图:变量重要性排序与顺序正向选择的特征筛选可视化

期刊配图:SHAP可视化改进依赖图+拟合线+边缘密度+分组对比

期刊配图:SHAP蜂巢图与柱状图多维组合解读特征对模型的影响

基于mRMR筛选和递归特征选择的多模型性能评估与AUC可视化对比

期刊配图:SHAP可视化进阶蜂巢图与特征重要性环形图的联合展示方法

期刊配图:基于t-sne降维与模型预测概率的分类效果可视化

期刊配图:多种机器学习算法在递归特征筛选中的性能变化图示

picture.image

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

欢迎关注、点赞、转发~

个人观点,仅供参考

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论