GBDT算法详解

(作者:陈玓玏)
GBDT论文的全称:greedy function approximation: a gradient boosting machine。从这个标题可以看出,它是一种贪心算法,并且是与梯度有关的。常见的GBRT算法其实就是GBDT算法,中文我们一般叫梯度提升树。GBDT与一般的算法不同之处在于它是在函数空间上进行的优化,而不是从参数空间上进行的。

1、 函数优化

预测系统的目标是要找到一个能够使以下表达式结果最小的函数,即 F ∗ F^* F,这里的 E y , X E_{y,X} Ey,X表述方法其实很少见,不过以我的愚见,应当就是我们常见的其他算法损失函数中前面的乘积项 − 1 m -\frac1m m1,只不过这里用了一种更通用的方法来表示而已:
在这里插入图片描述
Gradient Boosting是一种算法框架,一种固定范式,它可以用于分类也可以用于回归,并且能够定义不同的损失函数。式中 L ( y , F ( x ) ) L(y,F(x)) L(y,F(x))表示的是损失函数,常用的损失函数有平方损失函数、绝对值损失函数和 l o g ( 1 + e − 2 y F ) log(1+e^{-2yF}) log(1+e2yF)损失函数(进行 y ∈ y\in y{ − 1 , 1 {-1,1} 1,1}分类时)。

对于GB框架而言,多个基分类器最终组成的预测结果如下:
在这里插入图片描述
其中 f 0 f_0 f0是一个初始的估计值,可以任意给出, f 1 , . . . . , f M f_1,....,f_M f1,....,fM是由优化算法确定的增量函数,它们的求解方法如下:
在这里插入图片描述
每个增量函数的值都是步长 ρ m \rho_m ρm*负梯度 − g m ( X ) -g_m(X) gm(X),梯度 g m ( X ) g_m(X) gm(X)的求解方法如下:
在这里插入图片描述
步长 ρ m \rho_m ρm也不是固定不变的,它的求解如下:
在这里插入图片描述
其实际就是使得目标函数最小的步长(小声逼逼。。这么说起来也可以通过求导等于0来计算步长?)。

2、 GB框架

当数据量有限时,以上形式可能得不出一个精确的结果,还是需要用到带参数的函数形式,通过参数的优化来达到函数的优化。
GBDT考虑这样一种函数形式:
在这里插入图片描述
β m \beta_m βm是基分类器的权重, h ( X ; a m ) h(X;a_m) h(X;am)是基分类器的输出结果, X X X是输入变量,而 a m a_m am是权重向量。对于回归树而言, a m a_m am是分割节点。
也就是将目标函数及其最优解表达为以下形式:
在这里插入图片描述
采用贪婪的逐步求解算法来求得 M M M对参数,也就是对于每个基分类器,我们通过以下式子来求解其参数:
在这里插入图片描述
求得结果后再更新前 m m m个基分类器的输出结果和为:
在这里插入图片描述
综上,GBDT框架如下:
在这里插入图片描述
简要描述一下算法:

  1. 算法中 F 0 ( x ) F_0(x) F0(x)是初始估计,根据损失函数及最初的步长来给出(这么说起来初始步长应该会对算法收敛速度起到相当重要的作用)。
  2. 在每次迭代中, y ~ i \tilde y_i y~i实际上就是负梯度 − g m ( x i ) -g_m(x_i) gm(xi),之所以可以表示成 y ~ i \tilde y_i y~i我个人的理解是,我们本轮建树的结果就是要逼近这个值,所以我们姑且把它作为本棵树需要逼近的label。
  3. 既然已经求得了本轮需要逼近的label值 y ~ i \tilde y_i y~i,我们就可以求得参数 a m a_m am,如果是树模型,那就是求得树的分割点。这个式子中用到的是平方损失函数。
  4. 实际上,我理解的算法中表示的 ρ m \rho_m ρm就是 β m \beta_m βm,也就是说我们之后要求的就是向梯度方向逼近的最佳步长。
  5. 最后一步就是像参数的梯度更新一样,更新函数,更新的方式就是加上逼近负梯度的值,也就是步长*本轮拟合的值。
    到这里其实还只讲了GBDT的GB框架,DT也就是决策树还没出现。

3、GBDT

