GBDT算法理论

1.GBDT简介
      梯度提升树(Gradient Boosting Decison Tree, GBDT)是集成学习boosting家族的成员,却和传统的Adaboost有很大的不同。回顾下Adaboost,我们是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。GBDT通过多轮迭代,每轮迭代产生一个弱分类器,每个分类器在上一轮分类器的残差基础上进行训练。对弱分类器的要求一般是足够简单,并且是低方差和高偏差的。因为训练的过程是通过降低偏差来不断提高最终分类器的精度。由于上述高偏差的要求,每个分类回归树的深度不会很深。最终的总分类器是将每轮训练得到的弱分类器加权求和得到的(也就是加法模型)。
2.GBDT的负梯度拟合
      提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数式平方损失和指数损失函数时,每一步优化是很简单的。但对一般损失函数而言,往往每一步优化并不容易。针对这一问题,Freidman提出梯度提升算法。这是利用最速下降法的近似方法,其关键是利用损失函数的负梯度在当前模型的值
r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) {{r}_{mi}}=-{{\left[ \frac{\partial L\left( {{y}_{i}},f\left( {{x}_{i}} \right) \right)}{\partial f\left( {{x}_{i}} \right)} \right]}_{f\left( x \right)={{f}_{m-1}}\left( x \right)}} rmi=[f(xi)L(yi,f(xi))]f(x)=fm1(x)
作为回归问题提升树算法中的残差的近似值,拟合一个回归树。
3.GBDT回归算法
输入:训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\left\{ \left( {{x}_{1}},{{y}_{1}} \right),\left( {{x}_{2}},{{y}_{2}} \right),...,\left( {{x}_{N}},{{y}_{N}} \right) \right\} T={(x1,y1),(x2,y2),...,(xN,yN)} x i ∈ X ⊆ R n , y i ∈ Y ⊆ R {{x}_{i}}\in \Chi \subseteq {{R}^{n}},{{y}_{i}}\in Y\subseteq R xiXRn,yiYR;则损失函数 L ( y , f ( x ) ) L\left( y,f\left( x \right) \right) L(y,f(x))
输出:回归树 f M ( x ) {{f}_{M}}\left( x \right) fM(x)
(1)初始化
f 0 ( x ) = arg ⁡ min ⁡ c   ∑ i = 1 N L ( y i , c ) {{f}_{0}}\left( x \right)=\arg \underset{c}{\mathop{\min }}\,\sum\limits_{i=1}^{N}{L\left( {{y}_{i}},c \right)} f0(x)=argcmini=1NL(yi,c)
(2)对 m = 1 , 2 , . . . , M m=1,2,...,M m=1,2,...,M
(a)对 i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N,计算
r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) {{r}_{mi}}=-{{\left[ \frac{\partial L\left( {{y}_{i}},f\left( {{x}_{i}} \right) \right)}{\partial f\left( {{x}_{i}} \right)} \right]}_{f\left( x \right)={{f}_{m-1}}\left( x \right)}} rmi=[f(xi)L(yi,f(xi))]f(x)=fm1(x)
(b)对 r m i {{r}_{mi}} rmi拟合一个回归树,得到第m棵树的叶结点区域 R m j {{R}_{mj}} Rmj j = 1 , 2 , . . . , J j=1,2,...,J j=1,2,...,J
(c)对 j = 1 , 2 , . . . , J j=1,2,...,J j=1,2,...,J,计算
c m j = arg ⁡ min ⁡ c   ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) {{c}_{mj}}=\arg \underset{c}{\mathop{\min }}\,\sum\limits_{{{x}_{i}}\in {{R}_{mj}}}{L\left( {{y}_{i}},{{f}_{m-1}}\left( {{x}_{i}} \right)+c \right)} cmj=argcminxiRmjL(yi,fm1(xi)+c)
(d)更新
f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x ∈ R m j ) {{f}_{m}}\left( x \right)={{f}_{m-1}}\left( x \right)+\sum\limits_{j=1}^{J}{{{c}_{mj}}I\left( x\in {{R}_{mj}} \right)} fm(x)=fm1(x)+j=1JcmjI(xRmj)
(3)得到回归树
f M ( x ) = ∑ i = 1 M ∑ j = 1 J c m j I ( x ∈ R m j ) {{f}_{M}}\left( x \right)=\sum\limits_{i=1}^{M}{\sum\limits_{j=1}^{J}{{{c}_{mj}}I\left( x\in {{R}_{mj}} \right)}} fM(x)=i=1Mj=1JcmjI(xRmj)
      可参考我之前文章写得前向分布回归算法进行理解。
