(八)GBDT
本系列重点在浅显易懂,快速上手。不进行过多的理论讲解:也就是不去深究what,而是关注how。全文围绕以下三个问题展开:
1)长什么样?
2)解决什么问题?
3)怎么实现?
3.1)从数学讲,原理
3.2)从代码上讲,如何掉包实现
1 长什么样
GBDT=Gradient Boosting+CART树
gradient boosting decision tree 梯度提升决策树,有多个若学习器组成,弱学习器的通常是层数较少的CART回归树,单个弱学习器,因层数叫浅,所以偏差较大,方差小,最终的GBDT的输出是每个若学习器的输出的加和。如下图所示,为什么是加和?看下文的解释。
备注:所有GBDT算法中,底层都是回归树。
GBDT也是Boosting算法的一种,但是和AdaBoost算法不同;区别如下:
AdaBoost算法是利用前一轮的弱学习器的误差来更新样本权重值,然后一轮一轮的迭代;GBDT也是迭代,但是GBDT要求弱学习器必须是回归CART模型,而且GBDT在模型训练的时候,是要求模型预测的样本损失尽可能的小。
要迭代所少次,(就是需要多少棵树),需要调参,分类看准确率召回率系列的指标。回归看MSE系列的指标。
给定一个步长step,在构建下一棵树的时候使用step*残差值作为输入值,这种方式可以减少过拟合的发生。

2 解决什么问题
可以解决分类或回归问题。
3 怎么实现
3.1 数学原理(回归算法)

