参考:
- https://zhuanlan.zhihu.com/p/47185756
- https://zhuanlan.zhihu.com/p/494536555
- https://zhuanlan.zhihu.com/p/465921554
- https://zhuanlan.zhihu.com/p/91652813
- https://zhuanlan.zhihu.com/p/89614607
GBDT用于分类的时候,并不是(像随机森林)用Gini或者熵的方式划分特征空间实现分类,由于需要拟合残差,GBDT实际上是在学习样本在每个类别上的得分
二分类
情况1( y ∈ { − 1 , 1 } y \in \left \{-1,1\right \} y∈{−1,1})
在论文【Friedman J H. Greedy function approximation: a gradient boosting machine[J]. Annals of statistics, 2001: 1189-1232.】中二分类 y ∈ { − 1 , 1 } y \in \left \{-1,1\right \} y∈{−1,1},则损失函数的表达式为 L ( y , F ) = log ( 1 + exp ( − 2 y F ) ) ( 系数 2 是作者自己加上去的 ) L(y, F)=\log (1+\exp (-2 y F))(系数2是作者自己加上去的) L(y,F)=log(1+exp(−2yF))(系数2是作者自己加上去的)
对数损失函数
对数损失函数的标准形式: L ( Y , P ( Y = y ∣ x ) ) = − log P ( Y = y ∣ x ) L(Y, P(Y=y \mid x))=-\log P(Y=y \mid x) L(Y,P(Y=y∣x))=−logP(Y=y∣x)
逻辑回归 P ( Y = y ∣ x ) P(Y=y \mid x) P(Y=y∣x)表达式:
- 当y=1时: P ( Y = y ∣ x ) = h θ ( x ) = g ( f ( x ) ) = 1 1 + e − f ( x ) P(Y=y \mid x)=h_\theta(x)=g(f(x))=\frac{1}{1+e^{-f(x)}} P(Y=y∣x)=hθ(x)=g(f(x))=1+e−f(x)1
- 当y=-1时: P ( Y = y ∣ x ) = 1 − h θ ( x ) = 1 − g ( f ( x ) ) = 1 − 1 1 + e − f ( x ) = e − f ( x ) 1 + e − f ( x ) = 1 1 + e f ( x ) P(Y=y \mid x)=1-h_\theta(x)=1-g(f(x))=1-\frac{1}{1+e^{-f(x)}}=\frac{e^{-f(x)}}{1+e^{-f(x)}}=\frac{1}{1+e^{f(x)}} P(Y=y∣x)=1−hθ(x)=1−g(f(x))=1−1+e−f(x)1=1+e−f(x)e−f(x)=1+ef(x)1
将它带入到对数损失函数的标准形式,通过推导可以得到logistic的损失函数表达式如下:
L ( Y , P ( Y = y ∣ x ) ) = { − log ( 1 1 + e − f ( x ) ) y = 1 − log ( 1 1 + e f ( x ) ) y = − 1 L(Y, P(Y=y \mid x))= \begin{cases}-\log \left(\frac{1}{1+e^{-f(x)}}\right) & y=1 \\ -\log \left(\frac{1}{1+e^{f(x)}}\right) & y=-1\end{cases} L(Y,P(Y=y∣x))=⎩ ⎨ ⎧−log(1+e−f(x)1)−log(1+ef(x)1)y=1y=−1
等价于
L ( Y , P ( Y = y ∣ x ) ) = { log ( 1 + e − f ( x ) ) y = 1 log ( 1 + e f ( x ) ) y = − 1 L(Y, P(Y=y \mid x))= \begin{cases}\log (1+e^{-f(x)}) & y=1 \\ \log (1+e^{f(x)}) & y=-1\end{cases} L(Y,P(Y=y∣x))={log(1+e−f(x))log(1+ef(x))y=1y=−1
当分的两类为 {1,−1} 时,逻辑回归的表达式 P ( Y = y ∣ x ) P(Y=y \mid x) P(Y=y∣x)可以合并如下
P ( Y = y ∣ x ) = 1 1 + e − y f ( x ) P(Y=y \mid x)=\frac{1}{1+e^{-y f(x)}} P(Y=y∣x)=1+e−yf(x)1
将它带入到对数损失函数的标准形式,通过推导可以得到logistic的损失函数表达式如下:
L ( Y , P ( Y = y ∣ x ) ) = log ( 1 + e − y f ( x ) ) L(Y, P(Y=y \mid x))=\log \left(1+e^{-y f(x)}\right) L(Y,P(Y=y∣x))=log(1+e−yf(x))
若 y ∈ Y = { 0 , 1 } y \in Y=\{0,1\} y∈Y={0,1} ,则逻辑回归最后得到的目标式子如下:
J ( θ ) = − 1 m ∑ i = 1 m [ y ( i ) log h θ ( x ( i ) ) + ( 1 − y ( i ) ) log ( 1 − h θ ( x ( i ) ) ) ] J(\theta)=-\frac{1}{m}\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] J(θ)=−m1i=1∑m[y(i)loghθ(x(i))+(1−y(i))log(1−hθ(x(i)))]
残差可以表示为
r
m
i
=
−
∂
L
(
y
i
,
F
(
x
i
)
)
∂
F
(
x
i
)
∣
F
(
x
i
)
=
F
m
−
1
(
x
i
)
=
2
y
i
1
+
exp
(
2
y
i
F
m
−
1
(
x
i
)
)
r_{mi}=-\left.\frac{\partial L\left(y_i, F\left(x_i\right)\right)}{\partial F\left(x_i\right)}\right|_{F\left(x_i\right)=F_{m-1}\left(x_i\right)}=\frac{2 y_i}{1+\exp \left(2 y_i F_{m-1}\left(x_i\right)\right)}
rmi=−∂F(xi)∂L(yi,F(xi))
F(xi)=Fm−1(xi)=1+exp(2yiFm−1(xi))2yi
推导:
∵ L ( y , F ) = log ( 1 + exp ( − 2 y F ) ) ∴ ∂ L ( y i , F ( x i ) ∂ F ( x i ) = exp ( − 2 y i F ( x i ) ) ( − 2 y i ) 1 + exp ( − 2 y i F ( x i ) ) = ( − 2 y i ) [ 1 − 1 1 + exp ( − 2 y i F ( x i ) ) ] = − 2 y i + 2 y i ⋅ 1 1 + exp ( − 2 y i F ( x i ) ) ∂ 2 L ( y i , F ( x i ) ) ∂ F 2 ( x i ) = 2 y i 1 1 + exp ( − 2 y i F ( x i ) ) ⋅ exp ( − 2 y i F ( x i ) ) 1 + exp ( − 2 y i F ( x i ) ) ⋅ ( 2 y i ) ( 注意:把 2 y i F ( x i ) 整体看成 1 1 + e − x 的 x ) 而 r m i = − ∂ L ( y i , F ( x i ) ) ∂ F ( x i ) ∣ F ( x i ) = F m − 1 ( x i ) = 2 y i [ 1 1 + exp ( − 2 y i F m − 1 ( x i ) ) − 1 ] = ( 2 y i ) exp ( − 2 y i F m − 1 ( x i ) ) 1 + exp ( − 2 y i F m − 1 ( x i ) ) = ( 2 y i ) 1 exp ( 2 y i F m − 1 ( x i ) ) + 1 \begin{aligned} & \because L(y, F)=\log (1+\exp (-2 y F)) \\ & \therefore \frac{\partial L\left(y_i, F\left(x_i\right)\right.}{\partial F\left(x_i\right)}=\frac{\exp \left(-2 y_i F\left(x_i\right)\right)\left(-2 y_i\right)}{1+\exp \left(-2 y_i F\left(x_i\right)\right)}=\left(-2 y_i\right)\left[1-\frac{1}{1+\exp \left(-2 y_i F(x_i)\right)}\right] \\ & =-2 y_i+2 y_i \cdot \frac{1}{1+\exp \left(-2 y_i F\left(x_i\right))\right.} \\ & \frac{\partial^2 L\left(y_i, F\left(x_i\right)\right)}{\partial F^2\left(x_i\right)}=2 y_i \frac{1}{1+\exp \left(-2 y_i F\left(x_i\right)\right)} \cdot \frac{\exp \left(-2 y_i F\left(x_i\right)\right)}{1+\exp \left(-2 y_i F\left(x_i\right)\right)} \cdot\left(2 y_i\right) (注意:把2y_iF(x_i)整体看成\frac{1}{1+e^{-x}}的x) \\ & \text { 而 } r_{m i}=-\left.\frac{\partial L\left(y_i, F\left(x_i\right)\right)}{\partial F_{\left(x_i\right)}}\right|_{F_{\left(x_i\right)}= F_{m-1}\left(x_i\right)}=2 y_i\left[\frac{1}{1+\exp \left(-2 y_i F_{m-1}\left(x_i\right)\right.)}-1\right] \\ & =(2 y_i) \frac{\exp \left(-2 y_i F_{m-1}\left(x_i\right)\right)}{1+\exp \left(-2 y_i F_{m-1}{\left(x_i\right)}\right)}=(2 y_i) \frac{1}{\left.\exp \left(2 y_i F_{m-1}{(} x_i\right)\right)+1} \\ & \end{aligned} ∵L(y,F)=log(1+exp(−2yF))∴∂F(xi)∂L(yi,F(xi)=1+exp(−2yiF(xi))exp(−2yiF(xi))(−2yi)=(−2yi)[1−1+exp(−2yiF(xi))1]=−2yi+2yi⋅1+exp(−2yiF(xi))1∂F2(xi)∂2L(yi,F(xi))=2yi1+exp(−2yiF(xi))1⋅1+exp(−2yiF(xi))exp(−2yiF(xi))⋅(2yi)(注意:把2yiF(xi)整体看成1+e−x1的x) 而 rmi=−∂F(xi)∂L(yi,F(xi)) F(xi)=Fm−1(xi)=2yi[1+exp(−2yiFm−1(xi))1−1]=(2yi)1+exp(−2yiFm−1(xi))exp(−2yiFm−1(xi))=(2yi)exp(2yiFm−1(xi))+11
而 γ l m = arg min ρ ∑ i = 1 N log ( 1 + exp ( − 2 y i ( F m − 1 ( x i ) + γ l m I ( x i ∈ R j m ) ) ) ( 拆分到各个叶子节点) = arg min γ ∑ x i ∈ R j m log ( 1 + exp ( − 2 y i ( F m − 1 ( x i ) + γ l m I ( x i ∈ R j m ) ) ) 而\gamma_{l m}=\arg \min _\rho \sum_{i=1}^N \log \left(1+\exp \left(-2 y_i\left(F_{m-1}\left(\mathbf{x}_i\right)+\gamma_{lm}I(x_i\in R_{jm}\right)\right)\right)\\ (拆分到各个叶子节点)=\arg \min _\gamma \sum_{\mathbf{x}_i \in R_{j m}} \log \left(1+\exp \left(-2 y_i\left(F_{m-1}\left(\mathbf{x}_i\right)+\gamma_{lm}I(x_i\in R_{jm}\right)\right)\right) 而γlm=argminρ∑i=1Nlog(1+exp(−2yi(Fm−1(xi)+γlmI(xi∈Rjm)))(拆分到各个叶子节点)=argminγ∑xi∈Rjmlog(1+exp(−2yi(Fm−1(xi)+γlmI(xi∈Rjm))),
γ l m ∗ = γ l m I ( x i ∈ R j m ) = arg min γ ∑ x i ∈ R l m log ( 1 + exp ( − 2 y i ( F m − 1 ( x i ) + γ ) ) ) = argmin γ ∑ x i ∈ R j m L ( y i , F m − 1 ( x i ) + γ ) ( 注:在 F m − 1 ( x i ) 处泰勒展开 ) = a r g m i n ∑ x i ∈ R j m L ( y i , F m − 1 ( x i ) ) + ∂ L ( y i , F m − 1 ( x i ) ) γ + 1 2 ∂ 2 L ( y i , F m − 1 ( x i ) ) γ 2 \gamma_{lm}^*=\gamma_{l m} I(x_i \in R_{jm})=\arg \min _\gamma \sum_{\mathbf{x}_i \in R_{l m}} \log \left(1+\exp \left(-2 y_i\left(F_{m-1}\left(\mathbf{x}_i\right)+\gamma\right)\right)\right)\\ =\operatorname{argmin}_\gamma \sum_{x_i \in R_{j m}} L(y_i, F_{m-1}(x_i)+\gamma)(注:在F_{m-1}(x_i)处泰勒展开)\\=argmin\sum_{x_i \in R_{j m}} L\left(y_i, F_{m-1}\left(x_i\right)\right)+\partial L\left(y_i, F_{m-1}\left(x_i\right)\right) \gamma+\frac{1}{2} \partial^2 L\left(y_i, F_{m-1}\left(x_i\right)\right) \gamma^2 γlm∗=γlmI(xi∈Rjm)=argminγ∑xi∈Rlmlog(1+exp(−2yi(Fm−1(xi)+γ)))=argminγ∑xi∈RjmL(yi,Fm−1(xi)+γ)(注:在Fm−1(xi)处泰勒展开)=argmin∑xi∈RjmL(yi,Fm−1(xi))+∂L(yi,Fm−1(xi))γ+21∂2L(yi,Fm−1(xi))γ2$\gamma_{lm}^* =【注意:-\frac{b}{2a}】-\frac{\sum_{x_i \in R_{j m}} \partial L\left(y_i, F_{m-1}(x_i)\right)}{\sum_{x_i \in R_{j m}} \partial^2 L\left(y_i, F_{m-1}(x_i)\right)}=\frac{\sum_{x_i \in R_{j m}} r_{mi}}{\sum_{x_i \in R_{j m}}\left|r_{mi}\right|\left|2-r_{mi}\right|} $(证明过程见上面图片)
伪代码
注: F 0 ( x ) = 1 2 P ( Y = 1 ∣ X ) P ( Y = − 1 ∣ X ) ( 论文中对 y ˉ 未详细解释 ) F_0(x)=\frac{1}{2}\frac{P(Y=1|X)}{P(Y=-1|X)}(论文中对\bar{y}未详细解释) F0(x)=21P(Y=−1∣X)P(Y=1∣X)(论文中对yˉ未详细解释)
情况2( y ∈ { 0 , 1 } y \in \left \{0,1\right \} y∈{0,1})
单个样本的损失函数 J ( θ ) = y i log h θ ( x i ) + ( 1 − y i ) log ( 1 − h θ ( x i ) ) J(\theta)= y_i \log h_\theta\left(x_i\right)+\left(1-y_i\right) \log \left(1-h_\theta\left(x_i\right)\right) J(θ)=yiloghθ(xi)+(1−yi)log(1−hθ(xi))
对于GBDT二分类来说,其单个样本的损失函数为 L ( y i , F ( x i ) ) = − [ y i l o g ( 1 1 + e − F ( x i ) ) + ( 1 − y i ) l o g ( 1 − 1 1 + e − F ( x i ) ) ] = y i l o g ( 1 + e − F ( x i ) ) − ( 1 − y i ) l o g ( e − F ( x i ) 1 + e − F ( x i ) ) = y i log ( 1 + e − F ( x i ) ) + ( 1 − y i ) [ F ( x i ) + log ( 1 + e − F ( x i ) ) ] L\left(y_i, F\left(x_i\right)\right)=-[y_ilog(\frac{1}{1+e^{-F(x_i)}})+(1-y_i)log(1-\frac{1}{1+e^{-F(x_i)}})]\\ =y_ilog(1+e^{-F(x_i)})-(1-y_i)log(\frac{e^{-F(x_i)}}{1+e^{-F(x_i)}})\\=y_i \log \left(1+e^{-F\left(x_i\right)}\right)+\left(1-y_i\right)\left[F\left(x_i\right)+\log \left(1+e^{-F\left(x_i\right)}\right)\right] L(yi,F(xi))=−[yilog(1+e−F(xi)1)+(1−yi)log(1−1+e−F(xi)1)]=yilog(1+e−F(xi))−(1−yi)log(1+e−F(xi)e−F(xi))=yilog(1+e−F(xi))+(1−yi)[F(xi)+log(1+e−F(xi))]
- step1: 初始化第一个弱分类器 F 0 ( x ) = l o g ( P ( Y = 1 ∣ x ) 1 − P ( Y = 1 ∣ x ) ) F_0(x)=log(\frac{P(Y=1|x)}{1-P(Y=1|x)}) F0(x)=log(1−P(Y=1∣x)P(Y=1∣x))
证明:
其中, P ( Y = 1 ∣ x ) P(Y=1|x) P(Y=1∣x)是训练样本中 y=1 的比例,利用先验信息来初始化学习器。
-
step2:建立M棵分类回归树
- 对于建立第m棵树时,对于样本i=1,2,…,N, 计算第m棵树对应的负梯度 r m i = − [ ∂ L ( y i , F ( x i ) ) ∂ F ( x ) ] F ( x ) = F m − 1 ( x ) = y i − 1 1 + e − F ( x i ) r_{m i}=-\left[\frac{\partial L\left(y_i, F\left(x_i\right)\right)}{\partial F(x)}\right]_{F(x)=F_{m-1}(x)}=y_i-\frac{1}{1+e^{-F\left(x_i\right)}} rmi=−[∂F(x)∂L(yi,F(xi))]F(x)=Fm−1(x)=yi−1+e−F(xi)1
证明:
-
对于i=1,2,…,N ,利用CART回归树拟合数据 ( x i , r m , i ) (x_i, r_{m,i}) (xi,rm,i) ,得到第 m 棵回归树,其对应的叶子节点区域为 R m , j R_{m,j} Rm,j,其中 j=1,2,…, J m J_m Jm ,且 J m J_m Jm 为第m棵回归树叶子节点的个数。
-
对于 J m J_m Jm 个叶子节点区域 j=1,2,…, J m J_m Jm,计算出最佳拟合值: c m , j = ∑ x i ∈ R m , j r m , i ∑ x i ∈ R m , j ( y i − r m , i ) ( 1 − y i + r m , i ) c_{m, j}=\frac{\sum_{x_i \in R_{m, j}} r_{m, i}}{\sum_{x_i \in R_{m, j}}\left(y_i-r_{m, i}\right)\left(1-y_i+r_{m, i}\right)} cm,j=∑xi∈Rm,j(yi−rm,i)(1−yi+rm,i)∑xi∈Rm,jrm,i
证明:
补充近似值代替过程(用牛顿法迭代来求解):
假设仅有一个样本: L ( y i , F ( x ) ) = − ( y i ln 1 1 + e − F ( x ) + ( 1 − y i ) ln ( 1 − 1 1 + e − F ( x ) ) ) L\left(y_i, F(x)\right)=-\left(y_i \ln \frac{1}{1+e^{-F(x)}}+\left(1-y_i\right) \ln \left(1-\frac{1}{1+e^{-F(x)}}\right)\right) L(yi,F(x))=−(yiln1+e−F(x)1+(1−yi)ln(1−1+e−F(x)1))令 P i = 1 1 + e − F ( x ) P_i=\frac{1}{1+e^{-F(x)}} Pi=1+e−F(x)1 ,则 ∂ P i ∂ F ( x ) = P i ( 1 − P i ) ( S i g m o i d 激活函数求导) = − [ y i l o g p i + ( 1 − y i ) l o g ( 1 − p i ) ) ] \frac{\partial P_i}{\partial F(x)}=P_i\left(1-P_i\right)(Sigmoid激活函数求导)=-[y_ilogp_i+(1-y_i)log(1-p_i))] ∂F(x)∂Pi=Pi(1−Pi)(Sigmoid激活函数求导)=−[yilogpi+(1−yi)log(1−pi))]
求一阶导:
∂ L ( y i , F ( x ) ) ∂ F ( x ) = ∂ L ( y i , F ( x ) ) ∂ P i ⋅ ∂ P i ∂ F ( x ) = − ( y i P i − 1 − y i 1 − P i ) ⋅ ( P i ⋅ ( 1 − P i ) ) = P i − y i \begin{aligned} \frac{\partial L\left(y_i, F(x)\right)}{\partial F(x)} & =\frac{\partial L\left(y_i, F(x)\right)}{\partial P_i} \cdot \frac{\partial P_i}{\partial F(x)} \\ & =-\left(\frac{y_i}{P_i}-\frac{1-y_i}{1-P_i}\right) \cdot\left(P_i \cdot\left(1-P_i\right)\right) \\ & =P_i-y_i \end{aligned} ∂F(x)∂L(yi,F(x))=∂Pi∂L(yi,F(x))⋅∂F(x)∂Pi=−(Piyi−1−Pi1−yi)⋅(Pi⋅(1−Pi))=Pi−yi求二阶导:
∂ 2 L ( y i , F ( x ) ) ∂ F ( x ) 2 = ( P i − y i ) ′ = P i ( 1 − P i ) \begin{aligned} \frac{\partial^2 L\left(y_i, F(x)\right)}{\partial F(x)^2} & =\left(P_i-y_i\right)^{\prime} \\ & =P_i\left(1-P_i\right) \end{aligned} ∂F(x)2∂2L(yi,F(x))=(Pi−yi)′=Pi(1−Pi)对于 L ( y i , F ( x ) + c ) L\left(y_i, F(x)+c\right) L(yi,F(x)+c) 的泰勒二阶展开式( c = a r g m i n c L ( y i , F ( x ) + c ) c=argmin_cL\left(y_i, F(x)+c\right) c=argmincL(yi,F(x)+c)):
L ( y i , F ( x ) + c ) = L ( y i , F ( x ) ) + ∂ L ( y i , F ( x ) ) ∂ F ( x ) ⋅ c + 1 2 ∂ 2 L ( y i , F ( x ) ) ∂ F ( x ) 2 c 2 L\left(y_i, F(x)+c\right)=L\left(y_i, F(x)\right)+\frac{\partial L\left(y_i, F(x)\right)}{\partial F(x)} \cdot c+\frac{1}{2} \frac{\partial^2 L\left(y_i, F(x)\right)}{\partial F(x)^2} c^2 L(yi,F(x)+c)=L(yi,F(x))+∂F(x)∂L(yi,F(x))⋅c+21∂F(x)2∂2L(yi,F(x))c2
L ( y i , F ( x ) + c ) L\left(y_i, F(x)+c\right) L(yi,F(x)+c) 取极值时,上述二阶表达式中的c为:
c = − b 2 a = − ∂ L ( y i , F ( x ) ) ∂ F ( x ) 2 ( 1 2 ∂ 2 L ( y i , F ( x ) ) ∂ F ( x ) 2 ) = − ∂ L ( y i , F ( x ) ) ∂ F ( x ) ∂ 2 L ( y i , F ( x ) ) ∂ F ( x ) 2 ) ⇒ 一阶、二阶导代入 y i − P i P i ( 1 − P i ) ⇒ r m i = y i − P i r m i ( y i − r m i ) ( 1 − y i + r m i ) \begin{aligned} c & =-\frac{b}{2 a}=-\frac{\frac{\partial L\left(y_i, F(x)\right)}{\partial F(x)}}{2\left(\frac{1}{2} \frac{\partial^2 L\left(y_i, F(x)\right)}{\partial F(x)^2}\right)} \\ & =-\frac{\frac{\partial L\left(y_i, F(x)\right)}{\partial F(x)}}{\left.\frac{\partial^2 L\left(y_i, F(x)\right)}{\partial F(x)^2}\right)} \stackrel{\text { 一阶、二阶导代入 }}{\Rightarrow} \frac{y_i-P_i}{P_i\left(1-P_i\right)} \\ & \stackrel{r_{mi}=y_i-P_i}{\Rightarrow} \frac{r_{mi}}{(y_i-r_{mi})\left(1-y_i+r_{mi}\right)} \end{aligned} c=−2ab=−2(21∂F(x)2∂2L(yi,F(x)))∂F(x)∂L(yi,F(x))=−∂F(x)2∂2L(yi,F(x)))∂F(x)∂L(yi,F(x))⇒ 一阶、二阶导代入 Pi(1−Pi)yi−Pi⇒rmi=yi−Pi(yi−rmi)(1−yi+rmi)rmi
最后再在一阶导和二阶导求解时加上 ∑ x i ∈ R m , j \sum_{x_i \in R_{m,j}} ∑xi∈Rm,j,得到上式结果 -
更新强学习器 F m ( x ) F_m(x) Fm(x) :
F m ( x ) = F m − 1 ( x ) + ∑ j = 1 J m c m , j I ( x ∈ R m , j ) F_m(x)=F_{m-1}(x)+\sum_{j=1}^{J_m} c_{m, j} I\left(x \in R_{m, j}\right) Fm(x)=Fm−1(x)+j=1∑Jmcm,jI(x∈Rm,j)
-
step3:得到最终的强学习器 F M ( x ) F_M(x) FM(x) 的表达式:
F M ( x ) = F 0 ( x ) + ∑ m = 1 M ∑ j = 1 J m c m , j I ( x ∈ R m , j ) F_M(x)=F_0(x)+\sum_{m=1}^M \sum_{j=1}^{J_m} c_{m, j} I\left(x \in R_{m, j}\right) FM(x)=F0(x)+m=1∑Mj=1∑Jmcm,jI(x∈Rm,j)
GBDT二分类算法实例
训练集如下表所示,一组数据的特征有年龄和体重,把身高大于1.5米作为分类边界,身高大于1.5米的令标签为1,身高小于等于1.5米的令标签为0,共有4组数据。
测试数据如下表所示,只有一组数据,年龄为25、体重为65,我们用在训练集上训练好的GBDT模型预测该组数据的身高是否大于1.5米?
模型训练阶段
参数设置:
- 学习率learning_rate = 0.1
- 迭代次数:n_trees = 5
- 树的深度:max_depth = 3
算法流程:
-
初始化弱学习器:
F 0 ( x ) = log P ( Y = 1 ∣ x ) 1 − P ( Y = 1 ∣ x ) = log 2 2 = 0 F_0(x)=\log \frac{P(Y=1 \mid x)}{1-P(Y=1 \mid x)}=\log \frac{2}{2}=0 F0(x)=log1−P(Y=1∣x)P(Y=1∣x)=log22=0
-
建立M棵回归树(m=1,2,…,M):
-
计算负梯度 r m , i = − [ ∂ L ( y i , F ( x i ) ) ∂ F ( x ) ] F ( x ) = F m − 1 ( x ) = y i − 1 1 + e − F ( x i ) r_{m, i}=-\left[\frac{\partial L\left(y_i, F\left(x_i\right)\right)}{\partial F(x)}\right]_{F(x)=F_{m-1}(x)}=y_i-\frac{1}{1+e^{-F\left(x_i\right)}} rm,i=−[∂F(x)∂L(yi,F(xi))]F(x)=Fm−1(x)=yi−1+e−F(xi)1
最后的计算结果如下:
此时将残差作为样本的标签来训练弱学习器 F 1 ( x ) F_1(x) F1(x),即下表数据:
-
接着寻找回归树的最佳划分节点,遍历每个特征的每个可能取值。从年龄特征值为5开始,到体重特征为70结束,分别计算分裂后两组数据的平方损失(Square Error), S S E L SSE_L SSEL为左节点的平方损失, S S E R SSE_R SSER为右节点的平方损失,找到使平方损失和$SSE_{sum}=SSE_L+SSE_R $最小的那个划分节点,即为最佳划分节点。
例如:以年龄7为划分节点,将小于7的样本划分为到左节点,大于等于7的样本划分为右节点。左节点包括 x 0 x_0 x0,右节点包括样本$x_1,x_2,x_3, SSE_L=0, SSE_R=0.667,SSE_{sum}=0.667 $,所有可能的划分情况如下表所示:
以上划分点的总平方损失最小为0.000,有两个划分点:年龄21和体重60,所以随机选一个作为划分点,这里我们选年龄21。现在我们的第一棵树长这个样子:
我们设置的参数中树的深度max_depth=3,现在树的深度只有2,需要再进行一次划分,这次划分要对左右两个节点分别进行划分,但是我们在生成树的时候,设置了三个树继续生长的条件:
- 深度没有到达最大。树的深度设置为3,意思是需要生长成3层。
- 点样本数 >= min_samples_split
- *此节点上的样本的标签值不一样(如果值一样说明已经划分得很好了,不需要再分)(本程序满足这个条件,因此树只有2层)*
最终我们的第一棵回归树长下面这个样子:
此时我们的树满足了设置,还需要做一件事情,给这棵树的每个叶子节点分别赋一个参数 c m , j c_{m,j} cm,j,来拟合残差。
c 1 , j = ∑ x i ∈ R 1 , j r 1 , i ∑ x i ∈ R 1 , j ( y i − r 1 , i ) ( 1 − y i + r 1 , i ) c_{1, j}=\frac{\sum_{x_i \in R_{1, j}} r_{1, i}}{\sum_{x_i \in R_{1, j}}\left(y_i-r_{1, i}\right)\left(1-y_i+r_{1, i}\right)} c1,j=∑xi∈R1,j(yi−r1,i)(1−yi+r1,i)∑xi∈R1,jr1,i
根据上述划分结果,为了方便表示,规定从左到右为第1,2个叶子结点,其计算值过程如下:
( x 0 , x 1 ∈ R 1 , 1 ) , c 1 , 1 = − 0.5 − 0.5 [ ( 0 − ( − 0.5 ) ) ∗ ( 1 − 0 + ( − 0.5 ) ) ] ∗ 2 = − 2.0 ( x 2 , x 3 ∈ R 1 , 2 ) , c 1 , 2 = 2.0 \begin{array}{ll}\left(x_0, x_1 \in R_{1,1}\right), & c_{1,1}=\frac{-0.5-0.5}{[(0-(-0.5))*(1-0+(-0.5))]*2}=-2.0 \\ \left(x_2, x_3 \in R_{1,2}\right), & c_{1,2}=2.0\end{array} (x0,x1∈R1,1),(x2,x3∈R1,2),c1,1=[(0−(−0.5))∗(1−0+(−0.5))]∗2−0.5−0.5=−2.0c1,2=2.0
此时的第一棵树长下面这个样子:
接着更新强学习器,需要用到学习率(这是Shrinkage的思想,如果每次都全部加上拟合值 ,即学习率为1,很容易一步学到位导致GBDT过拟合):learning_rate=0.1,用lr表示。更新公式为:
F 1 ( x ) = F 0 ( x ) + l r ∗ ∑ j = 1 2 c 1 , j I ( x ∈ R 1 , j ) F_1(x)=F_0(x)+l r * \sum_{j=1}^2 c_{1, j} I\left(x \in R_{1, j}\right) F1(x)=F0(x)+lr∗∑j=12c1,jI(x∈R1,j)
- **重复此步骤,直到m>5结束,最后生成5棵树强学习器 F 5 ( x ) = F 0 ( x ) + l r ∗ ∑ m = 1 5 ∑ j = 1 2 c m , j I ( x ∈ R m , j ) F_5(x)=F_0(x)+lr * \sum_{m=1}^5 \sum_{j=1}^2 c_{m, j} I\left(x \in R_{m, j}\right) F5(x)=F0(x)+lr∗∑m=15∑j=12cm,jI(x∈Rm,j)。
第一棵树
第二棵树
- 上一轮得到的 F 1 ( x ) = F 0 ( x ) + l r ∗ ∑ j = 1 2 c 1 , j I ( x ∈ R 1 , j ) F_1(x)=F_0(x)+l r * \sum_{j=1}^2 c_{1, j} I\left(x \in R_{1, j}\right) F1(x)=F0(x)+lr∗∑j=12c1,jI(x∈R1,j)
R 1 , 1 : F 1 ( x ) = F 0 ( x ) + 0.1 ∗ c 1 , 1 = − 0.2 R 1 , 2 : F 1 ( x ) = F 0 ( x ) + 0.1 ∗ c 1 , 2 = 0.2 R_{1,1}:F_1(x)=F_0(x)+0.1*c_{1,1}=-0.2\\R_{1,2}:F_1(x)=F_0(x)+0.1*c_{1,2}=0.2 R1,1:F1(x)=F0(x)+0.1∗c1,1=−0.2R1,2:F1(x)=F0(x)+0.1∗c1,2=0.2
- 计算负梯度 r m , i = − [ ∂ L ( y i , F ( x i ) ) ∂ F ( x ) ] F ( x ) = F 1 ( x ) = y i − 1 1 + e − F 1 ( x i ) r_{m, i}=-\left[\frac{\partial L\left(y_i, F\left(x_i\right)\right)}{\partial F(x)}\right]_{F(x)=F_{1}(x)}=y_i-\frac{1}{1+e^{-F_1\left(x_i\right)}} rm,i=−[∂F(x)∂L(yi,F(xi))]F(x)=F1(x)=yi−1+e−F1(xi)1
R 2 , 1 : r 1 , i = 0 − 1 1 + e 0.2 = − 1 1 + e 0.2 R 2 , 2 : F 1 ( x ) = 0 − 1 1 + e − 0.2 = − 1 1 + e − 0.2 R_{2,1}:r_{1, i}=0-\frac{1}{1+e^{0.2}}=-\frac{1}{1+e^{0.2}}\\R_{2,2}:F_1(x)=0-\frac{1}{1+e^{-0.2}}=-\frac{1}{1+e^{-0.2}} R2,1:r1,i=0−1+e0.21=−1+e0.21R2,2:F1(x)=0−1+e−0.21=−1+e−0.21
- 给这棵树的每个叶子节点分别赋一个参数 c m , j c_{m,j} cm,j,来拟合残差。
c 2 , j = ∑ x i ∈ R 2 , j r 1 , i ∑ x i ∈ R 2 , j ( y i − r 2 , i ) ( 1 − y i + r 2 , i ) c_{2, j}=\frac{\sum_{x_i \in R_{2, j}} r_{1, i}}{\sum_{x_i \in R_{2, j}}\left(y_i-r_{2, i}\right)\left(1-y_i+r_{2, i}\right)} c2,j=∑xi∈R2,j(yi−r2,i)(1−yi+r2,i)∑xi∈R2,jr1,i
( x 0 , x 1 ∈ R 2 , 1 ) , c 2 , 1 = − 1 1 + e − 0.2 − 1 1 + e − 0.2 [ ( 0 − ( − 1 1 + e − 0.2 ) ) ∗ ( 1 − 0 + ( − 1 1 + e − 0.2 ) ) ] ∗ 2 = 1 1 1 + e 2 − 1 = − 1.8187 ( x 2 , x 3 ∈ R 2 , 2 ) , c 2 , 2 = 1.8187 \begin{array}{ll}\left(x_0, x_1 \in R_{2,1}\right), & c_{2,1}=\frac{-\frac{1}{1+e^{-0.2}}-\frac{1}{1+e^{-0.2}}}{[(0-(-\frac{1}{1+e^{-0.2}}))*(1-0+(-\frac{1}{1+e^{-0.2}}))]*2}=\frac{1}{\frac{1}{1+e^2}-1}=-1.8187 \\ \left(x_2, x_3 \in R_{2,2}\right), & c_{2,2}=1.8187\end{array} (x0,x1∈R2,1),(x2,x3∈R2,2),c2,1=[(0−(−1+e−0.21))∗(1−0+(−1+e−0.21))]∗2−1+e−0.21−1+e−0.21=1+e21−11=−1.8187c2,2=1.8187
第三棵树
第四棵树
第五棵树
- 模型预测阶段
- F 0 ( x ) = 0 F_0(x)=0 F0(x)=0
- 在 F 1 ( x ) F_1(x) F1(x)中,测试样本的年龄为25,大于划分节点21岁,所以被预测为2.0000。
- 在 F 2 ( x ) F_2(x) F2(x) 中,测试样本的年龄为25,大于划分节点21岁,所以被预测为1.8187。
- 在 F 3 ( x ) F_3(x) F3(x)中,测试样本的年龄为25,大于划分节点21岁,所以被预测为1.6826。
- 在 F 4 ( x ) F_4(x) F4(x) 中,测试样本的年龄为25,大于划分节点21岁,所以被预测为1.5769。
- 在 F 5 ( x ) F_5(x) F5(x) 中,测试样本的年龄为25,大于划分节点21岁,所以被预测为1.4927。
- 最终预测结果为: F ( x ) = 0.0000 + 0.1 ∗ ( 2.0000 + 1.8187 + 1.6826 + 1.5769 + 1.4927 ) = 0.8571 P ( Y = 1 ∣ x ) = 1 1 + e − F ( x ) = 1 1 + e − 0.8571 = 0.7021 \begin{aligned} & F(x)=0.0000+0.1 *(2.0000+1.8187+1.6826+1.5769+1.4927)=0.8571 \\ & P(Y=1 \mid x)=\frac{1}{1+e^{-F(x)}}=\frac{1}{1+e^{-0.8571}}=0.7021\end{aligned} F(x)=0.0000+0.1∗(2.0000+1.8187+1.6826+1.5769+1.4927)=0.8571P(Y=1∣x)=1+e−F(x)1=1+e−0.85711=0.7021
GBDT多分类
softmax损失函数
当使用逻辑回归处理多标签的分类问题时,如果一个样本只对应于一个标签,我们可以假设每个样本属于不同标签的概率服从于几何分布,使用多项逻辑回归(Softmax Regression)来进行分类:
P
(
Y
=
y
i
∣
x
)
=
h
θ
(
x
)
[
P
(
Y
=
1
∣
x
;
θ
)
P
(
Y
=
2
∣
x
;
θ
)
⋅
⋅
⋅
P
(
Y
=
k
∣
x
;
θ
)
]
=
1
∑
j
=
1
k
e
θ
j
T
x
[
e
θ
1
T
x
e
θ
2
T
x
⋅
⋅
⋅
e
θ
k
T
x
]
\begin{aligned} P\left(Y=y_i \mid x\right)=h_\theta(x)\left[\begin{array}{c} P(Y=1 \mid x ; \theta) \\ P(Y=2 \mid x ; \theta) \\ \cdot \\ \cdot \\ \cdot \\ P(Y=k \mid x ; \theta) \end{array}\right] \\ =\frac{1}{\sum_{j=1}^k e^{\theta_j^T x}}\left[\begin{array}{c} e^{\theta_1^T x} \\ e^{\theta_2^T x} \\ \cdot \\ \cdot \\ \cdot \\ e^{\theta_k^T x} \end{array}\right] \end{aligned}
P(Y=yi∣x)=hθ(x)
P(Y=1∣x;θ)P(Y=2∣x;θ)⋅⋅⋅P(Y=k∣x;θ)
=∑j=1keθjTx1
eθ1Txeθ2Tx⋅⋅⋅eθkTx
其中,
θ
1
,
θ
2
,
…
,
θ
k
∈
R
n
\theta_1, \theta_2, \ldots, \theta_k \in \mathfrak{R}^n
θ1,θ2,…,θk∈Rn 为模型的参数,而
1
∑
j
=
1
k
e
θ
j
T
x
\frac{1}{\sum_{j=1}^k e^{\theta_j^T x}}
∑j=1keθjTx1 可以看作是对概率的归一化。一般来说,多项逻辑回归具有参数冗余的特点,即将
θ
1
,
θ
2
,
…
,
θ
k
\theta_1, \theta_2, \ldots, \theta_k
θ1,θ2,…,θk 同时加减一个向量后预测结果不变,因为
P
(
Y
=
1
∣
x
)
+
P
(
Y
=
2
∣
x
)
+
…
+
P
(
Y
=
k
∣
x
)
=
1
P(Y=1 \mid x)+P(Y=2 \mid x)+\ldots+P(Y=k \mid x)=1
P(Y=1∣x)+P(Y=2∣x)+…+P(Y=k∣x)=1 ,所以
P
(
Y
=
1
∣
x
)
=
1
−
P
(
Y
=
2
∣
x
)
−
…
−
P
(
Y
=
k
∣
x
)
P(Y=1 \mid x)=1-P(Y=2 \mid x)-\ldots-P(Y=k \mid x)
P(Y=1∣x)=1−P(Y=2∣x)−…−P(Y=k∣x) 。
假设从参数向量 θ j T \theta_j^T θjT 中减去向量 ψ \psi ψ ,这时每一个 θ j T \theta_j^T θjT 都变成了 θ j T − ψ ( j = 1 , 2 , … , k ) \theta_j^T-\psi(j=1,2, \ldots, k) θjT−ψ(j=1,2,…,k) 。此时假设函数变成了以下公式:
P ( Y = y j ∣ x ; θ ) = e θ j T x ∑ i = 1 k e θ i T x = e ( θ j T − ψ ) x ∑ i = 1 k e ( θ i T − ψ ) x = e θ j T x × e − ψ x ∑ i = 1 k e θ i T x × e − ψ x = e θ j T x ∑ i = 1 k e θ i T x \begin{aligned} P\left(Y=y_j \mid x ; \theta\right) & =\frac{e^{\theta_j^T x}}{\sum_{i=1}^k e^{\theta_i^T x}} \\ & =\frac{e^{\left(\theta_j^T-\psi\right) x}}{\sum_{i=1}^k e^{\left(\theta_i^T-\psi\right) x}} \\ & =\frac{e^{\theta_j^T x} \times e^{-\psi x}}{\sum_{i=1}^k e^{\theta_i^T x} \times e^{-\psi x}} \\ & =\frac{e^{\theta_j^T x}}{\sum_{i=1}^k e^{\theta_i^T x}}\end{aligned} P(Y=yj∣x;θ)=∑i=1keθiTxeθjTx=∑i=1ke(θiT−ψ)xe(θjT−ψ)x=∑i=1keθiTx×e−ψxeθjTx×e−ψx=∑i=1keθiTxeθjTx
从上式可以看出,从
θ
j
T
\theta_j^T
θjT 中减去
ψ
\psi
ψ 完全不影响假设函数的预测结果,这表明前面的Softmax回归模型中存在冗余的参数。特别地,当类别数为 2 时,
h
θ
(
x
)
=
1
e
θ
1
T
x
+
e
θ
2
T
x
[
e
θ
1
T
x
e
θ
2
T
x
]
h_\theta(x)=\frac{1}{e^{\theta_1^T x}+e^{\theta_2^T x}}\left[\begin{array}{l} e^{\theta_1^T x} \\ e^{\theta_2^T x} \end{array}\right]
hθ(x)=eθ1Tx+eθ2Tx1[eθ1Txeθ2Tx]
利用参数冗余的特点,我们将所有的参数减去
θ
1
\theta_1
θ1 ,上式变为:
h
θ
(
x
)
=
1
e
0
⋅
x
+
e
(
θ
2
T
−
θ
1
T
)
x
[
e
0
⋅
x
e
(
θ
2
T
−
θ
1
T
)
x
]
=
[
1
1
+
e
θ
T
x
1
−
1
1
+
e
θ
T
x
]
\begin{aligned} h_\theta(x) & =\frac{1}{e^{0 \cdot x}+e^{\left(\theta_2^T-\theta_1^T\right) x}}\left[\begin{array}{c} e^{0 \cdot x} \\ e^{\left(\theta_2^T-\theta_1^T\right) x} \end{array}\right] \\ & =\left[\begin{array}{c} \frac{1}{1+e^{\theta^T x}} \\ 1-\frac{1}{1+e^{\theta^T x}} \end{array}\right] \end{aligned}
hθ(x)=e0⋅x+e(θ2T−θ1T)x1[e0⋅xe(θ2T−θ1T)x]=[1+eθTx11−1+eθTx1]
其中 θ = θ 2 − θ 1 \theta=\theta_2-\theta_1 θ=θ2−θ1 。而整理后的式子与逻辑回归一致。因此,多项逻辑回归实际上是二分类逻辑回归在多标签分类下的一种拓展。
当存在样本可能属于多个标签的情况时,我们可以训练 k k k 个二分类的逻辑回归分类器。第 i i i 个分类器用以区分每个样本是否可以归为第 i i i 类,训练该分类器时,需要把标签重新整理为 “第 i i i 类标签” 与 “非第 i i i 类标签” 两类。通过这样的办法,我们就解决了每个样本可能拥有多个标签的情况。
在二分类的逻辑回归中,对输入样本
x
x
x 分类结果为类别1和 0 的概率可以写成下列形式:
P
(
Y
=
y
∣
x
;
θ
)
=
(
h
θ
(
x
)
)
y
(
1
−
h
θ
(
x
)
)
1
−
y
P(Y=y \mid x ; \theta)=\left(h_\theta(x)\right)^y\left(1-h_\theta(x)\right)^{1-y}
P(Y=y∣x;θ)=(hθ(x))y(1−hθ(x))1−y
其中, h θ ( x ) = 1 1 + e − θ T x h_\theta(x)=\frac{1}{1+e^{-\theta^T x}} hθ(x)=1+e−θTx1 是模型预测的概率值, y y y 是样本对应的类标签。
将问题泛化为更一般的多分类情况:
P
(
Y
=
y
i
∣
x
;
θ
)
=
∏
i
=
1
K
P
(
y
i
∣
x
)
y
i
=
∏
i
=
1
K
h
θ
(
x
)
y
i
P\left(Y=y_i \mid x ; \theta\right)=\prod_{i=1}^K P\left(y_i \mid x\right)^{y_i}=\prod_{i=1}^K h_\theta(x)^{y_i}
P(Y=yi∣x;θ)=i=1∏KP(yi∣x)yi=i=1∏Khθ(x)yi
由于连乘可能导致最终结果接近 0 的问题,一般对似然函数取对数的负数,变成最小化对数似然函数。
−
log
P
(
Y
=
y
i
∣
x
;
θ
)
=
−
log
∏
i
=
1
K
P
(
y
i
∣
x
)
y
i
=
−
∑
i
=
1
K
y
i
log
(
h
θ
(
x
)
)
-\log P\left(Y=y_i \mid x ; \theta\right)=-\log \prod_{i=1}^K P\left(y_i \mid x\right)^{y_i}=-\sum_{i=1}^K y_i \log \left(h_\theta(x)\right)
−logP(Y=yi∣x;θ)=−logi=1∏KP(yi∣x)yi=−i=1∑Kyilog(hθ(x))
GBDT多分类原理
将GBDT应用于二分类问题需要考虑逻辑回归模型,同理,对于GBDT多分类问题则需要考虑以下 Softmax模型:
P
(
y
=
1
∣
x
)
=
e
F
1
(
x
)
∑
i
=
1
k
e
F
i
(
x
)
P
(
y
=
2
∣
x
)
=
e
F
2
(
x
)
∑
i
=
1
k
e
F
i
(
x
)
…
⋯
P
(
y
=
k
∣
x
)
=
e
F
k
(
x
)
∑
i
=
1
k
e
F
i
(
x
)
\begin{gathered} P(y=1 \mid x)=\frac{e^{F_1(x)}}{\sum_{i=1}^k e^{F_i(x)}} \\ P(y=2 \mid x)=\frac{e^{F_2(x)}}{\sum_{i=1}^k e^{F_i(x)}} \\ \ldots \\ \cdots \\ P(y=k \mid x)=\frac{e^{F_k(x)}}{\sum_{i=1}^k e^{F_i(x)}} \end{gathered}
P(y=1∣x)=∑i=1keFi(x)eF1(x)P(y=2∣x)=∑i=1keFi(x)eF2(x)…⋯P(y=k∣x)=∑i=1keFi(x)eFk(x)
其中
F
1
…
F
k
F_1 \ldots F_k
F1…Fk 是
k
k
k 个不同的CART回归树集成。每一轮的训练实际上是训练了
k
k
k 棵树去拟合 softmax的每一个分支模型的负梯度。softmax模型的单样本损失函数为:
loss
=
−
∑
i
=
1
k
y
i
log
P
(
y
i
∣
x
)
=
−
∑
i
=
1
k
y
i
log
e
F
i
(
x
)
∑
j
=
1
k
e
F
j
(
x
)
\text { loss }=-\sum_{i=1}^k y_i \log P\left(y_i \mid x\right)=-\sum_{i=1}^k y_i \log \frac{e^{F_i(x)}}{\sum_{j=1}^k e^{F_j(x)}}
loss =−i=1∑kyilogP(yi∣x)=−i=1∑kyilog∑j=1keFj(x)eFi(x)
伪代码
对于训练过程的解释:
第一步我们在训练的时候,是针对样本 x x x 每个可能的类都训练一个分类回归树。举例说明,目前样本有三类,也就是 K = 3 K=3 K=3 ,样本 x x x 属于第二类。那么针对该样本的分类标签,其实可以用一个三维向量 [ 0 , 1 , 0 ] [0,1,0] [0,1,0] 来表示。 0 表示样本不属于该类, 1 表示样本属于该类。由于样本已经属于第二类了,所以第二类对应的向量维度为 1 ,其它位置为 0 。
针对样本有三类的情况,我们实质上在每轮训练的时候是同时训练三颗树。第一颗树针对样本
x
x
x的第一类,输入为
(
x
,
0
)
(x, 0)
(x,0) 。第二颗树输入针对样本
x
x
x 的第二类,输入为
(
x
,
1
)
(x, 1)
(x,1) 。第三颗树针对样本
x
x
x 的第三类,输入为
(
x
,
0
)
(x, 0)
(x,0) 。这里每颗树的训练过程其实就CART树的生成过程。在此我们参照CART生成树的步骤即可解出三颗树,以及三颗树对
x
x
x 类别的预测值
F
1
(
x
)
,
F
2
(
x
)
,
F
3
(
x
)
F_1(x), F_2(x), F_3(x)
F1(x),F2(x),F3(x) ,那么在此类训练中,我们仿照多分类的逻辑回归,使用Softmax 来产生概率,则属于类别 1 的概率为:
p
1
(
x
)
=
exp
(
F
1
(
x
)
)
∑
k
=
1
3
exp
(
F
k
(
x
)
)
p_1(x)=\frac{\exp \left(F_1(x)\right)}{\sum_{k=1}^3 \exp \left(F_k(x)\right)}
p1(x)=∑k=13exp(Fk(x))exp(F1(x))
并且我们可以针对类别 1 求出残差 y ~ 1 = 0 − p 1 ( x ) \tilde{y}_1=0-p_1(x) y~1=0−p1(x) ;类别 2 求出残差 y ~ 2 = 1 − p 2 ( x ) \tilde{y}_2=1-p_2(x) y~2=1−p2(x) ;类别 3 求出残差 y ~ 3 = 0 − p 3 ( x ) \tilde{y}_3=0-p_3(x) y~3=0−p3(x) 。
然后开始第二轮训练,针对第一类输入为 ( x , y ~ 1 ) \left(x, \tilde{y}_1\right) (x,y~1) ,针对第二类输入为 ( x , y ~ 2 ) \left(x, \tilde{y}_2\right) (x,y~2) ,针对第三类输入为 ( x , y ~ 3 ) \left(x, \tilde{y}_3\right) (x,y~3) 。继续训练出三颗树。一直迭代M轮。每轮构建 3 颗树。
当 K=3 时,我们其实应该有三个式子:
F
1
M
(
x
)
=
∑
m
=
1
M
c
1
m
I
(
x
ϵ
R
1
m
)
F
2
M
(
x
)
=
∑
m
=
1
M
c
2
m
I
(
x
ϵ
R
2
m
)
F
3
M
(
x
)
=
∑
m
=
1
M
c
3
m
I
(
x
ϵ
R
3
m
)
\begin{aligned} & F_{1 M}(x)=\sum_{m=1}^M c_{1 m} I\left(x \epsilon R_{1 m}\right) \\ & F_{2 M}(x)=\sum_{m=1}^M c_{2 m} I\left(x \epsilon R_{2 m}\right) \\ & F_{3 M}(x)=\sum_{m=1}^M c_{3 m} I\left(x \epsilon R_{3 m}\right) \end{aligned}
F1M(x)=m=1∑Mc1mI(xϵR1m)F2M(x)=m=1∑Mc2mI(xϵR2m)F3M(x)=m=1∑Mc3mI(xϵR3m)
当训练完以后,对于新样本 ,我们要预测该样本类别的时候,便可以有这三个式子产生三个值
F
1
M
,
F
2
M
,
F
3
M
F_{1M},F_{2M},F_{3M}
F1M,F2M,F3M。样本属于某个类别的概率为:
p
i
(
x
)
=
exp
(
F
i
M
(
x
)
)
∑
k
=
1
3
exp
(
F
k
M
(
x
)
)
p_i(x)=\frac{\exp \left(F_{i M}(x)\right)}{\sum_{k=1}^3 \exp \left(F_{k M}(x)\right)}
pi(x)=∑k=13exp(FkM(x))exp(FiM(x))
推导 y ~ i k \tilde{y}_{ik} y~ik
推导 γ j k m \gamma_{jkm} γjkm
)
注意:权重的 k − 1 k \frac{k-1}{k} kk−1我还是没有证出来,有大佬回证的可以在评论区说一下哈
GBDT多分类实例
- 数据集
x i 6 12 14 18 20 65 31 40 1 2 100 101 65 54 y i 0 0 0 0 0 1 1 1 1 1 2 2 2 2 \begin{array}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|} \hline x_i & 6 & 12 & 14 & 18 & 20 & 65 & 31 & 40 & 1 & 2 & 100 & 101 & 65 & 54 \\ \hline y_i & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 2 & 2 & 2 & 2 \\ \hline \end{array} xiyi60120140180200651311401112110021012652542
-
模型训练阶段
-
首先,由于我们需要转化3个二分类的问题,所以需要先做一步one-hot:
x i 6 12 14 18 20 65 31 40 1 2 100 101 65 54 y i 0 0 0 0 0 1 1 1 1 1 2 2 2 2 y i , 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 y i , 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 y i , 2 0 0 0 0 0 0 0 0 0 0 0 1 1 1 \begin{array}{|c|c|c|c|c|c|c|c|c|c|c|c|c|c|c|} \hline x_i & 6 & 12 & 14 & 18 & 20 & 65 & 31 & 40 & 1 & 2 & 100 & 101 & 65 & 54 \\ \hline y_i & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 2 & 2 & 2 & 2 \\ \hline y_{i, 0} & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ \hline y_{i, 1} & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 & 0 \\ \hline y_{i, 2} & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 & 1 & 1 \\ \hline \end{array} xiyiyi,0yi,1yi,260100120100140100180100200100651010311010401010110102101010020001012001652001542001参数设置:
学习率:learning_rate = 1
树的深度:max_depth = 2
迭代次数:n_trees = 5-
先对所有的样本,进行初始化 F k 0 ( x i ) = c o u n t ( k ) c o u n t ( n ) F_{k0}(x_i)=\frac{count(k)}{count(n)} Fk0(xi)=count(n)count(k),就是各类别在总样本集中的占比,结果如下表。
-
对第一个类别 ( y i y_i yi=0) 拟合第一颗树 m=1)
-
利用公式 p k , m ( x ) = e F k , m ( x ) ∑ l = 1 K e F l , m ( x ) p_{k, m}(x)=\frac{e^{F_{k, m}(x)}}{\sum_{l=1}^K e^{F_{l, m}(x)}} pk,m(x)=∑l=1KeFl,m(x)eFk,m(x) 计算概率。
-
计算负梯度值,以 x 1 x_1 x1 为例 (k=0,i=1) :
y ~ i k = y i , k − p k , m − 1 y ~ 10 = y 1 , 0 − p 0 , 0 = 1 − e F 0 , 0 ( x 1 ) e F 0 , 0 ( x 1 ) + e F 1 , 0 ( x 1 ) + e F 2 , 0 ( x 1 ) ≈ 0.6588 \begin{aligned} & \tilde{y}_{i k}=y_{i, k}-p_{k, m-1} \\ & \tilde{y}_{10}=y_{1,0}-p_{0,0}=1-\frac{e^{F_{0,0}(x_1)}}{e^{F_{0,0}(x_1)}+e^{F_{1,0}(x_1)}+e^{F_{2,0}(x_1)}}\approx0.6588\end{aligned} y~ik=yi,k−pk,m−1y~10=y1,0−p0,0=1−eF0,0(x1)+eF1,0(x1)+eF2,0(x1)eF0,0(x1)≈0.6588
同样地,计算其它样本可以有下表:
-
寻找回归树的最佳划分节点。在GBDT的建树中,可以采用如MSE、MAE等作为分裂准则来确定分裂点。本文采用的分裂准则是MSE,具体计算过程如下。遍历所有特征的取值,将每个特征值依次作为分裂点,然后计算左子结点与右子结点上的MSE,寻找两者加和最小的一个.
比如,选择 x 8 = 1 x_8=1 x8=1 作为分裂点时 ( x < 1 ) (x<1) (x<1) 。
左子结点上的集合的MSE为:
M S E l e f t = 0 M S E_{l e f t}=0 MSEleft=0右子节点上的集合的MSE为:
M S E right = ( 0.6588 − 0.04342 ) 2 + … + ( − 0.3412 − 0.04342 ) 2 = 3.2142 \begin{aligned} M S E_{\text {right }} & =(0.6588-0.04342)^2+\ldots+(-0.3412-0.04342)^2 \\ & =3.2142 \end{aligned} MSEright =(0.6588−0.04342)2+…+(−0.3412−0.04342)2=3.2142对所有特征计算完后可以发现,当选择 x 6 = 31 x_6=31 x6=31 做为分裂点时,可以得到最小的MSE, M S E = 1.42857 M S E=1.42857 MSE=1.42857 。
-
对 x 6 = 31 x_6=31 x6=31 拟合第一棵回归树
-
给这棵树的每个叶子节点分别赋一个参数 γ j k m \gamma_{jkm} γjkm,来拟合残差。
γ 101 = 0.6588 ∗ 5 + ( − 0.3412 ) ∗ 2 0.6588 ∗ ( 1 − 0.6588 ) ∗ 5 + 0.3412 ∗ ( 1 − 0.3412 ) ∗ 2 ∗ 2 3 ≈ 1.1066 \gamma_{101}=\frac{0.6588*5+(-0.3412)*2}{0.6588*(1-0.6588)*5+0.3412*(1-0.3412)*2}*\frac{2}{3}\approx1.1066 γ101=0.6588∗(1−0.6588)∗5+0.3412∗(1−0.3412)∗20.6588∗5+(−0.3412)∗2∗32≈1.1066
γ 201 = − 1.0119 \gamma_{201}=-1.0119 γ201=−1.0119
最后,更新 F k m ( x i ) F_{k m}\left(x_i\right) Fkm(xi) 可得下表:
F k m ( x i ) = F k , m − 1 ( x i ) + η ∗ ∑ x i ∈ R j k m γ j k m ∗ I ( x i ∈ R j k m ) F_{k m}\left(x_i\right)=F_{k, m-1}\left(x_i\right)+\eta * \sum_{x_i \in R_{j k m}} \gamma_{j k m} * I\left(x_i \in R_{j k m}\right) Fkm(xi)=Fk,m−1(xi)+η∗xi∈Rjkm∑γjkm∗I(xi∈Rjkm)x ( i ) x_(i) x(i) 6 12 14 18 20 65 31 40 1 2 100 101 65 54 F 0 , 1 ( x i ) F_{0,1}(x_i) F0,1(xi) 1.4638 1.4638 1.4638 1.4638 1.4638 -0.6548 -0.6548 -0.6548 1.4638 1.4638 -0.6548 -0.6548 -0.6548 -0.6548 至此第一个类别 (类别0) 的第一颗树拟合完毕,下面开始拟合第二个类别(类别 1 ) 的第一棵树,按照上述过程建立其他两个类别。反复进行,直到训练了M轮。
-
GBDT与AdaBoost的不同
- 弱评估器
GBDT的弱评估器输出类型不再与整体集成算法输出类型一致。对于AdaBoost或随机森林算法来说,当集成算法执行的是回归任务时,弱评估器也是回归器,当集成算法执行分类任务时,弱评估器也是分类器。但对于GBDT而言,无论GBDT整体在执行回归/分类/排序任务,弱评估器一定是回归器。GBDT通过sigmoid或softmax函数输出具体的分类结果,但实际弱评估器一定是回归器。
- 损失函数𝐿(𝑥,𝑦)
在GBDT当中,损失函数范围不再局限于固定或单一的某个损失函数,而从数学原理上推广到了任意可微的函数。因此GBDT算法中可选的损失函数非常多,GBDT实际计算的数学过程也与损失函数的表达式无关。
- 拟合残差
GBDT依然自适应调整弱评估器的构建,但却不像AdaBoost一样通过调整数据分布来间接影响后续弱评估器。相对的,GBDT通过修改后续弱评估器的拟合目标来直接影响后续弱评估器的结构。
具体地来说,在AdaBoost当中,每次建立弱评估器之前需要修改样本权重,且用于建立弱评估器的是样本𝑋以及对应的𝑦,在GBDT当中,我们不修改样本权重,但每次用于建立弱评估器的是样本𝑋以及当下集成输出𝐻(𝑥𝑖)与真实标签𝑦的差异(𝑦−𝐻(𝑥𝑖)))。这个差异在数学上被称之为残差(Residual),因此GBDT不修改样本权重,而是通过拟合残差来影响后续弱评估器结构。
- 抽样思想
GBDT加入了随机森林中随机抽样的思想,在每次建树之前,允许对样本和特征进行抽样来增大弱评估器之间的独立性(也因此可以有袋外数据集)。虽然Boosting算法不会大规模地依赖于类似于Bagging的方式来降低方差,但由于Boosting算法的输出结果是弱评估器结果的加权求和,因此Boosting原则上也可以获得由“平均”带来的小方差红利。当弱评估器表现不太稳定时,采用与随机森林相似的方式可以进一步增加Boosting算法的稳定性。
对于AdaBoost或随机森林算法来说,当集成算法执行的是回归任务时,弱评估器也是回归器,当集成算法执行分类任务时,弱评估器也是分类器*。但对于GBDT而言,无论GBDT整体在执行回归/分类/排序任务,弱评估器一定是回归器。GBDT通过sigmoid或softmax函数输出具体的分类结果,但实际弱评估器一定是回归器。
- 损失函数𝐿(𝑥,𝑦)
在GBDT当中,损失函数范围不再局限于固定或单一的某个损失函数,而从数学原理上推广到了任意可微的函数。因此GBDT算法中可选的损失函数非常多,GBDT实际计算的数学过程也与损失函数的表达式无关。
- 拟合残差
GBDT依然自适应调整弱评估器的构建,但却不像AdaBoost一样通过调整数据分布来间接影响后续弱评估器。相对的,GBDT通过修改后续弱评估器的拟合目标来直接影响后续弱评估器的结构。
具体地来说,在AdaBoost当中,每次建立弱评估器之前需要修改样本权重,且用于建立弱评估器的是样本𝑋以及对应的𝑦,在GBDT当中,我们不修改样本权重,但每次用于建立弱评估器的是样本𝑋以及当下集成输出𝐻(𝑥𝑖)与真实标签𝑦的差异(𝑦−𝐻(𝑥𝑖)))。这个差异在数学上被称之为残差(Residual),因此GBDT不修改样本权重,而是通过拟合残差来影响后续弱评估器结构。
- 抽样思想
GBDT加入了随机森林中随机抽样的思想,在每次建树之前,允许对样本和特征进行抽样来增大弱评估器之间的独立性(也因此可以有袋外数据集)。虽然Boosting算法不会大规模地依赖于类似于Bagging的方式来降低方差,但由于Boosting算法的输出结果是弱评估器结果的加权求和,因此Boosting原则上也可以获得由“平均”带来的小方差红利。当弱评估器表现不太稳定时,采用与随机森林相似的方式可以进一步增加Boosting算法的稳定性。