【R模型】R语言梯度提升回归树模型(基于gbm包的GBRT)

文章介绍了梯度提升回归树(GBRT)的基本原理和R语言中的实现,通过GBRT包构建模型,并与线性模型(LM)进行比较。GBRT模型通过迭代优化残差,避免过拟合,适用于各种回归问题。文章提供了一个农作物产量预测的例子,展示了如何处理数据、构建模型并评估预测效果,结果显示GBRT模型在R2和RMSE等方面优于LM。
摘要由CSDN通过智能技术生成
  • 💂 个人信息酷在前行
  • 👍 版权: 博文由【酷在前行】原创、需要转载请联系博主
  • 👀 如果博文对您有帮助,欢迎点赞、关注、收藏 + 订阅专栏
  • 🔖 本文收录于【R模型】,该专栏主要介绍R语言各类型机器学习,如线性回归模型、广义线性模型、混合线性模型、随机森林模型、支持向量机模型、决策树模型等。请大家多多关注点赞和支持,共同进步~ 欢迎大家订阅!


      随着科技的进步,大数据从科学前沿逐渐深入到各行业。在土壤学、微生物学、农学和生态学等学科也并无例外。今天与大家分享一个比较稳健的机器学习法-基于 gbm 包的 GBRT (Gradient Boost Regression Tree),称为梯度 提升回归树,其"兄弟",GBDT(Gradient Boosting Decision Tree),称为梯度提升决策树。差异主要体现在分类树的衡量标准是最大熵,而回归树的衡量标准是最小化均方差。

🐣 一、梯度提升回归树的介绍(GBRT/GBDT)

   wiki定义
   Gradient boosting is a machine learning technique for regression and classification problems, which produces a prediction model in the form of an ensemble of weak prediction models, typically decision trees. It builds the model in a stage-wise fashion like other boosting methods do, and it generalizes them by allowing optimization of an arbitrary differentiable loss function.

   换句话说,该模型主要通过 一些弱分类器的组合来构造一个强分类器,并且每次的梯度提升(Gradient boosting)以减少上一次的残差,就可以在残差减少的梯度方向上建立一个新的模型 ,这与Boosting对错误的样本加大加权的做法有着很大的区别。比如:我们通常绘制两个变量(或者多个变量)的关系时,对于初学者来说,可能会选择 一次项线性模型来解释,但实际上该模型最佳拟合为二次项,这时候就会存在比较大的残差。 为了优化模型,我们只能继续选择二次项模型来拟合减小模型的残差。 同理 ,GBRT也是先根据初始模型的一个残差(伪残差,较大残差),然后建立学习器来解释这部分残差,并通过梯度提高过程减小残差。最后反复迭代就可以找到一个使残差达到最小的模型。

   我们以一个示例进行解释:假设我们需要预测一群鸡的重量,第一颗树种某只鸡(A)的实际重量为8斤,预测出来的结果为5斤,真实值与预测值的差为3斤,那么残差为3。在第二颗树中,我们继续预设为3斤继续学习,如果第二棵树真的能把A分到3斤的叶子节点,那累加两棵树的结论就是A的真实结果。如果第二棵树的预测结果为2斤,则A仍然存在1岁的残差,第三棵树里A的结果为1斤,继续学习,然后依次迭代。。。。。

🐤 二、R语言代码学习过程

   在R语言中,我们可以利用gbm(广义提升回归模型)包中的 gbm函数

# 下载gbm包
install.packages("gbm")
# 加载R包
library(gbm)
# 咨询help了解gbm函数
?gbm()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这是基本的用法和参数设定,可以根据自己的需求进行修改。

这里,以发表在Nature Climate Change一篇文章为例,来讲解GBRT模型。

在这里插入图片描述
这篇文章利用了GBRT,最后实现了中国各地区不同情况下作物产量的一个预测。

由于文章中存在多个地区和处理,其处理方式是重复的,因此数据以某个地区某个处理为例:

  🥝 1、数据处理及处理

# Removing objects from the envrionment
rm(list = ls())
#==========================================================
# Loading library
library(gbm)
library(plyr)
library(dplyr)
library(ggplot2)
library(lattice)
library(caret)
library(hydroGOF)
library(gvlma)
library(car)