(1)初始化第一个若学习器,得到常熟函数 f 0 ( x ) f_0(x) f0(x)
f 0 ( x ) = a r g m i n c ∑ i = 1 N L ( y i , c ) f_0(x) = arg min_c\sum^{N}_{i=1}L(y_i,c) f0(x)=argminci=1∑NL(yi,c)
损失函数 L L L是误差平方和损失函数。凸函数,要求极值,可以求导,求解导函数为0的点。过程如下。
∑ i = 1 N ∂ L ( y i , c ) ) ∂ c = ∑ i = 1 N ∂ ( 1 2 ( y i − c ) 2 ) ∂ c = ∑ i = 1 N c − y i = 0 \begin{align}\sum_{i=1}^N\frac{\partial L(y_i,c))}{\partial c} &=\sum_{i=1}^N\frac{\partial(\frac12(y_i-c)^2)}{\partial c}\\ & =\sum_{i=1}^Nc-y_i=0\\ \end{align} i=1∑N∂c∂L(yi,c))=i=1∑N∂c∂(21(yi−c)2)=i=1∑Nc−yi=0
不难得到:
c = ( ∑ i = 1 N y i ) / N c=(\sum^{N}_{i=1}y_i)/N c=(i=1∑Nyi)/N
(2)构建新的样本集,GBDT算法是通过改变y的值,来构建新的样本集,具体的是将标签y,替换为残差 γ γ γ。
r i , m = − [ ∂ L ( y i , f ( x i ) ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) r_{i,m}=-\left[\frac{\partial L(y_i,f(x_i)))}{\partial f(x_i)}\right]_{f(x)=f_{m-1}(x)} ri,m=−[∂f(xi)∂L(yi,f(xi)))]f(x)=fm−1(x)
当回归问题是,采用误差平方和损失函数(MSE),此时
r i , m = − ∂ ( 1 / 2 ( y i − f m − 1 ( x ) ) 2 ) ∂ f m − 1 ( x ) = y i − f m − 1 ( x ) r_{i,m}=-\frac{\partial(1/2(y_i-f_{m-1}(x))^2)}{\partial f_{m-1}(x)}\\ =y_i-f_{m-1}(x) ri,m=−∂fm−1(x)∂(1/2(yi−fm−1(x))2)=yi−fm−1(x)
(3)用上一步,得到的新数据集构建第一个弱学习器,CART回归树,(CART回归树的实现原理,见本系列第5篇博客,(五)决策树)。最终得到的叶子节点如下:
Υ m , j = a r g m i n Υ ∑ x i ∈ R m , j L ( y i , f m − 1 ( x i ) + Υ ) = a r g m i n Υ ∑ x i ∈ R m , j L ( Υ i , m − 1 , Υ ) 凸函数,求极值,通过求导,让导函数为 0 的方式实现: ∑ i = 1 N ∂ L ( Υ i , m − 1 , Υ ) ∂ Υ = ∑ i = 1 N ∂ ( 1 2 ( Υ i , m − 1 − Υ ) 2 ) ∂ Υ = ∑ i = 1 N Υ − Υ i , m − 1 = 0 Υ = ( ∑ i = 1 N Υ i , m − 1 ) / N 所以,第一个若学习的输出为 Υ 1 , j I ( x i ∈ R 1 , j ) \begin{align} Υ_{m,j}&=arg \ min_Υ\sum_{x_i∈R_{m,j}}L(y_i,f_{m-1}(x_i)+Υ)\\ &=arg \ min_Υ\sum_{x_i∈R_{m,j}}L(Υ_{i,m-1},Υ)\\\\ 凸函数,求极值,通过求导,让导函数为0的方式实现:\\ \sum_{i=1}^N\frac{\partial L(Υ_{i,m-1},Υ)}{\partial Υ} &=\sum_{i=1}^N\frac{\partial(\frac12(Υ_{i,m-1}-Υ)^2)}{\partial Υ}\\ & =\sum_{i=1}^N Υ-Υ_{i,m-1}=0\\ Υ&=(\sum^{N}_{i=1}Υ_{i,m-1})/N\\ 所以,第一个若学习的输出为Υ_{1,j}I(x_i∈R_{1,j}) \end{align}\\ Υm,j凸函数,求极值,通过求导,让导函数为0的方式实现:i=1∑N∂Υ∂L(Υi,m−1,Υ)Υ所以,第一个若学习的输出为Υ1,jI(xi∈R1,j)=arg minΥxi∈Rm,j∑L(yi,fm−1(xi)+Υ)=arg minΥxi∈Rm,j∑L(Υi,m−1,Υ)=i=1∑N∂Υ∂(21(Υi,m−1−Υ)2)=i=1∑NΥ−Υi,m−1=0=(i=1∑NΥi,m−1)/N
(4) 更新强学习器,
f 1 ( x ) = f 0 ( x ) + l r ∗ ∑ Υ 1 , j I ( x i ∈ R 1 , j ) f_1(x)=f_0(x)+lr*\sum Υ_{1,j}I(x_i∈R_{1,j}) f1(x)=f0(x)+lr∗∑Υ1,jI(xi∈R1,j)
(5)再次构建新的数据集,重复(2)(3)(4)的过程,得到最总的强学习器。
f ( x ) = f M ( x ) = f 0 ( x ) + l r ∗ ∑ m = 1 M ∑ j = 1 J Υ m , j I ( x i ∈ R m , j ) ,其中 l r 是学习率 f(x)=f_M(x)=f_0(x)+lr*\sum_{m=1}^M\sum _{j=1}^JΥ_{m,j}I(x_i∈R_{m,j}),其中lr是学习率 f(x)=fM(x)=f0(x)+lr∗m=1∑Mj=1∑JΥm,jI(xi∈Rm,j),其中lr是学习率
3.2实际案例(回归算法)
下表一组数据,特征为年龄、体重,身高为标签值,单个CART的最大深度为3,总共最多迭代5次。
| 编号 | 年龄 | 体重 | 标签(身高) |
|---|---|---|---|
| 0 | 5 | 20 | 1.1 |
| 1 | 7 | 30 | 1.3 |
| 2 | 21 | 70 | 1.7 |
| 3 | 30 | 60 | 1.8 |
| 待预测 | 25 | 65 | ? |
-
初始化弱学习器
f 0 ( x ) = c = ( 1.1 + 1.3 + 1.7 + 1.8 ) / 4 = 1.475 f_0(x)=c=(1.1+1.3+1.7+1.8)/4=1.475 f0(x)=c=(1.1+1.3+1.7+1.8)/4=1.475
-
计算负梯度(就是残差 r = y − f 0 ( x ) r=y-f_{0}(x) r=y−f0(x)),得新的训练集
| 编号 | 真实值 | f 0 ( x ) f_0(x) f0(x) | r残差(新的标签值) |
|---|---|---|---|
| 0 | 1.1 | 1.475 | -0.375 |
| 1 | 1.3 | 1.475 | -0.175 |
| 2 | 1.7 | 1.475 | 0.225 |
| 3 | 1.8 | 1.475 | 0.325 |
新的训练集
| 编号 | 年龄 | 体重 | 标签 |
|---|---|---|---|
| 0 | 5 | 20 | -0.375 |
| 1 | 7 | 30 | -0.175 |
| 2 | 21 | 70 | 0.225 |
| 3 | 30 | 60 | 0.325 |
| 待预测 | 25 | 65 | ? |
3.训练第一颗cart树:遍历每个特征的每个可能取值,寻找最佳划分点。从年龄特征的5开始,到体重特征的70结束,分别计算分裂后两组数据的平方损失(Square Error),找到使平方损失和 S E s u m = S E l + S E r SE_{sum}=SE_{l}+SE_{r} SEsum=SEl+SEr最小的那个划分节点,(SEl和SEr分布表示左右两组残差的方差),结果如下:
以年龄7为例:
- <年龄7划分到左边:
| 编号 | 年龄 | 标签 |
|---|---|---|
| 0 | 5 | -0.375 |
- >=年龄7的划分到右边
| 编号 | 年龄 | 标签 |
|---|---|---|
| 1 | 7 | -0.175 |
| 2 | 21 | 0.225 |
| 3 | 30 | 0.325 |
根据公式计算左侧的方差:
R
(
j
,
s
)
=
min
j
,
s
[
min
c
i
∑
x
∈
R
i
(
j
,
s
)
(
y
i
−
c
1
)
2
+
min
c
2
∑
x
∈
R
2
(
j
,
s
)
(
y
i
−
c
2
)
2
]
R(j,s) = \min_{j,s}\Biggl[\min_{c_{i}}\sum_{x\in R_{i}(j,s)}\left(y_{i}-c_{1}\right)^{2}+\min_{c_{2}}\sum_{x\in R_{2}(j,s)}\left(y_{i}-c_{2}\right)^{2}\Biggr]
R(j,s)=j,smin[ciminx∈Ri(j,s)∑(yi−c1)2+c2minx∈R2(j,s)∑(yi−c2)2]
中括号内的两部分,代表左右两侧,先求均值:
-
左侧均值为 − 0.375 , 计算方差 ( − 0.375 + 0.375 ) 2 = 0 左侧均值为-0.375,\\计算方差(-0.375+0.375)^2=0 左侧均值为−0.375,计算方差(−0.375+0.375)2=0
-
右侧均值为 ( − 0.175 + 0.225 + 0.325 ) / 3 = 0.125 , 计算方差 ( − 0.175 − 0.125 ) 2 + ( 0.225 − 0.125 ) 2 + ( 0.325 − 0.125 ) 2 = 0.09 + 0.01 + 0.04 = 0.14 右侧均值为(-0.175+0.225+0.325)/3 = 0.125,\\ 计算方差(-0.175-0.125)^2+(0.225-0.125)^2+(0.325-0.125)^2=0.09+0.01+0.04=0.14 右侧均值为(−0.175+0.225+0.325)/3=0.125,计算方差(−0.175−0.125)2+(0.225−0.125)2+(0.325−0.125)2=0.09+0.01+0.04=0.14
| 划分点 | 左侧(<) | 右侧(>=) | S E l SE_l SEl | S E r SE_r SEr | S E s u m SE_{sum} SEsum |
|---|---|---|---|---|---|
| 年龄5 | / | 0、1、2、3 | 0 | 0.327 | 0.327 |
| 年龄7 | 0 | 1、2、3 | 0 | 0.140 | 0.140 |
| 年龄21 | 0、1 | 2、3 | 0.020 | 0.005 | 0.025 |
| 年龄30 | 0、1、2 | 3 | 0.187 | 0 | 0.187 |
| 体重20 | / | 0、1、2、3 | 0 | 0.327 | 0.327 |
| 体重30 | 0 | 1、2、3 | 0 | 0.140 | 0.140 |
| 体重60 | 0、1 | 2、3 | 0.020 | 0.005 | 0.025 |
| 体重70 | 0、1、3 | 2 | 0.260 | 0 | 0.260 |
年龄21和体重60,所以随机选一个作为划分点,这里选年龄21。

