GBDT

提升方法实际采用加法模型(即基函数的线性组合)与前向分布算法。以决策树为基函数的提升方法称为提升树。提升树模型可以表示为决策树的加法模型:

fm(x)=m=1MT(x;Θm)f_m(x)=\sum\limits_{m=1}^MT(x;\Theta_m)

其中, T(x;Θm)T(x;\Theta_m) 表示决策树; Θm\Theta_m 为决策树的参数; MM 为树的个数。

提升树算法采用前向分步算法。首先确定初始提升树 f0(x)=0f_0(x)=0 ,第 mm 步的模型是

fm(x)=fm1(x)+T(x;Θm)f_m(x)=f_{m-1}(x)+T(x;\Theta_m)

其中, fm1(x)f_{m-1}(x) 为当前模型,通过经验风险极小化确定下一棵决策树的参数 Θm\Theta_m

Θ^m=argminΘmi=1NL(yi,fm1(xi)+T(xi;Θm))\hat{\Theta}_m=\arg\min\limits_{\Theta_m}\sum\limits_{i=1}^NL(y_i,f_{m-1}(x_i)+T(x_i;\Theta_m))

下面讨论针对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同。包括平方误差损失函数的回归问题,用指数函数的分类问题,以及用一般损失函数的一般决策问题。

分类问题

将GBDT应用于回归问题,相对来说比较容易理解。因为回归问题的损失函数一般为平方差损失函数,这时的残差,恰好等于预测值与实际值之间的差值。每次拿一棵决策树去拟合这个差值,使得残差越来越小,这个过程还是比较intuitive的。而将GBDT用于分类问题,则显得不那么显而易见。

在说明分类之前,我们先介绍一种损失函数。与常见的直接求预测与真实值的偏差不同,这种损失函数的目的是最大化预测值为真实值的概率。这种损失函数叫做对数损失函数(Log-Likehood Loss),定义如下

L(Y,P(YX))=logP(YX)L(Y,P(Y|X))=-\log P(Y|X)

对于二项分布, y{0,1}y^*\in\{0,1\} ,我们定义预测概率为 p(x)=P(y=1)p(x)=P(y^*=1) ,即二项分布的概率,可得

