ML算法推导细节07—梯度提升决策树GBDT

探究算法细节,深入了解算法原理

梯度提升决策树GBDT

  • 1. CART回归树
    • 1.1 回归树与分类树的区别
    • 1.2 CART回归树损失函数
    • 1.3 CART回归树模型
  • 2. 提升树算法
    • 2.1 回归问题的提升树算法
    • 2.2 回归问题的提升树算法流程
    • 2.3 回归问题的提升树算法例子
    • 2.4 提升树算法的通俗理解
  • 3. 梯度提升树算法
    • 3.1 GBDT回归算法流程
    • 3.2 GBDT分类算法
      • 3.2.1 二元GBDT分类算法
      • 3.2.2 多元GBDT分类算法
  • 4. GBDT常用损失函数
    • 4.1 分类算法
    • 4.2 回归算法
  • 5. GBDT的正则化
    • 5.1 GBDT的并行化
  • 6. sklearn.ensemble.GradientBoost
    • 6.1 GBDT中Boosting框架参数
    • 6.2 GBDT中弱学习器参数

1. CART回归树

  • 无论是处理回归问题还是二分类以及多分类,GBDT使用的决策树都是CART回归树
  • 为什么不用CART分类树呢?因为GBDT每次迭代要拟合的是梯度值(连续值所以要用回归树)

1.1 回归树与分类树的区别

  • 样本输出:分类树是离散值,回归树是连续值
  • 预测时:分类树采用叶子节点多数属类,回归树采用叶子节点的均值
  • 损失度量:分类树采用基尼系数,回归树采用平方误差

回归树算法最重要的是:寻找最佳的划分点,可划分点包含了所有特征的所有取值。

1.2 CART回归树损失函数

CART回归树的度量目标:对于特征A的取值s,划分成的数据集D1和D2,使D1和D2各自集合的均方差最小,同时D1和D2的均方差之和最小。

表达式为:

min ⁡ ⎵ A , s [ m i n ⎵ c 1 ∑ x i ∈ D 1 ( A , s ) ( y i − c 1 ) 2 + min ⁡ ⎵ c 2 ∑ x i ∈ D 2 ( A , s ) ( y i − c 2 ) 2 ] \underbrace{\min }_{A,s}\left[\underbrace{m i n}_{c_1}\sum_{x_{i} \in D_{1}(A, s)}\left(y_{i}-c_{1}\right)^{2}+\underbrace{\min }_{c_2} \sum_{x_{i} \in D_{2}\left(A_{, s}\right)}\left(y_{i}-c_{2}\right)^{2}\right ] A,s minc1 minxiD1(A,s)(yic1)2+c2 minxiD2(A,s)(yic2)2

  • 其中, c 1 c_1 c1 D 1 D_1 D1数据集的样本输出均值, c 2 c_2 c2 D 2 D_2 D2数据集的样本输出均值。
  • 遍历变量 A A A,对固定的切分变量 A A A 扫描切分点 s s s,选择使得上式达到最小值的 ( A , s ) (A,s) (A,s) 对。

1.3 CART回归树模型

将输入空间划分成 J J J 个区域,即 J J J 个叶子节点。

每个划分区域的输出值为:

c j = 1 N j ∑ x i ∈ R j y i c_j=\frac{1}{N_j}\sum_{x_i \in R_j}y_i cj=Nj1xiRjyi

生成的决策树模型为:

f ( x ) = ∑ j = 1 J c j I ( x ∈ R j ) f(x)=\sum_{j=1}^{J}c_jI(x \in R_j) f(x)=j=1JcjI(xRj)

2. 提升树算法

提升树以分类树或回归树为弱学习器,被认为是统计学习中性能最好的方法之一。

  • 提升树模型:决策树的加法模型,前向分步算法
  • 通过经验风险最小化确定下一棵决策树的参数

针对不同问题的提升树学习算法:主要区别是损失函数不同

  • 使用平方误差损失函数的回归问题
  • 使用指数损失函数的分类问题
  • 使用一般损失函数的一般决策问题