样本编号0、1被划分到左侧,2、3被划分到右侧。
4.此时CART树的深度为2<3,继续划分,左右两侧两个分支都要再划分一次。
| 划分点 | 左侧(<) | 右侧(>=) | S E l SE_l SEl | S E r SE_r SEr | S E s u m SE_{sum} SEsum |
|---|---|---|---|---|---|
| 年龄5 | / | 0、1 | 0 | 0.020 | 0.020 |
| 年龄7 | 0 | 1 | 0 | 0 | 0 |
| 体重20 | / | 0、1 | 0 | 0.020 | 0.020 |
| 体重30 | 0 | 1 | 0 | 0 | 0 |
| 划分点 | 左侧(<) | 右侧(>=) | S E l SE_l SEl | S E r SE_r SEr | S E s u m SE_{sum} SEsum |
|---|---|---|---|---|---|
| 年龄21 | / | 2、3 | 0 | 0.005 | 0.005 |
| 年龄30 | 2 | 3 | 0 | 0 | 0 |
| 体重60 | / | 2、3 | 0 | 0.005 | 0.005 |
| 体重70 | 3 | 2 | 0 | 0 | 0 |
计算4个叶子节点的值 Υ j m Υ_{jm} Υjm(对平方损失求导,令导数等于零就得到 Υ j m Υ_{jm} Υjm)最后生成的决策树如下:
Υ 11 = − 0.375 , Υ 21 = − 0.175 , Υ 31 = 0.225 , Υ 41 = 0.325 Υ_{11}=-0.375, \ \ Υ_{21}=-0.175,\ \ Υ_{31}=0.225,\ \ Υ_{41}=0.325 Υ11=−0.375, Υ21=−0.175, Υ31=0.225, Υ41=0.325

