【数据+代码】使用XGBoost实现回归分析

1、引言

本文涵盖主题:XGBoost 实现回归分析,包括数据准备、模型训练和结果分析三个方面。

 

本期内容『数据+代码』已上传百度网盘。有需要的朋友可以关注公众号【小Z的科研日常】,后台回复关键词[xgboost]获取

2、数据准备

本例中,我们使用的是1973年至2016年间美国燃烧煤炭发电产生的二氧化碳排放量数据集。

数据帧包含需要分隔为年和月列的列“YYYYMM”。在此步骤中,我们还将删除数据帧中可能存在的任何空值。将特征工程中新增的年、月列替换“YYYYMM”,同时查询数据中是否含有重复值,如有需另作处理,本数据集不涵盖。

data = pd.read_csv('co2.csv')
data['Month'] = data.YYYYMM.astype(str).str[4:6].astype(float)
data['Year'] = data.YYYYMM.astype(str).str[0:4].astype(float)
data.drop(['YYYYMM'], axis=1, inplace=True)
data.replace([np.inf, -np.inf], np.nan, inplace=True)
data.isnull().sum()

将月份和年份作为特征,CO2 排放量作为标签。

X = data.loc[:,['Month', 'Year']].values
y = data.loc[:,'Value'].values

使用 train_test_split 函数来划分出训练集和测试集:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

可视化X、y,观察随时间变化,co2含量变化:

plt.figure(figsize=(10, 5), dpi=300)
sns.lineplot(x='Year', y='Value', data=data,errorbar='sd', err_style='band',color="#ec661f")

如图:

 

3、模型训练

使用 XGBoost 建立回归模型并进行训练。这里需要设置一系列参数,例如 n_estimators(基分类器数量)、learning_rate(学习率)、subsample(子采样比例)、colsample_bytree(列采样比例)、max_depth(树的最大深度)和 gamma(用于控制树的复杂度)等参数。

reg_mod = xgb.XGBRegressor(
    n_estimators=1000,
    learning_rate=0.08,
    subsample=0.75,
    colsample_bytree=1, 
    max_depth=7,
    gamma=0,
)

# 训练模型并指定评估数据集
eval_set = [(X_train, y_train), (X_test, y_test)]
reg_mod.fit(X_train, y_train, eval_set=eval_set, eval_metric='rmse', verbose=False)
# 绘制损失曲线
sns.set_style("white")
palette = sns.color_palette("Set2", n_colors=2) 

plt.plot(reg_mod.evals_result()['validation_0']['rmse'], label='train', color=palette[0], linewidth=2)
plt.plot(reg_mod.evals_result()['validation_1']['rmse'], label='test', color=palette[1], linewidth=2)
plt.xlabel('Iteration')
plt.ylabel('RMSE')
plt.legend()
plt.savefig('Loss.png')
plt.show()

模型损失曲线如图:

同时,模型还需要进行交叉验证和评估指标选择,例如 RMSE 和 R_Squared Score 等。以下是对模型进行训练和评估的代码:

from sklearn.metrics import r2_score
reg_mod.fit(X_train, y_train)
scores = cross_val_score(reg_mod, X_train, y_train,cv=10)
print("Mean cross-validation score: %.2f" % scores.mean())
rmse = np.sqrt(mean_squared_error(y_test, predictions))
print("RMSE: %f" % (rmse))
r2 = np.sqrt(r2_score(y_test, predictions))
print("R_Squared Score : %f" % (r2))

模型评估结果如下:

  • Mean cross-validation score: 0.97

  • RMSE: 4.683184
  • R_Squared Score : 0.989909

通过上述模型评估结果可知,该模型针对此数据能够较好的拟合,通过下述代码,观察测试集拟合效果:

sns.set_style("white") 
palette = sns.color_palette("husl", n_colors=2) 

# 设置画布大小和分辨率
plt.figure(figsize=(10, 5), dpi=300)

# 绘制测试集数据的真实值和模型预测值的折线图
x_ax = range(len(y_test))
plt.plot(x_ax, y_test, label="True Values", color=palette[0], linewidth=1)
plt.plot(x_ax, predictions, label="Predicted Values", color=palette[1], linewidth=1)

# 添加标题和标签
plt.title("Carbon Dioxide Emissions - True vs Predicted Values")
plt.xlabel("Sample Number")
plt.ylabel("CO2 Emissions")

# 显示图例
plt.legend()
plt.savefig('True vs Predicted Values.png')
# 显示图形
plt.show()

拟合曲线如图:

 

通过上图可知,模型拟合效果较好,能够有效预测数据中峰值等信息。

上述各数据及图标表明,该模型具有较高准确率,通过下述代码,观察未来日期内co2含量:

sns.set_style("white") 
palette = sns.color_palette("husl", n_colors=1) 

# 设置画布大小和分辨率
plt.figure(figsize=(10, 5), dpi=300)

# 将预测值转换为DataFrame格式,并添加日期列
df_pred = pd.DataFrame(predictions, columns=['Predicted Values']) 
df_pred['Date'] = pd.date_range(start='8/1/2016', periods=len(df_pred), freq='M')

# 绘制预测值的折线图
sns.lineplot(x='Date', y='Predicted Values', data=df_pred, color=palette[0], linewidth=1)

# 添加标题和标签
plt.title("Carbon Dioxide Emissions - Forecast")
plt.xlabel("Date")
plt.ylabel("CO2 Emissions")
plt.savefig('Emissions - Forecast.png')

# 显示图形
plt.show()

预测曲线如图:

 

感谢您阅读本篇文章!如果您对神经网络与深度学习等方面感兴趣,欢迎关注我们的微信公众号(小Z的科研日常)。

 

  • 27
    点赞
  • 321
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小Z的科研日常

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值