对于二分类问题,提升树算法将AdaBoost的弱学习器限定为二类分类树即可

2.1 回归问题的提升树算法

(1)前向分步算法,初始提升树 f 0 ( x ) = 0 f_0(x)=0 f0(x)=0

(2)第 t t t 步的模型是:

f t ( x ) = f t − 1 ( x ) + h t ( x , θ t ) f_t(x)=f_{t-1}(x)+h_t(x, \theta_t) ft(x)=ft1(x)+ht(x,θt)

其中, f t − 1 ( x ) f_{t-1}(x) ft1(x) 为当前模型, h t ( x , θ t ) h_t(x,\theta_t) ht(x,θt)表示第 t t t 棵决策树, θ t \theta_t θt 为决策树参数

(3)通过经验风险最小化确定下一棵决策树的参数 θ t \theta_t θt

θ ^ t = arg ⁡ min ⁡ θ t ∑ i = 1 m L ( y i , f t − 1 ( x i ) + h t ( x i , θ t ) ) \hat{\theta}_{t}=\arg \min_{\theta_{t}} \sum_{i=1}^{m} L\left(y_i, f_{t-1}(x_i)+h_t(x_i,\theta_t)\right) θ^t=argθtmini=1mL(yi,ft1(xi)+ht(xi,θt))

(4)决策树可以表示为:

h t ( x , θ t ) = ∑ j = 1 J c t j I ( x ∈ R t j ) h_t(x,\theta_t)=\sum_{j=1}^{J}c_{tj}I(x \in R_{tj}) ht(x,θt)=j=1JctjI(xRtj)

其中 J J J 是回归树的复杂度即叶子节点个数, R t j R_{tj} Rtj 表示第 t t t 棵树的叶子节点区域, c t j c_{tj} ctj表示每个叶子节点区域的输出值

(5)学习到的强学习器为:

f T ( x ) = ∑ t = 1 T h t ( x , θ t ) f_T(x)=\sum_{t=1}^{T}h_t(x,\theta_t) fT(x)=t=1Tht(x,θt)

(6)采用平方误差损失函数

L ( y , f ( x ) ) = [ y − f t − 1 ( x ) − h t ( x ) ] 2 = [ r − h t ( x ) ] 2 L(y,f(x))=[y-f_{t-1}(x)-h_t(x)]^2=[r-h_t(x)]^2 L(y,f(x))=[yft1(x)ht(x)]2=[rht(x)]2

r = y − f t − 1 ( x ) r=y-f_{t-1}(x) r=yft1(x)

其中 r r r 表示当前模型拟合数据的残差,对于回归问题的提升树算法来说,只需要拟合当前模型的残差。

2.2 回归问题的提升树算法流程

  • 初始化 f 0 ( x ) = 0 f_0(x)=0 f0(x)=0
  • 计算残差 r t i = y i − f t − 1 ( x i ) r_{ti}=y_i-f_{t-1}(x_i) rti=yift1(xi)
  • 拟合残差 r t i r_{ti} rti,学习一个回归树 h t ( x , θ t ) h_t(x,\theta_t) ht(x,θt)
  • 更新 f t ( x ) = f t − 1 ( x ) + h t ( x ) f_t(x)=f_{t-1}(x)+h_t(x) ft(x)=ft1(x)+ht(x)
  • 得到回归问题的提升树 f T ( x ) = ∑ t = 1 T h t ( x , θ t ) f_T(x)=\sum_{t=1}^{T}h_t(x,\theta_t) fT(x)=t=1Tht(x,θt)

2.3 回归问题的提升树算法例子

【例子出自 李航《统计学习方法》P149,例8.2】

训练数据表

x i x_i xi 1 2 3 4 5 6 7 8 9 10
y i y_i yi 5.56 5.70 5.91 6.40 6.80 7.05 8.90 8.70 9.00 9.05

(1)求 f 1 ( x ) f_1(x) f1(x),即回归树 h 1 ( x ) h_1(x) h1(x)

通过以下优化问题,求解训练数据的划分点 s s s

