当前位置:   article > 正文

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

xgboost回归模型

1、引言

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

 

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

2、数据准备

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

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

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

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

  1. = data.loc[:,['Month''Year']].values
  2. = data.loc[:,'Value'].values

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

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

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

  1. plt.figure(figsize=(105), dpi=300)
  2. 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(用于控制树的复杂度)等参数。

  1. reg_mod = xgb.XGBRegressor(
  2.     n_estimators=1000,
  3.     learning_rate=0.08,
  4.     subsample=0.75,
  5.     colsample_bytree=1
  6.     max_depth=7,
  7.     gamma=0,
  8. )
  9. # 训练模型并指定评估数据集
  10. eval_set = [(X_train, y_train), (X_test, y_test)]
  11. reg_mod.fit(X_train, y_train, eval_set=eval_set, eval_metric='rmse', verbose=False)
  12. # 绘制损失曲线
  13. sns.set_style("white")
  14. palette = sns.color_palette("Set2", n_colors=2
  15. plt.plot(reg_mod.evals_result()['validation_0']['rmse'], label='train', color=palette[0], linewidth=2)
  16. plt.plot(reg_mod.evals_result()['validation_1']['rmse'], label='test', color=palette[1], linewidth=2)
  17. plt.xlabel('Iteration')
  18. plt.ylabel('RMSE')
  19. plt.legend()
  20. plt.savefig('Loss.png')
  21. plt.show()

模型损失曲线如图:

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

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

模型评估结果如下:

  • Mean cross-validation score: 0.97

  • RMSE: 4.683184
  • R_Squared Score : 0.989909

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

  1. sns.set_style("white"
  2. palette = sns.color_palette("husl", n_colors=2
  3. # 设置画布大小和分辨率
  4. plt.figure(figsize=(105), dpi=300)
  5. # 绘制测试集数据的真实值和模型预测值的折线图
  6. x_ax = range(len(y_test))
  7. plt.plot(x_ax, y_test, label="True Values", color=palette[0], linewidth=1)
  8. plt.plot(x_ax, predictions, label="Predicted Values", color=palette[1], linewidth=1)
  9. # 添加标题和标签
  10. plt.title("Carbon Dioxide Emissions - True vs Predicted Values")
  11. plt.xlabel("Sample Number")
  12. plt.ylabel("CO2 Emissions")
  13. # 显示图例
  14. plt.legend()
  15. plt.savefig('True vs Predicted Values.png')
  16. # 显示图形
  17. plt.show()

拟合曲线如图:

 

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

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

  1. sns.set_style("white"
  2. palette = sns.color_palette("husl", n_colors=1
  3. # 设置画布大小和分辨率
  4. plt.figure(figsize=(105), dpi=300)
  5. # 将预测值转换为DataFrame格式,并添加日期列
  6. df_pred = pd.DataFrame(predictions, columns=['Predicted Values']) 
  7. df_pred['Date'= pd.date_range(start='8/1/2016', periods=len(df_pred), freq='M')
  8. # 绘制预测值的折线图
  9. sns.lineplot(x='Date', y='Predicted Values'data=df_pred, color=palette[0], linewidth=1)
  10. # 添加标题和标签
  11. plt.title("Carbon Dioxide Emissions - Forecast")
  12. plt.xlabel("Date")
  13. plt.ylabel("CO2 Emissions")
  14. plt.savefig('Emissions - Forecast.png')
  15. # 显示图形
  16. plt.show()

预测曲线如图:

 

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/604662
推荐阅读
相关标签
  

闽ICP备14008679号