背景
上图为参考,在机器学习实践中,回归模型广泛应用于预测连续变量。在本文中,通过多种回归算法(如线性回归、岭回归、拉索回归、决策树回归、随机森林回归、XGBoost回归等)对数据进行建模,并展示如何通过可视化来评估每个模型在训练集和测试集上的表现
首先,通过将数据集分为训练集和测试集,使用不同的回归模型进行训练并进行预测。然后,通过绘制每个模型的预测结果,可以直观地看到模型的拟合效果,包括训练集和测试集的预测值与真实值之间的关系
每个回归模型都生成了散点图,其中:
- 训练集数据以空心小圆圈表示,并用回归线展示其拟合效果
- 测试集数据也以空心小圆圈表示,回归线则展示测试集的拟合情况
- 在图中,标注各个模型的性能指标(如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('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
test\_preds
定义一个包含多个回归模型的字典,并使用循环对每个模型进行预测,将训练集和测试集的预测结果分别存储在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
test\_metrics
计算每个模型在训练集和测试集上的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()
针对单个回归模型(线性回归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()
代码创建一个3x3的子图布局,使用循环对每个回归模型进行可视化,绘制训练集和测试集的散点图、回归线以及相应的评价指标,最终生成并保存一个包含所有模型可视化的PDF文件
结语
参考可视化最后还展示了回归预测模型的评价指标(R²、RMSE和MAE),并以不同颜色的圆点表示不同模型在训练集和测试集上的表现。这里没有在当前代码中提供实现这一类型可视化的具体代码,但这种可视化不仅适用于回归模型,还可以扩展到分类模型的评价指标。所以后续的文章中将详细展示如何在回归、分类任务中复现类似的可视化方法
往期推荐
聚类与解释的结合:利用K-Means聚类辅助SHAP模型解释并可视化
期刊配图:SHAP可视化改进依赖图+拟合线+边缘密度+分组对比
期刊配图:SHAP蜂巢图与柱状图多维组合解读特征对模型的影响
基于mRMR筛选和递归特征选择的多模型性能评估与AUC可视化对比
期刊配图:SHAP可视化进阶蜂巢图与特征重要性环形图的联合展示方法
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考