当这个框架用在不同的损失函数上时,对应的就是不同的算法。论文中介绍了四种损失函数的GB应用,分别是平方损失、绝对偏差损失函数、Huber和logistic binomial log-likehood损失函数。

3.1 GB框架用于平方损失函数时

平方损失函数 L ( y , F ) = ( y − F ) 2 / 2 L(y,F)=(y-F)^2/2 L(y,F)=(yF)2/2,对 F F F求偏导的结果为 y − F y-F yF,因此其算法更新为以下形式:
在这里插入图片描述
实际上,除了 y ~ i \tilde y_i y~i的形式和初始 F 0 F_0 F0改变了,其他并未改变,不过即使 y ~ i \tilde y_i y~i形式变了,其本质依旧是残差,是负梯度。

3.2 GB框架用于绝对值损失函数

绝对值损失函数为 ∣ y − F ∣ |y-F| yF,其 y ~ i \tilde y_i y~i需要替换成偏导-符号函数 s i g n ( y i − F ( x i ) ) sign(y_i-F(x_i)) sign(yiF(xi)),另外步长的求解方式可以化简成以下形式:
在这里插入图片描述
论文中提到函数 W W W{}是加权中值,但是我其实不知道具体是怎么个求法,举双手求科普呀喂!

3.3 回归树

之前讨论的案例中,基学习器 h ( x i ; a m ) h(x_i;a_m) h(xi;am)还从未露出过真面目。那么如果基学习器我们使用回归树,对于有 J J J个叶子节点的树而言,每棵树表示为以下形式:
在这里插入图片描述
R j R_j Rj代表的是每个叶子节点代表的区域,而 b j b_j bj是每个叶子节点的值,代表落入此区域的样本的输出值,当样本落入第 j j j个叶子节点,也就是落入第 j j j个区域,其输出值就是 b j b_j bj
其算法流程更新如下:
在这里插入图片描述
回归树用的损失函数其实是平方损失函数,所以照理说 y ~ i \tilde y_i y~i应该是 y i − F ( x i ) y_i-F(x_i) yiF(xi)才对,不知道论文中为什么写的符号函数。算法的第二步是构建回归树,逐级将所有的样本划分到 J J J个叶子节点上。第三步计算 γ j m \gamma_jm γjm其实是 ρ m ∑ b j 1 \rho_m\sum{b_j}1 ρmbj1,也就是步长*回归树的输出值,这里回归树的值是确定的,所以计算 γ j m \gamma_jm γjm就相当于在计算最优步长。

3.4 二分类决策树

当基学习器是二分类决策树时,其损失函数如下:
在这里插入图片描述
F ( X ) F(X) F(X)的表达式如下(谁能告诉我为啥子表达式长这样?):
在这里插入图片描述
其算法更新如下:
在这里插入图片描述
初始值 F 0 F_0 F0是通过上面定义的 F F F函数表达式确定的,分类树需要去拟合的残差 y ~ i \tilde y_i y~i是由损失函数对 F F F求负梯度(这大概能说明负梯度不总是等于残差的?除了sigmoid函数和均方损失函数)得到的,根据需要拟合的label求得一个有 J J J个叶子节点的分类树。 γ j m \gamma _jm γjm本来是通过损失函数最小化来求得的,但是对log求最小值是impossible的,从其函数形状能看出来,因此把其转换成了图中的形式,转换的理由是(我木有看懂这个理由):
在这里插入图片描述

4. 正则化

1) Shrinkage:即学习率
在这里插入图片描述
v v v就是学习率。 一般来说,学习率小,迭代次数就会增多,且不容产生过拟合,一般选取0.1左右。

2)减少基学习器的数目
这个参数和学习率是相互矛盾的,当学习率减小时,过拟合会减弱,但基学习器数目会增多,因此需要在这两个变量之间寻求一个折衷的方案,具体的可以通过测试集或交叉验证来选择最佳参数。

3) 限制叶子节点中样本数目、剪枝、限制树深,这些都是决策树必有的正则化方案。


参考文章:
  1. 论文:https://statweb.stanford.edu/~jhf/ftp/trebst.pdf,可能需要翻墙
  2. https://blog.csdn.net/niuniuyuh/article/details/76922210
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值