min ⁡ ⎵ A , s [ m i n ⎵ c 1 ∑ x i ∈ D 1 ( A , s ) ( y i − c 1 ) 2 + min ⁡ ⎵ c 2 ∑ x i ∈ D 2 ( A , s ) ( y i − c 2 ) 2 ] \underbrace{\min }_{A,s}\left[\underbrace{m i n}_{c_1}\sum_{x_{i} \in D_{1}(A, s)}\left(y_{i}-c_{1}\right)^{2}+\underbrace{\min }_{c_2} \sum_{x_{i} \in D_{2}\left(A_{, s}\right)}\left(y_{i}-c_{2}\right)^{2}\right ] A,s minc1 minxiD1(A,s)(yic1)2+c2 minxiD2(A,s)(yic2)2

s = 6.5 s=6.5 s=6.5 时,损失值最小,此时 R 1 = { 1 , 2 , 3 , 4 , 5 , 6 } , R 2 = { 7 , 8 , 9 , 10 } , c 1 = 6.24 , c 2 = 8.91 R_1=\{1,2,3,4,5,6\},R_2=\{7,8,9,10\},c_1=6.24,c_2=8.91 R1={1,2,3,4,5,6},R2={7,8,9,10},c1=6.24,c2=8.91

所以回归树 h 1 ( x ) h_1(x) h1(x)