# set model for winter wheat in NCP
W_NCP<-read.csv("W-NCP.csv")
W_NCP$Year<-as.factor(W_NCP$Year)
W_NCP$Cultivar<-as.factor(W_NCP$Cultivar)
W_NCP$Soil.type<-as.factor(W_NCP$Soil.type)
W_NCP$Soil.texture<-as.factor(W_NCP$Soil.texture)

# set model for winter wheat in NCP
# set train and test data(random 10% for 50 times)
brt_WNCP_recyle<- NULL
best_inter_WNCP_recyle<-NULL
summary_recyle <- NULL
cor_1_recyle <- NULL
R2_1_recyle <- NULL
RMSE_1_recyle <- NULL
nRMSE_1_recyle<- NULL
ME_1_recyle <- NULL
P_value_1_recyle<-NULL

cor_2_recyle <- NULL
R2_2_recyle <- NULL
RMSE_2_recyle <- NULL
nRMSE_2_recyle<- NULL
ME_2_recyle <- NULL
P_value_2_recyle<-NULL

  🍎 2、模型构建

进行多次的计算模型,并选择最小的残差模型,并进行了GBRT和LM的比较。。(这里作者可能是通过服务器进行循环计算的,因为我每次电脑循环都直接崩溃了),这里我们只做一次展示。

head(W_NCP)
  set.seed(1)
  train_WNCP <- sample(nrow(W_NCP), 0.9*nrow(W_NCP))
  W_NCP_train <- W_NCP[train_WNCP,]
  W_NCP_test <- W_NCP[-train_WNCP,]
  
  
  # select required variables
  sub_W_NCP_train <- W_NCP_train %>%
    select(NO, Tave, Tmax, Tmin, GDD.0, PRE, SSD, RAD, Cultivar, Soil.type,
           Soil.texture, SOM, OP , AK, pH, N, P2O5, K2O, Ynpk)
  sub_W_NCP_test <- W_NCP_test %>%
    select(NO, Tave, Tmax, Tmin, GDD.0, PRE, SSD, RAD, Cultivar, Soil.type,
           Soil.texture, SOM, OP , AK, pH, N, P2O5, K2O, Ynpk)
  
  
  #building brt model
  set.seed(1)
  brt_WNCP<-gbm(Ynpk ~ Tmax + Tmin + GDD.0 + PRE + RAD + Cultivar+ Soil.type
                + Soil.texture + SOM + OP + AK + pH + N + P2O5 + K2O,
                data = sub_W_NCP_train, distribution = "gaussian", n.trees = 3000,
                interaction.depth = 9, shrinkage = 0.01,
                bag.fraction = 0.5,cv.folds = 10)
  brt_WNCP_recyle[[1]]<-brt_WNCP
  print(brt_WNCP)

在这里插入图片描述
从以下两张图来看,可以得出:模型再迭代2973次时达到了最小残差。

best_inter_WNCP<-gbm.perf(brt_WNCP,method = "cv")

在这里插入图片描述

best_inter_WNCP_recyle[[1]]<-best_inter_WNCP
  summary_record<-summary(brt_WNCP,n.trees=best_inter_WNCP)
  summary_recyle[[1]] <-summary_record

在这里插入图片描述
在这里插入图片描述
从上述两张图中可以看出各自变量对因变量的重要排序。

  🍌 3、GBRT模型的预测

###predict for test data
  #by GBRT
  sub_W_NCP_test$Ynpk_pred_1<-predict(brt_WNCP,sub_W_NCP_test)
  head(sub_W_NCP_test[, 19:20])

在这里插入图片描述

  🍐 4、绘制真实值与预测值的散点图并检验模型结果

#plot of actual and predict values
  plot(sub_W_NCP_test$Ynpk_pred_1,sub_W_NCP_test$Ynpk, xlim=c(3500,9500),ylim=c(3500,9500),
       xlab="Predicted yield (kg/ha)", ylab="Observed yield (kg/ha)")
  abline(a=0,b=1)
  fitline<-lm(Ynpk~Ynpk_pred_1,sub_W_NCP_test)
  abline(fitline,lty=2)
  summary(fitline)

在这里插入图片描述

在这里插入图片描述
从上述散点图中的拟合线来看,真实值与预测值还是存在一定的差异。但是总体R2达到了35%,p值远远小于0.0001。

  🍓 5、模型比较(与LM)

