【机器学习】十五、Gradient boosting算法原理详解

上篇文章分享了AdaBoost的算法原理,这篇文章将讲解Boosting家族中的梯度提升算法(Gradient boosting)。建议看本文之前,先看一下AdaBoost算法的原理。码字不易,喜欢请点赞!!!
【机器学习】十五、Gradient boosting算法原理详解_第1张图片

目录

  • 1.梯度提升算法简介
  • 2.GBDT回归
  • 3.GBDT分类
  • 4.GBDT优缺点

1.梯度提升算法简介

梯度提升(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) fm1(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)=fm1(x)

2.GBDT回归

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 yiYR;损失函数 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=1NL(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)=fm1(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=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(x)=f_{m-1}(x)+\sum_{j=1}^{J}c_{mj}I(x \in R_{mj}) fm(x)=fm1(x)+j=1JcmjI(xRmj)
(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=1Mj=1JcmjI(xRmj)

说明:
算法的第一步初始化,估计使损失函数极小化的常数值,它是一个只有根节点的树;
2(a)中,使用损失函数的负梯度作为残差的估计。

3.GBDT分类

对于AdaBoost分类算法来说,我们将其基分类器限制为分类树,即成为了提升树分类算法,这时提升树算法就是AdaBoost算法的一个特例了。

4.GBDT优缺点

GBDT是一个非常重要且效率和准确率高的算法,其主要优点有:

  1. 可以灵活处理各种类型的数据,包括连续值和离散值。
  2. 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。
  3. 使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。

GBDT算法的缺点:

  • 由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。

参考文献
李航 《统计学习方法》
https://blog.csdn.net/Asher117/article/details/103517786
https://www.cnblogs.com/pinard/p/6140514.html

你可能感兴趣的:(机器学习,GBDT,算法原理,机器学习,boosting,梯度提升算法)