(八)GBDT的原理、具体实例、代码实现

本文围绕GBDT展开,介绍其结构为Gradient Boosting+CART树,可解决分类或回归问题。详细阐述了回归和分类算法的数学原理,如初始化弱学习器、构建新样本集等步骤,还给出了实际案例,并提及可使用sklearn库实现。

(八)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=1NL(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=1NcL(yi,c))=i=1Nc(21(yic)2)=i=1Ncyi=0

不难得到:

c = ( ∑ i = 1 N y i ) / N c=(\sum^{N}_{i=1}y_i)/N c=(i=1Nyi)/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)=fm1(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=fm1(x)(1/2(yifm1(x))2)=yifm1(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=1NΥL(Υi,m1,Υ)Υ所以,第一个若学习的输出为Υ1,jI(xiR1,j)=arg minΥxiRm,jL(yi,fm1(xi)+Υ)=arg minΥxiRm,jL(Υi,m1,Υ)=i=1NΥ(21(Υi,m1Υ)2)=i=1NΥΥi,m1=0=(i=1NΥi,m1)/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(xiR1,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)+lrm=1Mj=1JΥm,jI(xiRm,j),其中lr是学习率

3.2实际案例(回归算法)

下表一组数据,特征为年龄、体重,身高为标签值,单个CART的最大深度为3,总共最多迭代5次。

编号年龄体重标签(身高)
05201.1
17301.3
221701.7
330601.8
待预测2565
  1. 初始化弱学习器

    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

  2. 计算负梯度(就是残差 r = y − f 0 ( x ) r=y-f_{0}(x) r=yf0(x)),得新的训练集

编号真实值 f 0 ( x ) f_0(x) f0(x)r残差(新的标签值)
01.11.475-0.375
11.31.475-0.175
21.71.4750.225
31.81.4750.325

新的训练集

编号年龄体重标签
0520-0.375
1730-0.175
221700.225
330600.325
待预测2565

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划分到左边:
编号年龄标签
05-0.375
  • >=年龄7的划分到右边
编号年龄标签
17-0.175
2210.225
3300.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[ciminxRi(j,s)(yic1)2+c2minxR2(j,s)(yic2)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.1750.125)2+(0.2250.125)2+(0.3250.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、300.3270.327
年龄701、2、300.1400.140
年龄210、12、30.0200.0050.025
年龄300、1、230.18700.187
体重20/0、1、2、300.3270.327
体重3001、2、300.1400.140
体重600、12、30.0200.0050.025
体重700、1、320.26000.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、100.0200.020
年龄701000
体重20/0、100.0200.020
体重3001000
划分点左侧(<)右侧(>=) S E l SE_l SEl S E r SE_r SEr S E s u m SE_{sum} SEsum
年龄21/2、300.0050.005
年龄3023000
体重60/2、300.0050.005
体重7032000

计算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(xiR1,j)

6.更新数据集

编号年龄体重真实标签 f 1 ( x ) f_1(x) f1(x)残差(新标签)
05201.11.61875-0.3375
17301.31.62075-0.1575
221701.71.624750.2025
330601.81.625750.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)+lrm=15j=14ΥjmI(xRjm)=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=1m(y(i)loghθ(x(i))+(1y(i))log(1hθ(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))=yi1+eF(xi)1(yi1+eF0(x)1)=0F0(x)=log1p(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)=Fm1(x)=yi1+eF(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=argminxiRm,jL(yi,Fm1(xi)+c)上式没有闭式解,一般使用近似值代替=xiRm,j(yirm,j)(1yi+rm,j)xiRm,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)=Fm1(x)+lrcm,jI(xiRm,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)+lrm=1Mj=1Jcm,jI(xiRm,j)最终的预测结果为:=1+eFM(x)1

3.4实际案例(分类算法)

下表一组数据,特征为年龄、体重,身高为标签值,单个CART的最大深度为3,总共最多迭代5次。

编号年龄体重标签(身高)
05200
17300
221701
330601
待预测2565

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))=yi1+eF(xi)1(yi1+eF0(x)1)=0F0(x)=log1p(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)=Fm1(x)=yi1+eF(xi)1

编号年龄体重标签(身高) F 0 ( x ) F_0(x) F0(x) r m , i r_{m,i} rm,i
052000-0.5
173000-0.5
22170100.5
33060100.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划分到左边:
编号年龄标签
05-0.5
  • >=年龄7的划分到右边
编号年龄标签
17-0.5
2210.5
3300.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[ciminxRi(j,s)(yic1)2+c2minxR2(j,s)(yic2)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.50.167)2+(0.50.167)2+(0.50.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、3011
年龄701、2、300.6670.667
年龄210、12、3000
年龄300、1、230.66700.667
体重20/0、1、2、3011
体重3001、2、300.6670.667
体重600、12、3000
体重700、1、3200.6670.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=argminxiRm,jL(yi,Fm1(xi)+c)上式没有闭式解,一般使用近似值代替=xiRm,j(yirm,j)(1yi+rm,j)xiRm,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.50.5)/{(0+0.5)(100.5)+(0+0.5)(100.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)/{(10.5)(11+0.5)+(10.5)(11+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,x1R1,1),(x2,x3R1,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)=Fm1(x)+lrcm,jI(xiRm,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)
052000-2-0.2
173000-2-0.2
221701020.2
330601020.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)=Fm1(x)=yi1+eF(xi)1

编号年龄体重标签(身高) F 1 ( x ) F_1(x) F1(x) r 2 , i r_{2,i} r2,i
05200-0.2-0.45
17300-0.2-0.45
2217010.20.45
3306010.20.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 F5(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+eF(x)1=1+e0.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)

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值