L(y,p(x))={log(p(x)),  if y=1log(1p(x)),  if y=0L(y^*,p(x))=\begin{cases} -\log(p(x)),\ \ \text{if}\ y^*=1\\ -\log(1-p(x)),\ \ \text{if}\ y^*=0 \end{cases}

即,可以合并写成

L(y,p(x))=yilog(p(x))(1yi)log(1p(x))L(y^*,p(x))=-y_i\log(p(x))-(1-y_i)\log(1-p(x))

L(y,p(x))=yilogyi^(1yi)log(1yi^)L(y^*,p(x))=-y_i\log\hat{y_i}-(1-y_i)\log(1-\hat{y_i})

对于 p(x)p(x)F(x)F(x) 的关系,我们定义为

p(x)=eF(x)eF(x)+eF(x)p(x)=\frac{e^{F(x)}}{e^{F(x)}+e^{-F(x)}}

二分类

类似于逻辑回归、FM模型用于分类问题,其实是在用一个线性模型或者包含交叉项的非线性模型,去拟合所谓的对数几率 lnp1p\ln \frac{p}{1-p} 。而GBDT也是一样,只是用一系列的梯度提升树去拟合这个对数几率,实际上最终得到的是一系列CART回归树。其分类模型可以表达为:

P(y=1x)=11+em=0Mhm(x)P(y=1|x)=\frac{1}{1+e^{-\sum^M_{m=0}h_m(x)}}

其中, hm(x)h_m(x) 就是学习到的决策树。

清楚了这一点之后,我们便可以参考逻辑回归,单样本 (xi,yi)(x_i,y_i) 的损失函数可以表达为交叉熵:

loss(xi,yi)=yilogyi^(1yi)log(1yi^)loss(x_i,y_i)=-y_i\log\hat{y_i}-(1-y_i)\log(1-\hat{y_i})

假设第 kk 步迭代之后当前学习器为 F(x)=m=0khm(x)F(x)=\sum\limits_{m=0}^kh_m(x) ,将 yi^\hat{y_i} 的表达式带入之后, 损失函数写为:

loss(xi,yiF(x))=yilog(1+eF(xi))+(1yi)[F(xi)+log(1+eF(xi))]loss(x_i,y_i|F(x))=y_i\log(1+e^{-F(x_i)})+(1-y_i)[F(x_i)+\log(1+e^{-F(x_i)})]

可以求得损失函数相对于当前学习器的负梯度为:

lossF(x)xi,yi=yi11+eF(xi)=yiyi^-\frac{\partial loss}{\partial F(x)}|_{x_i,y_i}=y_i-\frac{1}{1+e^{-F(x_i)}}=y_i-\hat{y_i}

可以看到,同回归问题很类似,下一棵决策树的训练样本为: {xi,yiyi^}i=1n\{x_i,y_i-\hat{y_i}\}_{i=1}^n ,其所需要拟合的残差为真实标签与预测概率之差。于是便有下面GBDT应用于二分类的算法:

  • For m=1,2,M\text{For}\ m=1,2\dots,M

    • 计算 gi=yi^yig_i=\hat{y_i}-y_i ,并使用训练集 {(xi,gi)}i=1n\{(x_i,-g_i)\}^n_{i=1} 训练一棵回归树 tm(x)t_m(x),其中 yi^=11+eFm1(x)\hat{y_i}=\frac{1}{1+e^{-F_{m-1}(x)}}

    • 通过最小化损失函数找树的最优权重: ρm=argminpiloss(xi,yiFm1(x)+ρtm(x))\rho_m=\mathop{\arg\min}\limits_p\sum\limits_iloss(x_i,y_i|F_{m-1}(x)+\rho t_m(x))

    • 考虑shrinkage,可得这一轮迭代之后的学习器 Fm(x)=Fm1(x)+αρmtm(x)F_m(x)=F_{m-1}(x)+\alpha\rho_m t_m(x) , α\alpha 为学习率

  • 得到最终学习器: Fm(x)F_m(x)

多分类

模仿上面两类分类的损失函数,我们能够将 KK 类分类的损失函数定义为

k=1Kyklogpk(x)-\sum\limits_{k=1}^Ky_k\log p_k(x)

其中, pk(x)=P(yk=1xk)p_k(x)=P(y_k=1|x_k) ,且将 pk(x)p_k(x)Fk(x)F_k(x) 关系定义为

Fk(x)=logpk(x)1Kl=1Klogpl(x)F_k(x)=\log p_k(x)-\frac{1}{K}\sum\limits_{l=1}^K\log p_l(x)

或者,换一种表达方式

pk(x)=eFk(x)i=1KeFi(x)p_k(x)=\frac{e^{F_k(x)}}{\sum_{i=1}^Ke^{F_i(x)}}

即,对于多分类问题,则需要考虑以下softmax模型:

P(y=1x)=eF1(x)i=1keFi(x)P(y=1|x)=\frac{e^{F_1(x)}}{\sum_{i=1}^ke^{F_i(x)}} P(y=2x)=eF1(x)i=2keFi(x)P(y=2|x)=\frac{e^{F_1(x)}}{\sum_{i=2}^ke^{F_i(x)}} ... ...

其中 F1FkF_1\dots F_kkk 个不同的tree ensemble。每一轮的训练实际上是训练了 kk 棵树去拟合softmax的每一个分支模型的负梯度。可见,这k棵树同样是拟合了样本的真实标签与预测概率之差,与二分类的过程非常类似。

回归问题

已知一个训练数据集 T={(x1,y1),(x2,y2),,(xN,yN)}, xiXRnT = \{(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)\},\ x_i\in \mathcal{X}\subseteq R^nX\mathcal{X} 为输入空间, yiYRy_i\in\mathcal{Y}\subseteq RY\mathcal{Y} 为输出空间。如果将输入空间 X\mathcal{X} 划分为 JJ 个互不相交的区域 R1,R2,,RJR_1,R_2,\dots,R_J ,并且在每个区域上确定输出的常量 cjc_j ,那么树可表示为

T(x;Θ)=j=1JcjI(xRj)T(x;\Theta)=\sum\limits_{j=1}^Jc_jI(x\in R_j)

其中,参数 Θ={(R1,c1),(R2,c2),,(RJ,cJ)}\Theta=\{(R_1,c_1),(R_2,c_2),\dots,(R_J,c_J)\} 表示树的区域划分和各区域上的常数。 JJ 是回归树的复杂度即叶结点个数。

回归问题提升树使用以下前向分布算法:

  • f0(x)=0f_0(x)=0

  • fm(x)=fm1(x)+T(x;Θm),  m=1,2,,Mf_m(x)=f_{m-1}(x)+T(x;\Theta_m),\ \ m=1,2,\dots,M

  • fM(x)=m=1MT(x;Θm)f_M(x)=\sum\limits_{m=1}^MT(x;\Theta_m)

在前向分步算法的第 mm 步,给定当前模型 fm1(x)f_{m-1}(x) ,需求解

Θ^m=argminΘmi=1NL(yi,fm1(xi)+T(xi;Θm))\hat{\Theta}_m=\arg\min\limits_{\Theta_m}\sum\limits_{i=1}^NL(y_i,f_{m-1}(x_i)+T(x_i;\Theta_m))

得到 Θ^m\hat{\Theta}_m ,即第 mm 颗树的参数。当采用平方误差损失函数时,

L(y,f(x))=(yf(x))2L(y,f(x))=(y-f(x))^2

其损失变为

L(y,fm1(x)+T(x;Θm))=[yfm1(x)T(x;Θm)]2=[rT(x;Θm)]L(y,f_{m-1}(x)+T(x;\Theta_m))=[y-f_{m-1}(x)-T(x;\Theta_m)]^2=[r-T(x;\Theta_m)]

这里, r=yfm1(x) r=y-f_{m-1}(x) 即当前模型拟合数据的残差。所以,对回归问题的提升树算法来说,只需简单地拟合当前模型的残差。

回归问题的提升树算法

输入:训练数据集 T={(x1,y1),(x2,y2),,(xN,yN)},xiXRn,yiYRT = \{(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)\},x_i\in\mathcal{X}\subseteq R^n,y_i\in\mathcal{Y}\subseteq R

输出:提升树 fM(x)f_M(x)

(1)初始化 f0(x)=0f_0(x)=0

(2)对 m=1,2,,Mm = 1,2,\dots,M

  • (a)按 rmi=yifm1(xi) r_{mi}=y_i-f_{m-1}(x_i)计算残差

  • (b)拟合残差 rmir_{mi} 学习一个回归树,得到 T(x;Θm)T(x;\Theta_m)

  • (c)更新 fm(x)=fm1(x)+T(x;Θm)f_m(x)=f_{m-1}(x)+T(x;\Theta_m)

(3)得到回归提升树: fM(x)=m=1MT(x;Θm)f_M(x)=\sum\limits_{m=1}^MT(x;\Theta_m)

举例如下

xix_i

1

2

3

4

5

6

7

8

9

10

yiy_i

5.56

5.70

5.91

6.40

6.80

7.05

8.90

8.70

9.00

9.05

对于 m=1m = 1

f1(x)f_1(x) 即回归树 T1(x)T_1(x) ,首先通过以下优化问题:

mins[minc1xiR1(yic1)2+minc2xiR2(yic2)2]\min\limits_s[\min\limits_{c_1}\sum\limits_{x_i\in R_1}(y_i-c_1)^2+\min\limits_{c_2}\sum\limits_{x_i\in R_2}(y_i-c_2)^2]

求解训练数据的切分点 ss

R1={xxs}R_1=\{x|x\leq s\} R2={xx>s}R_2=\{x|x> s\}

容易求得在 R1,R2R_1,R_2 内部使平方损失误差达到最小值的 c1,c2c_1,c_2

c1=1N1xiR1yic_1=\frac{1}{N_1}\sum\limits_{x_i\in R_1}y_i c2=1N2xiR2yic_2 = \frac{1}{N_2}\sum\limits_{x_i\in R_2}y_i

这里 N1,N2N_1,N_2R1,R2R_1,R_2 的样本点数

求训练数据的切分点。根据所给数据,考虑如下切分点:1.5, 2.5, 3.5, 4.5, 6.5, 7.5, 8.5, 9.5

对各切分点,求出相应的 R1,R2,c1,c2R_1,R_2,c_1,c_2m(s)=minc1xiR1(yic1)2+minc2xiR2(yic2)2m(s)=\min\limits_{c_1}\sum\limits_{x_i\in R_1}(y_i-c_1)^2+\min\limits_{c_2}\sum\limits_{x_i\in R_2}(y_i-c_2)^2

例如,当 s=1.5s= 1.5 时, R1={1}R_1=\{1\}R2={2,3,,10}R_2=\{2,3,\dots,10\}c1=5.56c_1=5.56c2=7.50c_2=7.50

m(s)=minc1xiR1(yic1)2+minc2xiR2(yic2)2=0+15.72=15.72m(s)=\min\limits_{c_1}\sum\limits_{x_i\in R_1}(y_i-c_1)^2+\min\limits_{c_2}\sum\limits_{x_i\in R_2}(y_i-c_2)^2=0+15.72=15.72

现将 ssm(s)m(s) 的计算结果列表如下

ss

1.5

2.5

3.5

4.5

5.5

6.5

7.5

8.5

9.5

m(s)m(s)

15.72

12.07

8.36

5.78

3.91

1.93

8.01

11.73

15.74

由上表可知,当 s=6.5s = 6.5m(s)m(s) 达到最小值,此时 R1={1,2,,6}R_1=\{1,2,\dots,6\}R2={7,8,9,10}R_2=\{7,8,9,10\}c1=6.24c_1 = 6.24c2=8.91c_2 = 8.91 ,所以回归树 T1(x)T_1(x)

T1(x)={6.24,  x<6.58.91,  x6.5T_1(x)=\begin{cases}6.24,\ \ x<6.5\\ 8.91,\ \ x\geq6.5\end{cases}

f1(x)=T1(x)f_1(x) = T_1(x)

f1(x)f_1(x) 拟合训练数据的残差 r2i=yif1(x),  i=1,2,,10r_{2i}=y_i-f_1(x),\ \ i=1,2,\dots,10

xix_i

1

2

3

4

5

6

7

8

9

10

r2ir_{2i}

-0.68

-0.54

-0.33

0.16

0.56

0.81

-0.01

-0.21

0.09

0.14

f1(x)f_1(x) 拟合训练数据的平均损失误差: L(y,f1(x))=i=110(yif1(xi))2=1.93L(y,f_1(x))=\sum\limits_{i=1}^{10}(y_i-f_1(x_i))^2=1.93

对于 m=2m = 2

T2(x)T_2(x) ,方法与求 T1(x)T_1(x) 一样,只是拟合的数据为上一步的残差。可以得到

T1(x)={0.52,  x<3.50.22,     x3.5T_1(x)=\begin{cases}-0.52,\ \ x<3.5\\ 0.22,\ \ \ \ \ x\geq3.5\end{cases}

f2(x)=f1(x)+T2(x)={0.52+6.24=5.72,  x<3.56.24+0.22=6.46,     3.5x<6.58.91+0.22=9.13,      x6.5f_2(x) = f_1(x)+T_2(x)=\begin{cases}-0.52+6.24=5.72,\ \ x<3.5\\ 6.24+0.22=6.46,\ \ \ \ \ 3.5\leq x<6.5\\ 8.91+0.22=9.13,\ \ \ \ \ \ x\geq6.5\end{cases}

f2(x)f_2(x) 拟合训练数据的平方损失误差是: L(y,f2(x))=i=110(yif2(xi))2=0.79L(y,f_2(x))=\sum\limits_{i=1}^{10}(y_i-f_2(x_i))^2=0.79

对于 m=3,4,,Mm = 3,4,\dots,M

继续按上述方法计算,直至求得拟合训练数据的平方误差到可接受范围。

梯度提升

提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数是平方损失和指数损失函数时,每一步优化是很简单的。但对一般损失函数而言,往往每一步优化并不那么容易。针对这一问题,梯度提升算法利用最速下降法的近似方法,其核心是利用损失函数的负梯度在当前模型的值

[L(y,f(xi))f(xi)]f(x)=fm1(x)-[\frac{\partial L(y,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1}(x)}

作为回归问题提升树算法中的残差的近似值,拟合一个回归树。

梯度提升算法

输入:训练数据集 T={(x1,y1),(x2,y2),,(xN,yN)},xiXRn,yiYRT = \{(x_1,y_1),(x_2,y_2),\dots,(x_N,y_N)\},x_i\in \mathcal{X}\subseteq R^n,y_i\in \mathcal{Y}\subseteq R

损失函数 L(y,f(x))L(y,f(x))

输出:回归树 f^(x)\hat{f}(x)

(1)初始化: f0(x)=argminci=1NL(yi,c)f_0(x)=\arg\min\limits_c\sum\limits_{i=1}^NL(y_i,c)

(2)对 m=1,2,,Mm = 1,2,\dots,M

  • (a)对 i=1,2,,Ni=1,2,\dots,N ,计算

  • rmi=[L(yi,f(xi))f(xi)]f(x)=fm1(x)r_{mi} = -[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}]_{f(x)=f_{m-1(x)}}

  • (b)对 rmir_{mi} 拟合一个回归树,得到第 mm 棵树的叶结点区域 Rmj,j=1,2,,JR_{mj},j=1,2,\dots,J

  • (c)对 j=1,2,,Jj = 1,2,\dots,J ,计算

  • cmj=argmincxiRmiL(yi,fm1(xi)+c)c_{mj}=\arg\min\limits_c\sum\limits_{x_i\in R_{mi}}L(y_i,f_{m-1}(x_i)+c)

  • (d)更新 fm(x)=fm1(x)+j=1JcmiI(xRmi)f_m(x)=f_{m-1}(x)+\sum\limits_{j=1}^Jc_{mi}I(x\in R_{mi})

(3)得到回归树: f^(x)=fM(x)=m=1Mj=1JcmiI(xRmi)\hat{f}(x)=f_M(x)=\sum\limits_{m=1}^M\sum\limits_{j=1}^Jc_{mi}I(x\in R_{mi})

算法第(1)步初始化,估计使损失函数极小化的常数值,它是只有一个根节点的数。

第(2a)步计算损失函数的负梯度在当前模型的值,将它作为残差的估计。对于平方损失函数,它就是通常所说的残差;对于一般损失函数,它就是残差的近似值。

第(2b)步估计回归树叶结点区域,以拟合残差的近似值。

第(2c)步利用线性搜索估计叶结点区域的值,是损失函数极小化。

第(2d)步更新回归树

第(3)步得到输出的最终模型。

Source

Last updated