4.GBDT分类算法
4.1二元GBDT分类算法
      对于二元GBDT,如果用类似于逻辑回归的对数似然函数,则损失函数为:
L ( y , f ( x ) ) = log ⁡ ( 1 + exp ⁡ ( − y f ( x ) ) ) , y ∈ { − 1 , + 1 } L\left( y,f\left( x \right) \right)=\log \left( 1+\exp \left( -yf\left( x \right) \right) \right),y\in \left\{ -1,+1 \right\} L(y,f(x))=log(1+exp(yf(x))),y{1,+1}
      此时的负梯度误差为:
r m i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) = y i / ( 1 + exp ⁡ ( y i f ( x i ) ) ) {{r}_{mi}}=-{{\left[ \frac{\partial L\left( {{y}_{i}},f\left( {{x}_{i}} \right) \right)}{\partial f\left( {{x}_{i}} \right)} \right]}_{f\left( x \right)={{f}_{m-1}}\left( x \right)}}\text{=}{{y}_{i}}/\left( 1+\exp \left( {{y}_{i}}f\left( {{x}_{i}} \right) \right) \right) rmi=[f(xi)L(yi,f(xi))]f(x)=fm1(x)=yi/(1+exp(yif(xi)))
      对于生成的决策树,各个叶子节点的最佳负梯度拟合值为:
c m j = arg ⁡ min ⁡ c   ∑ x i ∈ R m j log ⁡ ( 1 + exp ⁡ ( − y i f m − 1 ( x i ) + c ) ) {{c}_{mj}}=\arg \underset{c}{\mathop{\min }}\,\sum\limits_{{{x}_{i}}\in {{R}_{mj}}}{\log \left( 1+\exp \left( -{{y}_{i}}{{f}_{m-1}}\left( {{x}_{i}} \right)+c \right) \right)} cmj=argcminxiRmjlog(1+exp(yifm1(xi)+c))
      由于上式比较难优化,我们一般使用近似值替代
c m j = ∑ x i ∈ R m j r m i / ∑ x i ∈ R m j ∣ r m i ∣ ( 1 − ∣ r m i ∣ ) {{c}_{mj}}=\sum\limits_{{{x}_{i}}\in {{R}_{mj}}}{{{r}_{mi}}}/\sum\limits_{{{x}_{i}}\in {{R}_{mj}}}{\left| {{r}_{mi}} \right|\left( 1-\left| {{r}_{mi}} \right| \right)} cmj=xiRmjrmi/xiRmjrmi(1rmi)
4.2多元GBDT分类算法
      多元GBDT要比二元GBDT复杂一些,对应的是多元逻辑回归和二元逻辑回归的复杂度差别。假设类别数为K,则此时我们的对数似然损失函数为:
L ( y , f ( x ) ) = − ∑ k = 1 K y k log ⁡ p k ( x ) L\left( y,f\left( x \right) \right)=-\sum\limits_{k=1}^{K}{{{y}_{k}}\log {{p}_{k}}\left( x \right)} L(y,f(x))=k=1Kyklogpk(x)
      如果样本输出类别为k,则 y k = 1 {{y}_{k}}=1 yk=1。第k类的概率 p k ( x ) {{p}_{k}}\left( x \right) pk(x)的表达式为:
L ( y , f ( x ) ) = − ∑ k = 1 K y k log ⁡ p k ( x ) L\left( y,f\left( x \right) \right)=-\sum\limits_{k=1}^{K}{{{y}_{k}}\log {{p}_{k}}\left( x \right)} L(y,f(x))=k=1Kyklogpk(x)
      第m轮的第i个样本对应类别k的负梯度误差为
r m i k = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) = y i k − p k , m − 1 ( x i ) {{r}_{mik}}=-{{\left[ \frac{\partial L\left( {{y}_{i}},f\left( {{x}_{i}} \right) \right)}{\partial f\left( {{x}_{i}} \right)} \right]}_{f\left( x \right)={{f}_{m-1}}\left( x \right)}}\text{=}{{y}_{ik}}-{{p}_{k,m-1}}\left( {{x}_{i}} \right) rmik=[f(xi)L(yi,f(xi))]f(x)=fm1(x)=yikpk,m1(xi)
      观察上式可以看出,其实这里的误差就是样本i对应类别k的真实概率和m−1轮预测概率的差值。
      对于生成的决策树,我们各个叶子节点的最佳负梯度拟合值为