h 1 ( x ) = { 6.24 , x < 6.5 8.91 , x ≥ 6.5 h_1(x)=\left\{\begin{matrix}6.24, \quad x<6.5 \\ 8.91, \quad x \geq 6.5 \end{matrix}\right. h1(x)={6.24,x<6.58.91,x6.5

f 1 ( x ) = h 1 ( x ) f_1(x)=h_1(x) f1(x)=h1(x)

(2)用 f 1 ( x ) f_1(x) f1(x) 拟合训练数据的残差

r 2 i = y i − f 1 ( x i ) r_{2i}=y_i-f_1(x_i) r2i=yif1(xi)

x i x_i xi 1 2 3 4 5 6 7 8 9 10
r 2 i r_{2i} r2i -0.68 -0.54 -0.33 0.16 0.56 0.81 -0.01 -0.21 0.09 0.14

f 1 ( x ) f_1(x) f1(x) 拟合训练数据的平方损失误差为:

L ( y , f 1 ( x ) ) = ∑ i = 1 10 ( y i − f 1 ( x i ) ) 2 = 1.93 L(y,f_1(x))=\sum_{i=1}^{10}(y_i-f_1(x_i))^2=1.93 L(y,f1(x))=i=110(yif1(xi))2=1.93

(3)求 h 2 ( x ) h_2(x) h2(x),与求 h 1 ( x ) h_1(x) h1(x) 方法一致,训练的数据是 r 2 i r_{2i} r2i 残差表

s = 3.5 s=3.5 s=3.5 时,损失值最小,此时 R 1 = { 1 , 2 , 3 } , R 2 = { 4 , 5 , 6 , 7 , 8 , 9 , 10 } , c 1 = − 0.52 , c 2 = 0.22 R_1=\{1,2,3\},R_2=\{4,5,6,7,8,9,10\},c_1=-0.52,c_2=0.22 R1={1,2,3},R2={4,5,6,7,8,9,10},c1=0.52,c2=0.22

所以回归树 h 2 ( x ) h_2(x) h2(x)

h 2 ( x ) = { − 0.52 , x < 3.5 0.22 , x ≥ 3.5 h_2(x)=\left\{\begin{matrix}-0.52, \quad x<3.5 \\ 0.22, \quad x \geq 3.5 \end{matrix}\right. h2(x)={0.52,x<3.50.22,x3.5

f 2 ( x ) = f 1 ( x ) + h 2 ( x ) = { 5.72 , x < 3.5 6.46 , 3.5 ≤ x < 3.5 9.13 , x ≥ 6.5 f_2(x)=f_1(x)+h_2(x)=\left\{ \begin{array}{rcl} 5.72, & & {x<3.5}\\ 6.46, & & {3.5\leq x <3.5}\\ 9.13, & & {x \geq 6.5} \end{array} \right. f2(x)=f1(x)+h2(x)=5.72,6.46,9.13,x<3.53.5x<3.5x6.5

f 2 ( x ) f_2(x) f2(x) 拟合训练数据的平方损失误差为:

L ( y , f 2 ( x ) ) = ∑ i = 1 10 ( y i − f 2 ( x i ) ) 2 = 0.79 L(y,f_2(x))=\sum_{i=1}^{10}(y_i-f_2(x_i))^2=0.79 L(y,f2(x))=i=110(yif2(xi))2=0.79

(4)同理,求 h 3 ( x ) , h 4 ( x ) , h 5 ( x ) , h 6 ( x ) h_3(x),h_4(x),h_5(x),h_6(x) h3(x),h4(x),h5(x),h6(x)

h 3 ( x ) = { 0.15 , x < 6.5 − 0.22 , x ≥ 6.5 L ( y , f 3 ( x ) ) = 0.47 h_3(x)=\left\{\begin{matrix} 0.15, \quad x<6.5 \\ -0.22, \quad x \geq 6.5 \end{matrix}\right. \quad L(y,f_3(x))=0.47 h3(x)={0.15,x<6.50.22,x6.5L(y,f3(x))=0.47

h 4 ( x ) = { − 0.16 , x < 4.5 0.11 , x ≥ 4.5 L ( y , f 4 ( x ) ) = 0.30 h_4(x)=\left\{\begin{matrix} -0.16, \quad x<4.5 \\ 0.11, \quad x \geq 4.5 \end{matrix}\right. \quad L(y,f_4(x))=0.30 h4(x)={0.16,x<4.50.11,x4.5L(y,f4(x))=0.30

h 5 ( x ) = { 0.07 , x < 6.5 − 0.11 , x ≥ 6.5 L ( y , f 5 ( x ) ) = 0.23 h_5(x)=\left\{\begin{matrix} 0.07, \quad x<6.5 \\ -0.11, \quad x \geq 6.5 \end{matrix}\right. \quad L(y,f_5(x))=0.23 h5(x)={0.07,x<6.50.11,x6.5L(y,f5(x))=0.23

h 6 ( x ) = { − 0.15 , x < 2.5 0.04 , x ≥ 2.5 h_6(x)=\left\{\begin{matrix} -0.15, \quad x<2.5 \\ 0.04, \quad x \geq 2.5 \end{matrix}\right. h6(x)={0.15,x<2.50.04,x2.5

f 6 ( x ) = f 5 ( x ) + h 6 ( x ) = h 1 ( x ) + h 2 ( x ) + . . . + h 6 ( x ) f_6(x)=f_5(x)+h_6(x)=h_1(x)+h_2(x)+...+h_6(x) f6(x)=f5(x)+h6(x)=h1(x)+h2(x)+...+h6(x)

f 6 ( x ) = { 5.63 , x < 2.5 5.82 , 2.5 ≤ x < 3.5 6.56 , 3.5 ≤ x < 4.5 6.83 , 4.5 ≤ x < 6.5 8.95 , x ≥ 6.5 f_6(x)=\left\{ \begin{array}{rcl} 5.63, & & {x<2.5}\\ 5.82, & & {2.5\leq x <3.5}\\ 6.56, & & {3.5\leq x <4.5}\\ 6.83, & & {4.5\leq x <6.5}\\ 8.95, & & {x \geq 6.5} \end{array} \right. f6(x)=5.63,5.82,6.56,6.83,8.95,x<2.52.5x<3.53.5x<4.54.5x<6.5x6.5

L ( y , f 6 ( x ) ) = 0.17 L(y,f_6(x))=0.17 L(y,f6(x))=0.17

假设此时已满足误差要求,则 f ( x ) = f 6 ( x ) f(x)=f_6(x) f(x)=f6(x)即为所求的提升树模型。

2.4 提升树算法的通俗理解

  • 假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁。这时我们用6岁去拟合剩下的损失,发现差距还有4岁。第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。
  • 如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。
  • 最后将每次拟合的岁数加起来便是模型输出的结果。

3. 梯度提升树算法

  • 提升树利用加法模型与前向分步算法实现学习的优化过程,当损失函数是平方损失和指数损失时,每一步的优化很简单。
  • 但对一般损失函数而言,每一步的优化并不容易,Freidman提出梯度提升算法,这是利用最速下降法近似方法
  • 其关键是利用损失函数的负梯度作为回归问题提升树算法中的残差的近似值,拟合一个回归树。

r t i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f t − 1 ( x ) r_{ti}=-\left[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}\right]_{f(x)=f_{t-1}(x)} rti=[f(xi)L(yi,f(xi))]f(x)=ft1(x)

GBDT限定弱学习器是CART回归树

通过损失函数的负梯度来拟合,我们找到了一种通用的拟合损失误差的办法,这样无轮是分类问题还是回归问题,都可以用GBDT解决。

3.1 GBDT回归算法流程

(1)初始化

f 0 ( x ) = arg ⁡ min ⁡ c ∑ i = 1 m L ( y i , c ) f_0(x)=\arg \min_{c}\sum_{i=1}^{m}L(y_i,c) f0(x)=argcmini=1mL(yi,c)

其中 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x)) 为损失函数

估计使损失函数极小化的常数值,它是只有一个根节点的树

(2)计算损失函数的负梯度,作为残差的估计

r t i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f t − 1 ( x ) r_{ti}=-\left[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}\right]_{f(x)=f_{t-1}(x)} rti=[f(xi)L(yi,f(xi))]f(x)=ft1(x)

  • 对于平方损失函数,它就是通常所说的残差。如下式所示:

L ( y i , f ( x i ) ) = 1 2 ( y i − f ( x i ) ) 2 , − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f t − 1 ( x ) = y i − f ( x i ) L(y_i,f(x_i))=\frac{1}{2}(y_i-f(x_i))^2, \quad -\left[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}\right]_{f(x)=f_{t-1}(x)}=y_i-f(x_i) L(yi,f(xi))=21(yif(xi))2,[f(xi)L(yi,f(xi))]f(x)=ft1(x)=yif(xi)

  • 对于一般损失函数,它是残差的近似值

(3)利用 ( x i , r t i ) (x_i,r_{ti}) (xi,rti) 拟合一个回归树,得到第 t t t 棵树的叶节点区域 R t j R_{tj} Rtj,叶节点个数为 J J J

针对每一个叶子节点里的样本,求出使损失函数最小,也就是拟合叶子节点最好的的输出值 c t j c_{tj} ctj

c t j = arg ⁡ min ⁡ c ∑ x i ∈ R t j L ( y i , f t − 1 ( x i ) + c ) c_{tj}=\arg \min_{c}\sum_{x_i \in R_{tj}}L(y_i,f_{t-1}(x_i)+c) ctj=argcminxiRtjL(yi,ft1(xi)+c)

  • 利用线性搜索,估计叶子节点区域的值,使损失函数极小化

(4)得到本轮决策树模型为:

h t ( x ) = ∑ j = 1 J c t j I ( x ∈ R t j ) h_t(x)=\sum_{j=1}^{J}c_{tj}I(x \in R_{tj}) ht(x)=j=1JctjI(xRtj)

(5)更新强学习器

f t ( x ) = f t − 1 ( x ) + ∑ j = 1 J c t j I ( x ∈ R t j ) f_t(x)=f_{t-1}(x)+\sum_{j=1}^{J}c_{tj}I(x \in R_{tj}) ft(x)=ft1(x)+j=1JctjI(xRtj)

(6)得到最终的强学习器

f ( x ) = f T ( x ) = f 0 ( x ) + ∑ t = 1 T ∑ j = 1 J c t j I ( x ∈ R t j ) f(x)=f_T(x)=f_0(x)+\sum_{t=1}^{T}\sum_{j=1}^{J}c_{tj}I(x \in R_{tj}) f(x)=fT(x)=f0(x)+t=1Tj=1JctjI(xRtj)

3.2 GBDT分类算法

由于样本输出不是连续值,而是离散的类别,无法直接从输出类别去拟合误差。

为了解决这个问题,主要有两个方法:

(1)用指数损失函数,此时GBDT退化为Adaboost算法。

(2)用类似于逻辑回归的对数似然损失函数的方法。即用类别的预测概率值和真实概率值的差来拟合损失。

3.2.1 二元GBDT分类算法

对于二元GBDT,如果用类似于逻辑回归的对数似然损失函数,则损失函数为:

L ( y , f ( x ) ) = l o g ( 1 + e x p ( − y f ( x ) ) ) L(y,f(x))=log(1+exp(-yf(x))) L(y,f(x))=log(1+exp(yf(x)))

其中 y ∈ { − 1 , 1 } y \in \{-1,1\} y{1,1},此时的负梯度误差为:

r t i = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f t − 1 ( x ) = y i 1 + e x p ( y i f ( x i ) ) r_{ti}=-\left[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}\right]_{f(x)=f_{t-1}(x)}=\frac{y_i}{1+exp(y_if(x_i))} rti=[f(xi)L(yi,f(xi))]f(x)=ft1(x)=1+exp(yif(xi))yi

对于生成的决策树,各个叶子节点的最佳负梯度拟合值为:

c t j = arg ⁡ min ⁡ c ∑ x i ∈ R t j l o g [ 1 + e x p ( − y i ( f t − 1 ( x i ) + c ) ) ] c_{tj}=\arg \min_{c}\sum_{x_i \in R_{tj}}log[1+exp(-y_i(f_{t-1}(x_i)+c))] ctj=argcminxiRtjlog[1+exp(yi(ft1(xi)+c))]

由于上式比较难以优化,一般用近似值代替:

c t j = ∑ x i ∈ R t j r t j ∑ x i ∈ R t j ∣ r t j ∣ ( 1 − ∣ r t j ∣ ) c_{tj}=\frac{\sum_{x_i \in R_{tj}}r_{tj}}{\sum_{x_i \in R_{tj}}|r_{tj}|(1-|r_{tj}|)} ctj=xiRtjrtj(1rtj)xiRtjrtj

除了负梯度计算和叶子节点的最佳负梯度拟合的线性搜索,二元GBDT分类和GBDT回归算法过程相同。

3.2.2 多元GBDT分类算法

多元GBDT要比二元GBDT复杂一些,对应的是多元逻辑回归和二元逻辑回归的复杂度差别。

(1)假设类别数为 K K K,如果样本输出类别为 k k k,则 y k = 1 y_k=1 yk=1。第 k k k 类的概率 p k ( x ) p_k(x) pk(x)的表达式为:

p k ( x ) = e x p ( f k ( x ) ) ∑ l = 1 K e x p ( f l ( x ) ) p_k(x)=\frac{exp(f_k(x))}{\sum_{l=1}^{K}exp(f_l(x))} pk(x)=l=1Kexp(fl(x))exp(fk(x))

(2)对数似然损失函数为:

L ( y , f ( x ) ) = − ∑ k = 1 K y k l o g [ p k ( x ) ] L(y,f(x))=-\sum_{k=1}^{K}y_klog[p_k(x)] L(y,f(x))=k=1Kyklog[pk(x)]

(3)第 t t t 轮的第 i i i 个样本对应类别 l l l 的负梯度误差为:

r t i l = − [ ∂ L ( y i , f ( x i ) ) ∂ f ( x i ) ] f k ( x ) = f l , t − 1 ( x ) = y i l − p l , t − 1 ( x i ) r_{til}=-\left[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}\right]_{f_k(x)=f_{l,t-1}(x)}=y_{il}-p_{l,t-1}(x_i) rtil=[f(xi)L(yi,f(xi))]fk(x)=fl,t1(x)=yilpl,t1(xi)

这里的误差就是样本 i i i 对应类别 l l l 的真实概率和 t − 1 t−1 t1 轮预测概率的差值。

(4)对于生成的决策树,各个叶子节点的最佳负梯度拟合值为:

c t j l = arg ⁡ min ⁡ c j l ∑ i = 1 m ∑ l = 1 K L ( y i l , f l , t − 1 ( x i ) + ∑ j = 1 J c j l I ( x i ∈ R t j l ) ) c_{tjl}=\arg \min_{c_{jl}}\sum_{i=1}^{m}\sum_{l=1}^{K}L(y_{il},f_{l,t-1}(x_i)+\sum_{j=1}^{J}c_{jl}I(x_i \in R_{tjl})) ctjl=argcjlmini=1ml=1KL(yil,fl,t1(xi)+j=1JcjlI(xiRtjl))

由于上式比较难以优化,采用近似值代替:

c t j l = K − 1 K ∑ x i ∈ R t j l r t j l ∑ x i ∈ R t j l ∣ r t j l ∣ ( 1 − ∣ r t j l ∣ ) c_{tjl}=\frac{K-1}{K}\frac{\sum_{x_i \in R_{tjl}}r_{tjl}}{\sum_{x_i \in R_{tjl}}|r_{tjl}|(1-|r_{tjl}|)} ctjl=KK1xiRtjlrtjl(1rtjl)xiRtjlrtjl

4. GBDT常用损失函数

4.1 分类算法

  • 指数损失函数, L ( y , f ( x ) ) = e x p ( − y f ( x ) ) L(y,f(x))=exp(-yf(x)) L(y,f(x))=exp(yf(x))
  • 对数似然损失函数, L ( y , f ( x ) ) = − ∑ k = 1 K y k l o g [ p k ( x ) ] L(y,f(x))=-\sum_{k=1}^{K}y_klog[p_k(x)] L(y,f(x))=k=1Kyklog[pk(x)]

4.2 回归算法

  • 均方差 L ( y , f ( x ) ) = ( y − f ( x ) ) 2 L(y,f(x))=(y-f(x))^2 L(y,f(x))=(yf(x))2
  • 绝对损失 L ( y , f ( x ) ) = ∣ y − f ( x ) ∣ L(y,f(x))=|y-f(x)| L(y,f(x))=yf(x),负梯度为 s i g n ( y i − f ( x i ) ) sign(y_i-f(x_i)) sign(yif(xi))
  • Huber损失,是均方差和绝对损失的折衷产物。对于远离中心的异常点采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。

L ( y , f ( x ) ) = { 1 2 ( y − f ( x ) ) 2 , ∣ y − f ( x ) ∣ ≤ δ δ s i g n ( ∣ y − f ( x ) ∣ − δ / 2 ) , ∣ y − f ( x ) ∣ > δ L(y,f(x))=\left\{ \begin{array}{rcl} \frac{1}{2}(y-f(x))^2, & & {|y-f(x)| \leq \delta}\\ \delta sign(|y-f(x)|-\delta/2), & & {|y-f(x)|>\delta} \end{array} \right. L(y,f(x))={21(yf(x))2,δsign(yf(x)δ/2),yf(x)δyf(x)>δ

  • 分位数损失,对应的是分位数回归的损失函数

L ( y , f ( x ) ) = ∑ y ≥ f ( x ) θ ∣ y − f ( x ) ∣ + ∑ y < f ( x ) ( 1 − θ ) ∣ y − f ( x ) ∣ L(y,f(x))=\sum_{y\geq f(x)}\theta|y-f(x)|+\sum_{y<f(x)}(1-\theta)|y-f(x)| L(y,f(x))=yf(x)θyf(x)+y<f(x)(1θ)yf(x)

Huber损失,分位数损失,主要用于健壮回归,即减少异常点对损失函数的影响。

5. GBDT的正则化

3种正则化方法

(1)和 AdaBoost类似的正则项,步长 v v v (learning rate)

f t ( x ) = f t − 1 ( x ) + v h t ( x ) f_t(x)=f_{t-1}(x)+vh_t(x) ft(x)=ft1(x)+vht(x)

  • 较小的 v v v 需要更多的弱学习器迭代次数
  • 步长通常和最大迭代次数一起来决定算法的拟合效果

(2)对弱学习器,即CART回归树进行正则化剪枝

(3)通过子采样比例 (sub_sample),取值 ( 0 , 1 ] (0,1] (0,1]

  • 这里的子采样与随机森林不同,随机森林是放回抽样,GBDT是不放回抽样。
  • 如果取值为1,则全部样本都使用,等于没有使用子采样。
  • 如果取值小于1,则只有部分样本会去做GBDT的决策树拟合。
  • 选择小于1的比例,可以减少方差,即防止过拟合,但会增加样本拟合的偏差。因此取值不能太低,推荐 [ 0.5 , 0.8 ] [0.5,0.8] [0.5,0.8] 之间

使用子采样的GBDT有时也被称为随机梯度提升树,SGBT。

5.1 GBDT的并行化

由于使用了子采样,程序可以通过采样,分发到不同的任务去做boosting的迭代过程。最后形成新树,从而减少弱学习器难以并行学习的弱点。实现部分并行。

6. sklearn.ensemble.GradientBoost

class sklearn.ensemble.GradientBoostingClassifier(loss=’deviance’,
learning_rate=0.1, n_estimators=100, subsample=1.0,
criterion=’friedman_mse’, min_samples_split=2, min_samples_leaf=1,
min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_decrease=0.0,
min_impurity_split=None, init=None, random_state=None, max_features=None,
verbose=0, max_leaf_nodes=None, warm_start=False, presort=’auto’,
validation_fraction=0.1, n_iter_no_change=None, tol=0.0001)

class sklearn.ensemble.GradientBoostingRegressor(loss=’ls’,
learning_rate=0.1, n_estimators=100, subsample=1.0,
criterion=’friedman_mse’, min_samples_split=2, min_samples_leaf=1,
min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_decrease=0.0,
min_impurity_split=None, init=None, random_state=None, max_features=None,
alpha=0.9, verbose=0, max_leaf_nodes=None, warm_start=False,
presort=’auto’, validation_fraction=0.1, n_iter_no_change=None, tol=0.0001)

6.1 GBDT中Boosting框架参数

  • loss:损失函数。(1)分类问题可选deviance(对数似然损失),exponential(指数损失函数);(2)回归问题可选ls(均方差),lad(绝对损失),huber(Huber损失),quantile(分位数损失);(3)噪声点不多一般选默认的ls,噪声点多一般选huber,需要对训练集进行分段预测选quantile。
  • learning_rate:步长,正则化系数
  • n_estimators:弱学习器个数,太大过拟合,太小欠拟合。与learning_rate一起考虑。
  • subsample:子采样比例,小于1可以防止过拟合,推荐 [ 0.5 , 0.8 ] [0.5,0.8] [0.5,0.8]
  • criterion:衡量决策树分裂的好坏,类似于基尼系数,信息增益。这里可选 friedman_mse,mse,mae。分别为最小平方误差的近似,最小平方误差,最小平均绝对值。
  • init:初始化时的弱学习器, f 0 ( x ) f_0(x) f0(x),如果不输入,则用训练集做初始化预测。
  • alpha:回归问题采才有,使用Huber损失和分位数损失时,需要指定分位数的值。默认0.9,如果噪音点较多,可以适当降低这个分位数的值。
  • n_iter_no_change=None:当validation score不提高时早停
  • validation_fraction:为了早停预留的验证集比例
  • tol=0.0001:损失减少小于该数值,早停

6.2 GBDT中弱学习器参数

  • min_samples_split=2
  • min_samples_leaf=1,
  • min_weight_fraction_leaf=0.0
  • max_depth=3,
  • min_impurity_decrease=0.0
  • min_impurity_split=None
  • max_features=None
  • max_leaf_nodes=None

参考博客
1. 梯度提升树(GBDT)原理小结
2. GBDT算法原理以及实例理解
3. 李航, 统计学习方法
4. sklearn GBDT文档
5. sklearn GBDT源码

你可能感兴趣的:(机器学习总结)