上篇文章分享了AdaBoost的算法原理,这篇文章将讲解Boosting家族中的梯度提升算法(Gradient boosting)。建议看本文之前,先看一下AdaBoost算法的原理。码字不易,喜欢请点赞!!!
梯度提升(Gradient boosting),一般简称为GBDT,是由大牛Freidman提出来的。上一节,分享了AdaBoost算法的原理,可以知道AdaBoost算法是前向分布算法。同样,GBDT也是前向分布算法。但是AdaBoost每次是极小化损失函数,而GBDT每次通过拟合上一次的残差来减小损失。并且AdaBoost的基学习器不限定,而GBDT的基学习器限定为CART。
例如,比如一个人身高180,我们首先用170拟合,发现差了10cm,然后用8cm,去拟合,发现残差为2cm,然后我们用1.5cm去拟合,发现差了0.5cm,一直这样拟合下去,残差将会越来越小,知道达到我们的可接受范围,或者拟合次数达到上限。
其关键是采用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值,来拟合一个回归树。例如,训练数据 x i , y i x_i,y_i xi,yi在第m轮时,首先计算 x i x_i xi在 f m − 1 ( x ) f_{m-1}(x) fm−1(x)上的残差 r m i r_{mi} rmi来作为第m轮拟合的数据 ( x i , r m i ) (x_i,r_{mi}) (xi,rmi),其中
r m i = − [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi}=-[\frac{∂L(y,f(x_i))}{∂f(x_i)}]_{f(x)=f_{m-1}(x)} rmi=−[∂f(xi)∂L(y,f(xi))]f(x)=fm−1(x)
GBDT回归的算法流程如下:
输入:训练样本集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T= \{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)},其中, x i ∈ χ ∈ R n x_i\in \chi \in R^n xi∈χ∈Rn, y i ∈ Y ∈ R y_i\in Y \in R yi∈Y∈R;损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x));
输出:回归树 f ( x ) f(x) f(x)
(1)初始化
f 0 ( x ) = a r g min c ∑ i = 1 N L ( y i , c ) f_0(x)=arg\min _c \sum_{i=1}^{N}L(y_i,c) f0(x)=argcmini=1∑NL(yi,c)
其中c为基学习器叶子节点对应的输出值。
(2)对m=1,2,…,M
(a)对 i = 1 , 2 , . . . , N i=1,2,...,N i=1,2,...,N,计算残差:
r m i = − [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{mi}=-[\frac{∂L(y,f(x_i))}{∂f(x_i)}]_{f(x)=f_{m-1}(x)} rmi=−[∂f(xi)∂L(y,f(xi))]f(x)=fm−1(x)
(b)对 r m i r_{mi} rmi拟合一个回归树,得到第m棵树的叶节点区域 R m j , j = 1 , 2 , . . . , J R_{mj},j=1,2,...,J Rmj,j=1,2,...,J。
(c)对 j = 1 , 2 , . . . , J j=1,2,...,J j=1,2,...,J,计算
c m j = a r g min c ∑ x i ∈ R m j L ( y i , f m − 1 ( x i ) + c ) c_{mj}=arg\min_{c}\sum_{x_i \in R_{mj}}L(y_i,f_{m-1}(x_i)+c) cmj=argcminxi∈Rmj∑L(yi,fm−1(xi)+c)
(d)更新
f m ( x ) = f m − 1 ( x ) + ∑ j = 1 J c m j I ( x ∈ R m j ) f_m(x)=f_{m-1}(x)+\sum_{j=1}^{J}c_{mj}I(x \in R_{mj}) fm(x)=fm−1(x)+j=1∑JcmjI(x∈Rmj)
(3)得到回归树
f ( x ) = f M ( x ) = ∑ m = 1 M ∑ j = 1 J c m j I ( x ∈ R m j ) f(x)=f_M(x)=\sum_{m=1}^{M}\sum_{j=1}^{J}c_{mj}I(x \in R_{mj}) f(x)=fM(x)=m=1∑Mj=1∑JcmjI(x∈Rmj)
说明:
算法的第一步初始化,估计使损失函数极小化的常数值,它是一个只有根节点的树;
2(a)中,使用损失函数的负梯度作为残差的估计。
对于AdaBoost分类算法来说,我们将其基分类器限制为分类树,即成为了提升树分类算法,这时提升树算法就是AdaBoost算法的一个特例了。
GBDT是一个非常重要且效率和准确率高的算法,其主要优点有:
GBDT算法的缺点:
参考文献
李航 《统计学习方法》
https://blog.csdn.net/Asher117/article/details/103517786
https://www.cnblogs.com/pinard/p/6140514.html