5.更新强学习器,为了防止过拟合,加入学习率 l r = 0.1 l_r=0.1 lr=0.1
f 1 ( x ) = f 0 ( x ) + l r ∗ ∑ Υ 1 , j I ( x i ∈ R 1 , j ) f_1(x)=f_0(x)+lr*\sum Υ_{1,j}I(x_i∈R_{1,j}) f1(x)=f0(x)+lr∗∑Υ1,jI(xi∈R1,j)
6.更新数据集
| 编号 | 年龄 | 体重 | 真实标签 | f 1 ( x ) f_1(x) f1(x) | 残差(新标签) |
|---|---|---|---|---|---|
| 0 | 5 | 20 | 1.1 | 1.61875 | -0.3375 |
| 1 | 7 | 30 | 1.3 | 1.62075 | -0.1575 |
| 2 | 21 | 70 | 1.7 | 1.62475 | 0.2025 |
| 3 | 30 | 60 | 1.8 | 1.62575 | 0.2925 |
形成如下决策树:

7.重复第5第6步,形成5个学习器:



8.最终的预测结果为
F
(
X
)
=
f
5
(
x
)
=
f
0
(
x
)
+
l
r
∗
∑
m
=
1
5
∑
j
=
1
4
Υ
j
m
I
(
x
∈
R
j
m
)
=
1.475
+
0.1
∗
(
0.225
+
0.202
+
0.182
+
0.164
+
0.148
)
=
1.567
F(X)=f_5(x)=f_0(x)+l_r*\displaystyle \sum^{5}_{m=1}\displaystyle \sum^{4}_{j=1}Υ_{jm}I(x∈R_{jm})\\ =1.475+0.1*(0.225+0.202+0.182+0.164+0.148)=1.567
F(X)=f5(x)=f0(x)+lr∗m=1∑5j=1∑4ΥjmI(x∈Rjm)=1.475+0.1∗(0.225+0.202+0.182+0.164+0.148)=1.567
3.3数学原理(分类算法)

