背景
在机器学习的应用中,回归任务是一类非常常见的问题,通常用于预测连续的数值输出,为了更好地理解模型的表现,除了给出预测的结果之外,绘制预测的置信区间也十分有用,本文将向大家介绍如何使用 XGBoost 进行回归预测,并通过可视化展示预测结果和置信区间
本文的可视化灵感来源于某SCI文献中的方法,结果如图,该文献通过展示测试数据、预测均值及其置信区间的图表,有效地传达了模型预测的不确定性,在他们的图表中,测试数据通过离散点表示,预测均值通过平滑曲线显示,而不同标准差范围内的置信区间则通过不同透明度的渐变色块呈现
点赞 在看 转发参与免费包邮赠书活动
代码实现
数据生成
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
# 为了增加复杂度,生成多个特征,并使用 XGBoost 来进行回归建模和可视化
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['axes.unicode_minus'] = False
from sklearn.datasets import make_regression
import xgboost as xgb
# 生成多特征模拟数据集
n_samples = 200
n_features = 5
X_simulated, y_simulated = make_regression(n_samples=n_samples, n_features=n_features, noise=0.1, random_state=42)
生成一个具有200个样本和5个特征的模拟回归数据集,用于后续的XGBoost回归建模和可视化
模型训练
# 将模拟数据分为训练集和测试集
X_train_simulated, X_test_simulated, y_train_simulated, y_test_simulated = train_test_split(X_simulated, y_simulated, test_size=0.25, random_state=42)
# 定义XGBoost模型
model_xgb_simulated = xgb.XGBRegressor(
learning_rate=0.02,
booster='gbtree',
objective='reg:squarederror',
max_leaves=127,
verbosity=0,
seed=42,
colsample_bytree=0.6,
subsample=0.7
)
# 训练XGBoost模型
model_xgb_simulated.fit(X_train_simulated, y_train_simulated)
# 在测试集上进行预测
y_pred_simulated = model_xgb_simulated.predict(X_test_simulated)
将数据分为训练集和测试集,定义并训练了一个XGBoost回归模型
模型预测及置信区间计算
# 在测试集上进行预测
y_pred_simulated = model_xgb_simulated.predict(X_test_simulated)
# 计算残差和标准差
residuals_simulated = y_test_simulated - y_pred_simulated
sigma_simulated = np.std(residuals_simulated)
# 计算三种置信区间
conf_intervals_simulated = {
'mu ± sigma': (y_pred_simulated - sigma_simulated, y_pred_simulated + sigma_simulated),
'mu ± 2sigma': (y_pred_simulated - 2*sigma_simulated, y_pred_simulated + 2*sigma_simulated),
'mu ± 3sigma': (y_pred_simulated - 3*sigma_simulated, y_pred_simulated + 3*sigma_simulated),
}
在模型训练完成后,在测试集上进行预测,并计算每个样本的残差和标准差,最终计算三种置信区间
可视化预测结果及置信区间
# 绘制可视化图像
test_indices_simulated = np.arange(len(y_test_simulated))
plt.figure(figsize=(10, 5), dpi=1200)
# 绘制测试数据
plt.scatter(test_indices_simulated, y_test_simulated, color='red', label='Test data', zorder=5)
# 绘制预测均值
plt.plot(test_indices_simulated, y_pred_simulated, color='blue', label='prediction, $\\mu$', zorder=4)
# 绘制三种置信区间
plt.fill_between(test_indices_simulated, conf_intervals_simulated['mu ± sigma'][0], conf_intervals_simulated['mu ± sigma'][1],
color='navy', alpha=0.6, label='$\\mu \\pm \\sigma$')
plt.fill_between(test_indices_simulated, conf_intervals_simulated['mu ± 2sigma'][0], conf_intervals_simulated['mu ± 2sigma'][1],
color='deepskyblue', alpha=0.5, label='$\\mu \\pm 2\\sigma$')
plt.fill_between(test_indices_simulated, conf_intervals_simulated['mu ± 3sigma'][0], conf_intervals_simulated['mu ± 3sigma'][1],
color='lightblue', alpha=0.3, label='$\\mu \\pm 3\\sigma$')
# 设置图表标题和标签
plt.title('Test Data with Prediction and Confidence Intervals (XGBoost Model)')
plt.xlabel('Test Sample')
plt.ylabel('Simulated Output')
plt.legend()
plt.savefig("Test Data with Prediction and Confidence Intervals (XGBoost Model).pdf",bbox_inches='tight')
# 显示图像
plt.show()
通过 matplotlib 来绘制散点图和填充区域,图中展示了测试数据、预测值以及三个不同置信区间的区域, 在上图中: 红色的散点代表测试数据的真实值、 蓝色的曲线代表模型的预测值、 不同的蓝色阴影区域分别表示置信区间,其中深蓝色表示 ,天蓝色表示 ,浅蓝色表示 ,通过这样的可视化,可以清晰地看到模型预测结果的准确度以及模型预测的置信度
往期推荐
不止 SHAP 力图:LIME 实现任意黑盒模型的单样本解释
微信号|deep_ML
欢迎添加作者微信进入Python、ChatGPT群
进群请备注Python或AI进入相关群
无需科学上网、同步官网所有功能、使用无限制
如果你对类似于这样的文章感兴趣。
欢迎关注、点赞、转发~
个人观点,仅供参考