#by lm
  lm_fit1_WNCP<-lm(Ynpk ~ Tmax + Tmin + GDD.0 + PRE + RAD + Cultivar+ Soil.type +Soil.texture
                   + SOM + OP + AK + pH + N + P2O5 + K2O, data = sub_W_NCP_train)
  summary(lm_fit1_WNCP)

在这里插入图片描述
进一步对模型进行预测绘图:

sub_W_NCP_test$Ynpk_pred_2<-predict(lm_fit1_WNCP,sub_W_NCP_test)
  
  #plot of actual and predict values
  plot(sub_W_NCP_test$Ynpk_pred_2,sub_W_NCP_test$Ynpk, xlim=c(3500,9500),ylim=c(3500,9500),
       xlab="Predicted yield (kg/ha)", ylab="Observed yield (kg/ha)")
  abline(a=0,b=1)
  fitline2<-lm(Ynpk~Ynpk_pred_2,sub_W_NCP_test)
  abline(fitline2,lty=2)
  summary(fitline2)

在这里插入图片描述
在这里插入图片描述
从LM模型的真实值与预测值拟合效果来看,差异还是比较大的。R2仅有15%,小于GBRT模型的R2=35%。从初步结果来看,意味着GBRT模型优于LM模型。

进一步比较两个模型RMSE的结果:

RMSE_1_recyle[[1]] <- RMSE_1; RMSE_1_recyle
  RMSE_2_recyle[[1]] <- RMSE_2; RMSE_2_recyle
  
  nRMSE_1_recyle[[1]] <- nRMSE_1; nRMSE_1_recyle
  nRMSE_2_recyle[[1]] <- nRMSE_2; nRMSE_2_recyle

GBRT的RMSE等指标均小于LM。确实证明了GBRT模型优于LM模型。
在这里插入图片描述

🦅 三、GBRT模型的优势

优点如下:

(1)防止过拟合;
(2)每一步的残差计算其实变相地增大了分错instance的权重,而已经分对的instance则都趋向于0;
(3)残差作为全局最优的绝对方向。

GBRT的两个版本理解:

(1)残差版本把GBRT认为是一个残差迭代树,每一棵回归树都在学习前N-1棵树的残差。 求解方法:残差----残差是全局最优值;优化目标:让结果变成最好。

(2)Gradient版本把 GBRT看作一个梯度迭代树,使用梯度下降法求解,每一棵回归树在学习前N-1棵树的梯度下降值。求解方法:局部最优方向 * 步长 ; 优化目标:让结果变成更好。

随机森林与梯度提升回归树的对比:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考链接:https://www.cnblogs.com/zhizhan/p/5088775.html

增强回归(Gradient Boosting Regression Tree)是一种集成学习方法,它将多个回归模型组合起来,通过迭代训练来提升预测性能。 在R语言中,我们可以使用`gbm`实现增强回归模型。首先,我们需要准备我们的数据集,确保数据集中的所有变量都是数值型的,并将目标变量编码为数值。然后,我们可以调用`gbm`函数来拟合我们的模型。 在调用`gbm`函数时,我们需要指定一些重要的参数。其中,`formula`参数用于指定模型的公式,其中目标变量和预测变量之间的关系可以通过\`+\`分隔符进行指定。`data`参数用于指定数据集。`n.trees`参数指定生成的回归的数量,通常使用交叉验证来选择合适的数量。`interaction.depth`参数用于指定每颗回归的最大深度。`shrinkage`参数用于控制每颗回归的权重,一般设定在0.01到0.1之间。`distribution`参数用于指定模型的分布类型,可选择`"gaussian"`(高斯分布)或`"poisson"`(泊松分布)等。 训练完模型后,我们可以使用`predict`函数对新数据进行预测。此外,通过使用`summary`函数,我们还可以查看模型的相关统计信息,例如重要性排序、拟合曲线等。 需要注意的是,增强回归模型在处理大规模数据集时可能会消耗大量的计算资源,并且对于某些数据集可能会存在过拟合的问题。因此,在使用增强回归模型时,我们需要合理选择参数,并进行适当的模型验证和调整。 总之,通过使用R语言中的`gbm`,我们可以方便地构建增强回归模型实现更准确的预测和建模能力。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

酷在前行

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

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

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

打赏作者

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

抵扣说明:

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

余额充值