回归问题中,构建新数据集用的是负梯度值,就是用真实值减去预测值,但是在分类问题中,真实值和预测值都是类别,类别之间的相减是没有意义的。一种解决方案是,采用逻辑回归算法中的对数损失函数,用结果的预测概率值和真实概率值的差值作为残差。
逻辑回归的对数损失函数为:
ℓ ( θ ) = log L ( θ ) = ∑ i = 1 m ( y ( i ) log h θ ( x ( i ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ) \ell(\theta)=\log L(\theta)=\sum_{i=1}^{m}\left(y^{(i)}\log h_{\theta}\left(x^{(i)}\right)+\left(1-y^{(i)}\right)\log\left(1-h_{\theta}\left(x^{(i)}\right)\right)\right) ℓ(θ)=logL(θ)=i=1∑m(y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i))))
(1)初始化第一个弱学习器
对上式求导,领导数为0
∂
L
(
y
i
,
F
(
x
i
)
)
∂
F
(
x
i
)
=
y
i
−
1
1
+
e
−
F
(
x
i
)
∑
(
y
i
−
1
1
+
e
−
F
0
(
x
)
)
=
0
F
0
(
x
)
=
l
o
g
p
(
y
=
1
)
1
−
p
(
y
=
1
)
\begin{align*} &\frac{\partial L(y_i,F(x_i))}{\partial F(x_i)}=y_i-\frac1{1+e^{-F(x_i)}}\\\\ &\sum(y_i-\frac1{1+e^{-F_0(x)}})=0\\\\ &F_0(x)= log\frac{p(y=1)}{1-p(y=1)}\\ \end{align*}
∂F(xi)∂L(yi,F(xi))=yi−1+e−F(xi)1∑(yi−1+e−F0(x)1)=0F0(x)=log1−p(y=1)p(y=1)
(2)计算负梯度,伪残差
r
m
,
i
=
−
∣
∂
L
(
y
i
,
F
(
x
i
)
)
∂
F
(
x
i
)
∣
F
(
x
)
=
F
m
−
1
(
x
)
=
y
i
−
1
1
+
e
−
F
(
x
i
)
\begin{align*} r_{m,i}&=-\bigg|\frac{\partial L(y_{i},F(x_{i}))}{\partial F(x_{i})}\bigg|_{F(x)=F_{m-1}(x)}\\ &=y_{i}-\frac{1}{1+e^{-F(x_{i})}}\\ \end{align*}
rm,i=−
∂F(xi)∂L(yi,F(xi))
F(x)=Fm−1(x)=yi−1+e−F(xi)1
(3)利用上面求解得到的残差值,形成新的训练集
(
x
i
,
r
m
,
i
)
(x_i,r_{m,i})
(xi,rm,i),训练CART回归树。
(4)训练的cart回归树对应的叶子节点区域为 R m , j R_{m,j} Rm,j,各个叶子节点的拟合值为:
c m , j = arg min ∑ x i ∈ R m , j L ( y i , F m − 1 ( x i ) + c ) 上式没有闭式解,一般使用近似值代替 c m , j = ∑ x i ∈ R m , j r m , j ∑ x i ∈ R m , j ( y i − r m , j ) ( 1 − y i + r m , j ) \begin{align*} c_{m,j}&=\arg\min\sum_{x_{i}\in R_{m,j}}L(y_{i},F_{m-1}(x_{i})+c)\\ &上式没有闭式解,一般使用近似值代替\\ c_{m,j}&=\frac{\sum_{x_i∈R_{m,j}}r_{m,j}}{\sum_{x_i∈R_{m,j}}(y_i-r_{m,j})(1-y_i+r_{m,j})}\\ \end{align*} cm,jcm,j=argminxi∈Rm,j∑L(yi,Fm−1(xi)+c)上式没有闭式解,一般使用近似值代替=∑xi∈Rm,j(yi−rm,j)(1−yi+rm,j)∑xi∈Rm,jrm,j
(5)更新强学习器
F
m
(
x
)
=
F
m
−
1
(
x
)
+
l
r
∗
∑
c
m
,
j
I
(
x
i
∈
R
m
,
j
)
F_m(x)=F_{m-1}(x)+lr*\sum c_{m,j}I(x_i∈R_{m,j})
Fm(x)=Fm−1(x)+lr∗∑cm,jI(xi∈Rm,j)
(6)重复3~5共M次,得到最终的强学习器
F
M
(
x
)
F_M(x)
FM(x)
F ( x ) = F M ( x ) = F 0 ( x ) + l r ∗ ∑ m = 1 M ∑ j = 1 J c m , j I ( x i ∈ R m , j ) 最终的预测结果为: y ^ i = 1 1 + e − F M ( x ) \begin{align*} F(x)&=F_M(x)=F_0(x)+lr*\sum_{m=1}^M\sum _{j=1}^Jc_{m,j}I(x_i∈R_{m,j})\\\\ &最终的预测结果为:\\\\ \hat y_i&=\frac{1}{1+e^{-F_M(x)}}\\ \end{align*} F(x)y^i=FM(x)=F0(x)+lr∗m=1∑Mj=1∑Jcm,jI(xi∈Rm,j)最终的预测结果为:=1+e−FM(x)1
3.4实际案例(分类算法)
下表一组数据,特征为年龄、体重,身高为标签值,单个CART的最大深度为3,总共最多迭代5次。
| 编号 | 年龄 | 体重 | 标签(身高) |
|---|---|---|---|
| 0 | 5 | 20 | 0 |
| 1 | 7 | 30 | 0 |
| 2 | 21 | 70 | 1 |
| 3 | 30 | 60 | 1 |
| 待预测 | 25 | 65 | ? |
1.计算初始值
∂
L
(
y
i
,
F
(
x
i
)
)
∂
F
(
x
i
)
=
y
i
−
1
1
+
e
−
F
(
x
i
)
∑
(
y
i
−
1
1
+
e
−
F
0
(
x
)
)
=
0
F
0
(
x
)
=
l
o
g
p
(
y
=
1
)
1
−
p
(
y
=
1
)
=
l
o
g
(
0.5
/
0.5
)
=
0
\begin{align*} &\frac{\partial L(y_i,F(x_i))}{\partial F(x_i)}=y_i-\frac1{1+e^{-F(x_i)}}\\\\ &\sum(y_i-\frac1{1+e^{-F_0(x)}})=0\\\\ &F_0(x)= log\frac{p(y=1)}{1-p(y=1)}=log(0.5/0.5)=0 \end{align*}
∂F(xi)∂L(yi,F(xi))=yi−1+e−F(xi)1∑(yi−1+e−F0(x)1)=0F0(x)=log1−p(y=1)p(y=1)=log(0.5/0.5)=0
2.计算残差(负梯度),生成新的训练集。
r m , i = − ∣ ∂ L ( y i , F ( x i ) ) ∂ F ( x i ) ∣ F ( x ) = F m − 1 ( x ) = y i − 1 1 + e − F ( x i ) \begin{align*} r_{m,i}&=-\bigg|\frac{\partial L(y_{i},F(x_{i}))}{\partial F(x_{i})}\bigg|_{F(x)=F_{m-1}(x)}\\ &=y_{i}-\frac{1}{1+e^{-F(x_{i})}}\\ \end{align*} rm,i=− ∂F(xi)∂L(yi,F(xi)) F(x)=Fm−1(x)=yi−1+e−F(xi)1
| 编号 | 年龄 | 体重 | 标签(身高) | F 0 ( x ) F_0(x) F0(x) | r m , i r_{m,i} rm,i |
|---|---|---|---|---|---|
| 0 | 5 | 20 | 0 | 0 | -0.5 |
| 1 | 7 | 30 | 0 | 0 | -0.5 |
| 2 | 21 | 70 | 1 | 0 | 0.5 |
| 3 | 30 | 60 | 1 | 0 | 0.5 |
3.训练第一棵CART回归树,以均方差为标准,划分决策树,树的最大深度为3
遍历每个特征的每个可能取值,寻找最佳划分点。从年龄特征的5开始,到体重特征的70结束,分别计算分裂后两组数据的平方损失(Square Error),找到使平方损失和 S E s u m = S E l + S E r SE_{sum}=SE_{l}+SE_{r} SEsum=SEl+SEr最小的那个划分节点,(SEl和SEr分布表示左右两组残差的方差),结果如下:
以年龄7为例:
- <年龄7划分到左边:
| 编号 | 年龄 | 标签 |
|---|---|---|
| 0 | 5 | -0.5 |
- >=年龄7的划分到右边
| 编号 | 年龄 | 标签 |
|---|---|---|
| 1 | 7 | -0.5 |
| 2 | 21 | 0.5 |
| 3 | 30 | 0.5 |
根据公式计算左侧的方差:
R
(
j
,
s
)
=
min
j
,
s
[
min
c
i
∑
x
∈
R
i
(
j
,
s
)
(
y
i
−
c
1
)
2
+
min
c
2
∑
x
∈
R
2
(
j
,
s
)
(
y
i
−
c
2
)
2
]
R(j,s) = \min_{j,s}\Biggl[\min_{c_{i}}\sum_{x\in R_{i}(j,s)}\left(y_{i}-c_{1}\right)^{2}+\min_{c_{2}}\sum_{x\in R_{2}(j,s)}\left(y_{i}-c_{2}\right)^{2}\Biggr]
R(j,s)=j,smin[ciminx∈Ri(j,s)∑(yi−c1)2+c2minx∈R2(j,s)∑(yi−c2)2]
中括号内的两部分,代表左右两侧,先求均值:
-
左侧均值为 − 0.5 , 计算方差 ( − 0.5 + 0.5 ) 2 = 0 左侧均值为-0.5,\\计算方差(-0.5+0.5)^2=0 左侧均值为−0.5,计算方差(−0.5+0.5)2=0
-
右侧均值为 ( − 0.5 + 0.5 + 0.5 ) / 3 = 0.167 , 计算方差 ( − 0.5 − 0.167 ) 2 + ( 0.5 − 0.167 ) 2 + ( 0.5 − 0.167 ) 2 = 0.445 + 0.111 + 0.111 = 0.667 右侧均值为(-0.5+0.5+0.5)/3 = 0.167,\\ 计算方差(-0.5-0.167)^2+(0.5-0.167)^2+(0.5-0.167)^2=0.445+0.111+0.111=0.667 右侧均值为(−0.5+0.5+0.5)/3=0.167,计算方差(−0.5−0.167)2+(0.5−0.167)2+(0.5−0.167)2=0.445+0.111+0.111=0.667
| 划分点 | 左侧(<) | 右侧(>=) | S E l SE_l SEl | S E r SE_r SEr | S E s u m SE_{sum} SEsum |
|---|---|---|---|---|---|
| 年龄5 | / | 0、1、2、3 | 0 | 1 | 1 |
| 年龄7 | 0 | 1、2、3 | 0 | 0.667 | 0.667 |
| 年龄21 | 0、1 | 2、3 | 0 | 0 | 0 |
| 年龄30 | 0、1、2 | 3 | 0.667 | 0 | 0.667 |
| 体重20 | / | 0、1、2、3 | 0 | 1 | 1 |
| 体重30 | 0 | 1、2、3 | 0 | 0.667 | 0.667 |
| 体重60 | 0、1 | 2、3 | 0 | 0 | 0 |
| 体重70 | 0、1、3 | 2 | 0 | 0.667 | 0.667 |
年龄21和体重60,所以随机选一个作为划分点,这里选年龄21。

