一、引言
在集成学习原理介绍中,简单的介绍了根据个体学习器学习方式不同划分的两大类集成学习方法,个体学习器间存在强依赖关系、必须串行生成的序列化方法,如Boosting;个体学习器间不存在强依赖关系、可同时生成的并行化方法,如Bagging。
回顾一下Boosting算法的学习机制:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的的训练样本在后续受到更多关注,然后基于调整后的样本分布训练下一个基学习器;重复进行,直到基学习器数目达到事先指定的值T,最终将这T个基学习器加权结合。
在Adaboost算法原理小结,介绍了Boosting家族的一个重要算法Adaboost,今天我们来看一看Boosting家族中另一个更加常用的的算法GBDT。
二、GBDT概述
GBDT全称Gradient Boosting Decison Tree,同为Boosting家族的一员,它和Adaboost有很大的不同。Adaboost 是利用前一轮弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去,简单的说是Boosting框架+任意基学习器算法+指数损失函数。GBDT也是迭代,也使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同,简单的说Boosting框架+CART回归树模型+任意损失函数。
GBDT的思想可以用一个通俗的例子解释,假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。
三、负梯度拟合
在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是 Ht−1(x) H t − 1 ( x ) , 损失函数是 L(f(x),Ht−1(x)) L ( f ( x ) , H t − 1 ( x ) ) , 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器 ht(x) h t ( x ) ,让本轮的损失 L(f(x),ht(x)+Ht−1(x)) L ( f ( x ) , h t ( x ) + H t − 1 ( x ) ) 最小,那么GBDT是如何实现让本轮的损失最小的呢?
针对这个问题,大牛Freidman提出了用损失函数的负梯度来拟合本轮损失 L(f(x),ht(x)+Ht−1(x)) L ( f ( x ) , h t ( x ) + H t − 1 ( x ) ) 的近似值,进而拟合一个CART回归树。第 t 轮的第 i 个样本的损失函数的负梯度表示为
rti=−∂L(yi,ht−1(xi))∂ht−1(xi) r t i = − ∂ L ( y i , h t − 1 ( x i ) ) ∂ h t − 1 ( x i )
利用 (xi,rti),i=1,2,⋯,m ( x i , r t i ) , i = 1 , 2 , ⋯ , m ,我们可以拟合一棵CART回归树,得到了第 t 棵回归树,其对应的叶结点区域 Rtj,j=1,2,⋯,J R t j , j = 1 , 2 , ⋯ , J 。其中 J J 为叶子结点的个数。
针对每一个叶子结点里的样本,我们求出使损失函数最小,也就是拟合叶子结点最好的输出值
ctj=argmin<