c m j k = arg ⁡ min ⁡ c j k   ∑ i = 1 N ∑ k = 1 K L ( y i k , f m − 1 , k ( x i ) + ∑ j = 0 J c j k I ( x i ∈ R m j ) ) {{c}_{mjk}}=\arg \underset{{{c}_{jk}}}{\mathop{\min }}\,\sum\limits_{i=1}^{N}{\sum\limits_{k=1}^{K}{L\left( {{y}_{ik}},{{f}_{m-1,k}}\left( {{x}_{i}} \right)+\sum\limits_{j=0}^{J}{{{c}_{jk}}I\left( {{x}_{i}}\in {{R}_{mj}} \right)} \right)}} cmjk=argcjkmini=1Nk=1KL(yik,fm1,k(xi)+j=0JcjkI(xiRmj))
      由于上式比较难优化,我们一般使用近似值替代
c m j k = K − 1 K ∑ x i ∈ R m j k r m i k ∑ x i ∈ R m j k ∣ r m i k ∣ ( 1 − ∣ r m i k ∣ ) {{c}_{mjk}}=\frac{K-1}{K}\frac{\sum\limits_{{{x}_{i}}\in {{R}_{mjk}}}{{{r}_{mik}}}}{\sum\limits_{{{x}_{i}}\in {{R}_{mjk}}}{\left| {{r}_{mik}} \right|\left( 1-\left| {{r}_{mik}} \right| \right)}} cmjk=KK1xiRmjkrmik(1rmik)xiRmjkrmik
      这里不再给出例子,可以参照我之前写的Adaboost分类算法的例子,这里的 c m j k {{c}_{mjk}} cmjk其实就是预测的概率。我们的第m棵树有J个叶子,每个叶子就是一个类别(可能多个叶子都代表同一个类别),数据被分到哪个叶子上就使用该叶子的权重,这里一共有M棵树,那么将数据对应的各棵树的树叶的权值 c m j k {{c}_{mjk}} cmjk对应着类别进行相加,就可以得到该数据在对应类别的权重,选出最高的权重对应的类别,该类别就是此数据的类别。
      下面给出原论文中的伪代码截图:
在这里插入图片描述
5.GBDT常用损失函数
5.1分类算法
(1)指数损失函数
L ( y , f ( x ) ) = exp ⁡ ( − y f ( x ) ) L\left( y,f\left( x \right) \right)=\exp \left( -yf\left( x \right) \right) L(y,f(x))=exp(yf(x))
(2)对数损失函数
      二元分类: L ( y , f ( x ) ) = log ⁡ ( 1 + exp ⁡ ( − y f ( x ) ) ) L\left( y,f\left( x \right) \right)=\log \left( 1+\exp \left( -yf\left( x \right) \right) \right) L(y,f(x))=log(1+exp(yf(x)))
      多元分类: L ( y , f ( x ) ) = − ∑ k = 1 K y k log ⁡ p k ( x ) L\left( y,f\left( x \right) \right)=-\sum\limits_{k=1}^{K}{{{y}_{k}}\log {{p}_{k}}\left( x \right)} L(y,f(x))=k=1Kyklogpk(x)
5.2回归算法
(1)均方差(最常见)
L ( y , f ( x ) ) = ( y − f ( x ) ) 2 L\left( y,f\left( x \right) \right)={{\left( y-f\left( x \right) \right)}^{2}} L(y,f(x))=(yf(x))2
(2)绝对损失(很常见)
L ( y , f ( x ) ) = ∣ y − f ( x ) ∣ L\left( y,f\left( x \right) \right)=\left| y-f\left( x \right) \right| L(y,f(x))=yf(x)
      对应负梯度误差为:
