机器学习复习12-GBDT

GBDT有两个不同版本:

残差版本把GBDT说成一个残差迭代树,认为每一棵回归树都在学习前N-1棵树的残差。
Gradient版本把GBDT说成一个梯度迭代树,使用梯度下降法求解,认为每一棵回归树在学习前N-1棵树的梯度下降值。

1.残差版本

GBDT主要由三个概念组成:
Regression Decistion Tree(即DT),
Gradient Boosting(即GB),
Shrinkage (算法的一个重要演进分枝,目前大部分源码都按该版本实现)。
我们逐一去弄懂它们。

1.1 Regression Decistion Tree(即DT)

决策树分为两大类,回归树和分类树。
前者用于预测实数值,如明天的温度、用户的年龄、网页的相关程度;后者用于分类标签值,如晴天/阴天/雾/雨、用户性别、网页是否是垃圾页面。
这里要强调的是,前者的结果加减是有意义的,如10岁+5岁-3岁=12岁,后者则无意义,如男+男+女=到底是男是女?
GBDT的核心在于累加所有树的结果作为最终结果,就像前面对年龄的累加(-3是加负3),而分类树的结果显然是没办法累加的,
所以GBDT中的树都是回归树,不是分类树,这点对理解GBDT相当重要(尽管GBDT调整后也可用于分类但不代表GBDT的树是分类树)。

那么回归树是如何工作的呢?
回归树总体流程也是类似,不过在每个节点(不一定是叶子节点)都会得一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。

分枝时穷举每一个feature的每个阈值找最好的分割点,但衡量最好的标准不再是最大熵,而是最小化均方差–即(每个人的年龄-预测年龄)^2 的总和 / N,或者说是每个人的预测误差平方和 除以 N。(点这里看CART回归树构建过程即可理解)

分枝直到每个叶子节点上人的年龄都唯一(这太难了)或者达到预设的终止条件(如叶子个数上限),若最终叶子节点上人的年龄不唯一,则以该节点上所有人的平均年龄做为该叶子节点的预测年龄。

预测时:
在这里插入图片描述

1.2 Gradient Boosting(即GB)

GBDT是把所有树的结论累加起来做最终结论的,所以可以想到每棵树的结论并不是年龄本身,而是年龄的一个累加量

GBDT的核心就在于,每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。

比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学。这就是Gradient Boosting在GBDT中的意义

需要注意的是,这里并没有提及到梯度的概念,这是因为残差版本GBDT并未使用到梯度!!!

1.3 Shrinkage

Shrinkage(缩减)的思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合
即它不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。

用方程来看更清晰,即:

1. 没用Shrinkage时:
y i y_i 表示第 i i 棵树上 y y 的预测值, y ( 1 , i ) y(1,i) 表示前 i i 棵树 y y 的综合预测值)

y ( i + 1 ) = ( y 1 , y i ) y(i+1) = 残差(y_1,y_i) ················(1)

其中: y ( i + 1 ) y(i+1) 相当于下一步的真实值, ( y 1 , y i ) = y y ( 1 , i ) 残差(y_1,y_i) = y真实值 - y(1,i)

y ( 1 , i ) = S U M ( y 1 , . . . , y i ) y(1,i) = SUM(y_1, ..., y_i) ················(2)

2. Shrinkage不改变(1):
只把(2)改为:
y ( 1 , i ) = y ( 1 , i 1 ) + s t e p y i y(1,i) = y(1,i-1) + step * y_i

Shrinkage仍然以残差作为学习目标,但对于残差学习出来的结果,只累加一小部分(step*残差)逐步逼近目标,step一般都比较小,如0.01~0.001(注意该step非gradient的step),导致各个树的残差是渐变的而不是陡变的。

直觉上这也很好理解,不像直接用残差一步修复误差,而是只修复一点点,其实就是把大步切成了很多小步。

本质上,Shrinkage为每棵树设置了一个weight,累加时要乘以这个weight,但和Gradient并没有关系,这个weight就是step。

至此,残差版本的GBDT我们全部理解完毕。

注意:
GBDT与Adaboost最大的不同体现在三点:

1)弱分类器为回归树

2)样本权重不变

3)Loss默认为均方差 ( 残差树版本)或自定义Loss(梯度树版本);

Adaboost是一个loss限定的二分类boosting方法(也可以回归,但二分类比较多);而GBDT是一个loss可配置的回归boosting方法。

2.梯度版本

总的来说残差和梯度版本:
相同之处在于,都是迭代回归树,都是累加每颗树结果作为最终结果(Multiple Additive Regression Tree),每棵树都在学习前N-1棵树尚存的不足,从总体流程和输入输出上两者是没有区别的;
两者的不同主要在于每步迭代时,是否使用Gradient作为求解方法。前者不用Gradient而是用残差----残差是全局最优值,Gradient是局部最优方向*步长,即前者每一步都在试图让结果变成最好,后者则每步试图让结果更好一点

两者优缺点
看起来前者更科学一点–有绝对最优方向不学,为什么舍近求远去估计一个局部最优方向呢?原因在于灵活性
前者最大问题是,由于它依赖残差,cost function一般固定为反映残差的均方差,因此很难处理纯回归问题之外的问题
后者求解方法为梯度下降,只要可求导的cost function都可以使用,所以用于排序的LambdaMART就是用的后者。

需要注意的点:

  1. GBDT中的Boost是样本目标的迭代,不是re-sampling的迭代,也不是Adaboost,即:GBDT中每步boost的样本集都是不变的,变的是每个样本的回归目标值。
  2. Shrinkage不是Gradient的步长。1)shrinkage的处理对象不一定是Gradient方向,也可以是残差,可以是任何增量,即目标=任何东西*shrinkage步长。2)shrinkage决定的是最终走出的一步大小,而不是希望走出的一步大小。前者是对于已有的学习结果打折,后者是在决定学习目标时对局部最优方向上走多远负责。3)shrinkage设小了只会让学习更慢,设大了就等于没设,它适用于所有增量迭代求解问题;而Gradient的步长设小了容易陷入局部最优点,设大了容易不收敛。它仅用于用梯度下降求解。–这两者其实没太大关系。
  3. GBDT中的Gradient不一定必须是Gradient,即残差版本。

GBDT几乎可用于所有回归问题(线性/非线性),相对logistic regression仅能用于线性回归,GBDT的适用面非常广。亦可用于二分类问题(设定阈值,大于阈值为正例,反之为负例)。

发布了71 篇原创文章 · 获赞 20 · 访问量 4840

猜你喜欢

转载自blog.csdn.net/qq_22795223/article/details/105308599