现在树的深度只有,需要再进行一次划分,这次划分要对左右两个节点分别进行划分,但是我们在生成树的时候,设置了三个树继续生长的条件:
- 深度没有到达最大。树的深度设置为3,意思是需要生长成3层;
- 点样本数 >= min_samples_split;
- 此节点上的样本的标签值不一样。如果值一样说明已经划分得很好了,不需要再分;(本程序满足这个条件,因此树只有2层)
接下来就需要给每个叶子节点一个拟合值。
c
m
,
j
=
arg
min
∑
x
i
∈
R
m
,
j
L
(
y
i
,
F
m
−
1
(
x
i
)
+
c
)
上式没有闭式解,一般使用近似值代替
c
m
,
j
=
∑
x
i
∈
R
m
,
j
r
m
,
j
∑
x
i
∈
R
m
,
j
(
y
i
−
r
m
,
j
)
(
1
−
y
i
+
r
m
,
j
)
\begin{align*} c_{m,j}&=\arg\min\sum_{x_{i}\in R_{m,j}}L(y_{i},F_{m-1}(x_{i})+c)\\ &上式没有闭式解,一般使用近似值代替\\ c_{m,j}&=\frac{\sum_{x_i∈R_{m,j}}r_{m,j}}{\sum_{x_i∈R_{m,j}}(y_i-r_{m,j})(1-y_i+r_{m,j})}\\ \end{align*}
cm,jcm,j=argminxi∈Rm,j∑L(yi,Fm−1(xi)+c)上式没有闭式解,一般使用近似值代替=∑xi∈Rm,j(yi−rm,j)(1−yi+rm,j)∑xi∈Rm,jrm,j
左边样本 0,1 真实值0,0 残差-0.5 -0.5
( − 0.5 − 0.5 ) / { ( 0 + 0.5 ) ∗ ( 1 − 0 − 0.5 ) + ( 0 + 0.5 ) ∗ ( 1 − 0 − 0.5 ) } = − 2 (-0.5-0.5)/\{(0+0.5)*(1-0-0.5)+(0+0.5)*(1-0-0.5)\}=-2 (−0.5−0.5)/{(0+0.5)∗(1−0−0.5)+(0+0.5)∗(1−0−0.5)}=−2
右边样本 2 ,3 真实值1,1 残差0.5 0.5
(
0.5
+
0.5
)
/
{
(
1
−
0.5
)
∗
(
1
−
1
+
0.5
)
+
(
1
−
0.5
)
∗
(
1
−
1
+
0.5
)
}
=
2
(0.5+0.5)/\{(1-0.5)*(1-1+0.5)+(1-0.5)*(1-1+0.5)\}=2
(0.5+0.5)/{(1−0.5)∗(1−1+0.5)+(1−0.5)∗(1−1+0.5)}=2
(
x
0
,
x
1
∈
R
1
,
1
)
,
c
1
,
1
=
−
2.0
(
x
2
,
x
3
∈
R
1
,
2
)
,
c
1
,
2
=
2.0
\begin{aligned}(x_0,x_1\in R_{1,1}),\quad&c_{1,1}=-2.0\\(x_2,x_3\in R_{1,2}),\quad&c_{1,2}=2.0\end{aligned}
(x0,x1∈R1,1),(x2,x3∈R1,2),c1,1=−2.0c1,2=2.0
4.更新强学习器
F m ( x ) = F m − 1 ( x ) + l r ∗ ∑ c m , j I ( x i ∈ R m , j ) F_m(x)=F_{m-1}(x)+lr*\sum c_{m,j}I(x_i∈R_{m,j}) Fm(x)=Fm−1(x)+lr∗∑cm,jI(xi∈Rm,j)
| 编号 | 年龄 | 体重 | 标签(身高) | F 0 ( x ) F_0(x) F0(x) | c m , i c_{m,i} cm,i | F 1 ( x ) F_1(x) F1(x) |
|---|---|---|---|---|---|---|
| 0 | 5 | 20 | 0 | 0 | -2 | -0.2 |
| 1 | 7 | 30 | 0 | 0 | -2 | -0.2 |
| 2 | 21 | 70 | 1 | 0 | 2 | 0.2 |
| 3 | 30 | 60 | 1 | 0 | 2 | 0.2 |
5.再次计算残差,生成新的数据集。
r m , i = − ∣ ∂ L ( y i , F ( x i ) ) ∂ F ( x i ) ∣ F ( x ) = F m − 1 ( x ) = y i − 1 1 + e − F ( x i ) \begin{align*} r_{m,i}&=-\bigg|\frac{\partial L(y_{i},F(x_{i}))}{\partial F(x_{i})}\bigg|_{F(x)=F_{m-1}(x)}\\ &=y_{i}-\frac{1}{1+e^{-F(x_{i})}}\\ \end{align*} rm,i=− ∂F(xi)∂L(yi,F(xi)) F(x)=Fm−1(x)=yi−1+e−F(xi)1
| 编号 | 年龄 | 体重 | 标签(身高) | F 1 ( x ) F_1(x) F1(x) | r 2 , i r_{2,i} r2,i |
|---|---|---|---|---|---|
| 0 | 5 | 20 | 0 | -0.2 | -0.45 |
| 1 | 7 | 30 | 0 | -0.2 | -0.45 |
| 2 | 21 | 70 | 1 | 0.2 | 0.45 |
| 3 | 30 | 60 | 1 | 0.2 | 0.45 |
(6)再次训练第二棵cart回归树,重复3~5共5次,得到最终的强学习器 F 5 ( x ) F_5(x) F5(x)。最终的预测结果为
F — 5 ( x ) = 0 + 0.1 ∗ ( 2.0000 + 1.8187 + 1.6826 + 1.5769 + 1.4927 ) = 0.8571 F—_5(x)=0+0.1*(2.0000+1.8187+1.6826+1.5769+1.4927)=0.8571 F—5(x)=0+0.1∗(2.0000+1.8187+1.6826+1.5769+1.4927)=0.8571
p ( y = 1 ) = 1 1 + e − F ( x ) = 1 1 + e − 0.8571 = 0.7021 p(y=1)=\frac{1}{1+e^{-F(x)}}= \frac{1}{1+e^{-0.8571}}=0.7021 p(y=1)=1+e−F(x)1=1+e−0.85711=0.7021
3.5 掉包sklearn实现
# 调取sklearn包
from sklearn.ensemble import GradientBoostingClassifier, GradientBoostingRegressor #sklearn中,线性回归模型在linear_model模块中
from sklearn import tree
# 调取sklearn中自带的数据集
from sklearn.datasets import load_iris #调用鸢尾花分类数据集
from sklearn.datasets import load_boston #调用波士顿房价数据集
X1, y1 = load_iris(return_X_y=True) #获取X,y数据
X2, y2 = load_boston(return_X_y=True) #获取X,y数据
rfc = GradientBoostingClassifier()#初始化一个分类模型
rfr = GradientBoostingRegressor()#初始化一个回归模型
rfc.fit(X1,y1) #fit函数用于训练
rfr.fit(X2,y2)
详细情况参见:sklearn.ensemble.GradientBoostingClassifier — scikit-learn 1.3.0 documentation
详细情况参见:[sklearn.ensemble.GradientBoostingClassifier — scikit-learn 1.3.0 documentation](https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html#sklearn.ensemble.GradientBoostingClassifier)
本文围绕GBDT展开,介绍其结构为Gradient Boosting+CART树,可解决分类或回归问题。详细阐述了回归和分类算法的数学原理,如初始化弱学习器、构建新样本集等步骤,还给出了实际案例,并提及可使用sklearn库实现。
961