s i g n ( y i − f ( x i ) ) sign\left( {{y}_{i}}-f\left( {{x}_{i}} \right) \right) sign(yif(xi))
(3)Huber损失,它是均方差和绝对损失的折衷产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。
L ( y , f ( x ) ) = { 1 2 ( y − f ( x ) ) 2 , ∣ y − f ( x ) ∣ ≤ δ δ ( ∣ y − f ( x ) ∣ − δ 2 ) , ∣ y − f ( x ) ∣ > δ L\left( y,f\left( x \right) \right)=\left\{ \begin{matrix} \frac{1}{2}{{\left( y-f\left( x \right) \right)}^{2}},\left| y-f\left( x \right) \right|\le \delta \\ \delta \left( \left| y-f\left( x \right) \right|-\frac{\delta }{2} \right),\left| y-f\left( x \right) \right|>\delta \\ \end{matrix} \right. L(y,f(x))={21(yf(x))2,yf(x)δδ(yf(x)2δ),yf(x)>δ
      对应负梯度误差为:
r ( y i , f ( x i ) ) = { y i − f ( x i ) , ∣ y − f ( x ) ∣ ≤ δ δ s i g n ( y i − f ( x i ) ) , ∣ y − f ( x ) ∣ > δ r\left( {{y}_{i}},f\left( {{x}_{i}} \right) \right)=\left\{ \begin{matrix} {{y}_{i}}-f\left( {{x}_{i}} \right),\left| y-f\left( x \right) \right|\le \delta \\ \delta sign\left( {{y}_{i}}-f\left( {{x}_{i}} \right) \right),\left| y-f\left( x \right) \right|>\delta \\ \end{matrix} \right. r(yi,f(xi))={yif(xi),yf(x)δδsign(yif(xi)),yf(x)>δ
(4)分位数损失
L ( y , f ( x ) ) = ∑ y ≥ f ( x ) θ ∣ y − f ( x ) ∣ + ∑ y &lt; f ( x ) ( 1 − θ ) ∣ y − f ( x ) ∣ L\left( y,f\left( x \right) \right)=\sum\limits_{y\ge f\left( x \right)}{\theta \left| y-f\left( x \right) \right|}+\sum\limits_{y&lt;f\left( x \right)}{\left( 1-\theta \right)\left| y-f\left( x \right) \right|} L(y,f(x))=yf(x)θyf(x)+y<f(x)(1θ)yf(x)
      其中 θ \theta θ为分位数,需要我们在回归之前指定。对应的负梯度误差为:
r ( y i , f ( x i ) ) = { θ , y i ≥ f ( x i ) θ − 1 , y i &lt; f ( x i ) r\left( {{y}_{i}},f\left( {{x}_{i}} \right) \right)=\left\{ \begin{matrix} \theta ,{{y}_{i}}\ge f\left( {{x}_{i}} \right) \\ \theta -1,{{y}_{i}}&lt;f\left( {{x}_{i}} \right) \\ \end{matrix} \right. r(yi,f(xi))={θ,yif(xi)θ1,yi<f(xi)
      对于Huber损失和分位数损失,主要用于健壮回归,也就是减少异常点对损失函数的影响。
6.GBDT的正则化
(1)和Adaboost类似的正则化项,即步长(learning rate,lr)。例如:
f k ( x ) = f k − 1 ( x ) + l r ⋅ α k h k ( x ) {{f}_{k}}\left( x \right)\text{=}{{f}_{k-1}}\left( x \right)+lr\cdot {{\alpha }_{k}}{{h}_{k}}\left( x \right) fk(x)=fk1(x)+lrαkhk(x)
(2)子采样。取值为(0,1),子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。使用了子采样的GBDT有时也称作随机梯度提升树(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采样,程序可以通过采样分发到不同的任务去做boosting的迭代过程,最后形成新树,从而减少弱学习器难以并行学习的弱点。
(3)对于弱学习器即CART回归树进行正则化剪枝。具体在李航的《统计学习方法》里有,后面的我可能根据小蓝书更新一下。
7.总结
      GBDT在传统机器学习算法里面是对真实分布拟合的最好的几种算法之一,在前几年深度学习还没有大行其道之前,GBDT在各种竞赛是大放异彩。原因大概有几个,一是效果确实挺不错;二是既可以用于分类也可以用于回归;三是可以筛选特征。
GBDT主要的优点有:
      (1)可以灵活处理各种类型的数据,包括连续值和离散值。
      (2)在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。
      (3)使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile(分位数)损失函数。
GBDT的主要缺点有:
      (1)由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。

参考文章:
https://www.cnblogs.com/pinard/p/6140514.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值