GBDT之二分类算法

1、GBDT二分类算法简介

GBDT,全称Gradient Boosting Decision Tree,梯度提升决策树。该算法于1999年由Friedman最早提出。

GBDT算法的基本思路是通过对负梯度的不断拟合,实现学习器的更新,得到最终的强学习器。

GBDT算法支持回归算法和分类算法,其分类算法支持二分类和多分类。本文介绍其中的二分类算法。对于二分类算法,得到最终的强学习器后,将其转化为正样本事件发生的概率。

2、关于损失函数

在GBDT二分类算法中,需要选择适当的损失函数以满足负梯度的计算与拟合。一般可选择指数损失函数和经改造的对数损失函数。这里使用经改造的对数损失函数。

f(x)表示预测值,构造损失函数:

L(y,f(x))=-y\ln p-(1-y)\ln(1-p),其中p=\frac{1}{1+e^{-f(x)}},可见0<p<1,对比逻辑回归函数可以发现,p为正样本事件发生的概率。

对损失函数进行变化:

L(y,f(x))=-y\ln p-(1-y)\ln(1-p)=-y\ln \frac{1}{1+e^{-f(x)}}-(1-y)\ln(1-\frac{1}{ 1+e^{-f(x)}})

=y\ln (1+e^{-f(x)})-(1-y)\ln \frac{e^{-f(x)}}{1+e^{-f(x)}}=y\ln (1+e^{-f(x)})-(1-y)(-f(x)-ln(1+e^{-f(x)}))=y\ln (1+e^{-f(x)})+(1-y)f(x)+(1-y)ln(1+e^{-f(x)})=y\ln (1+e^{-f(x)})+f(x)-yf(x)+ln(1+e^{-f(x)})-yln(1+e^{-f(x)})=f(x)-yf(x)+ln(1+e^{-f(x)})=f(x)-yf(x)+ln(1+e^{f(x)})-f(x)=-yf(x)+ln(1+e^{f(x)})

损失函数关于f(x)的一阶、二阶导数分别为:

{L}'=-y+\frac{1}{1+e^{-f(x)}}=-y+p

{L}''=-(1+e^{-f(x)})^{-2}*e^{-f(x)}*(-1)=\frac{e^{-f(x)}}{(1+e^{-f(x)})^{2}}=(\frac{1}{p}-1)p^{2}=p(1-p),由于0<p<1,故{L}''>0

故当{L}'=0时,损失函数取得极小值。

3、GBDT二分类算法过程

3.1 输入输出

1)输入

训练样本集:D=\left \{ (x_{1},y_{1}),(x_{2},y_{2}),...,(x_{N},y_{N}) \right \},其中y_{i}\in \left \{ 0,1 \right \},i=1,2,...,N

2)输出

最终决策树f(x),并可将其转化为正样本事件发生概率p(x)=\frac{1}{1+e^{-f(x)}},以及据此进行样本分类。

3.2 算法过程

3.2.1 模型初始化

初始化的弱学习器为:f_{0}(x)=c=ln\frac{\sum_{i=1}^{N}y_{i}}{\sum_{i=1}^{N}(1-y_{i})}

关于f_{0}(x)的推导过程如下:

代价函数cost(c)=\sum_{i=0}^{N}L(y_{i},c)=\sum_{i=0}^{N}(-y_{i}c+ln(1+e^{c}))

c=\underset{c}{arg \min }cost(c)=\underset{c}{arg \min }\sum_{i=0}^{N}(-y_{i}c+ln(1+e^{c}))

\frac{\partial cost(c)}{\partial c}=0时,cost(c)取得极小值,即

-\sum_{i=1}^{N}y_{i}+\sum_{i=1}^{N}\frac{1}{1+e^{-c}}=0\Rightarrow-\sum_{i=1}^{N}y_{i}+\frac{N}{1+e^{-c}}=0\Rightarrow c=ln\frac{\sum_{i=1}^{N}y_{i}}{\sum_{i=1}^{N}(1-y_{i})}

这里,初始化弱学习器的选择会对迭代效率产生影响。

3.2.2 进行迭代

对于t=1,2,...,T轮迭代:

1)计算负梯度

由前面的推导可以,在f(x)=f_{t-1}(x)时,其负梯度为

-\left [ \frac{\partial L(y,f(x))}{\partial f(x)}\right ]_{f(x)=f_{t-1}(x)}=-{L}'_{f(x)=f_{t-1}(x)}=y-\frac{1}{1+e^{-f_{t-1}(x)}}

p_{i}=\frac{1}{1+e^{-f_{t-1}(x_{i})}}

负梯度的取值r_{t,i}=y_{i}-\frac{1}{1+e^{-f_{t-1}(x_{i})}}=y_{i}-p_{i},i=1,2,...,N

2)利用负梯度生成回归树

利用负梯度构建新的数据集D=\left \{ (x_{1},r_{t,1}),(x_{2},r_{t,2}),...,(x_{N},r_{t,N}) \right \}

利用新数据集生成回归树,在CART回归算法下,得到本轮的回归树h_{t}(x)=\sum_{m=1}^{M_{t}}\gamma _{t,m}I(x\in R_{t,m})

该回归树对应的叶子节点划分出的区域为R_{t,1},R_{t,2},...,R_{t,M_{t}}

对于叶子区域R_{t,m},其拟合值记为\gamma _{t,m}= \underset{\gamma }{\arg \min }\sum_{x_{i}\in R_{t,M_{t}}}^{}L(y_{i},f_{t-1}(x_{i})+\gamma ),其中m=1,2,..,M_{t}

根据损失函数的构造,可以看出拟合值无公式解。为得到拟合值,可考虑通过泰勒展开求解近似值,求得\gamma _{t,m}=\frac{\sum_{x_{i}\in R_{t,m}}^{}r_{t,i}}{\sum_{x_{i}\in R_{t,m}}(y_{i}-r_{t,i})(1-y_{i}+r_{t,i})}

以下为推导\gamma _{t,m}取值的过程。

在第t轮迭代时,f_{t}(x)=f_{t-1}(x)+h_{t}(x)

将其代入损失函数的泰勒展开式,

L(y,f_{t}(x))=L(y,f_{t-1}(x)+h_{t}(x))\approx L(y,f_{t-1}(x))+\frac{\partial L(y,f(x))}{\partial f(x)}|_{f(x)=f_{t-1}(x)}h_{t}(x)+\frac{\partial^2 L(y,f(x))}{2\partial f^2(x)}|_{f(x)=f_{t-1}(x)}h_{t}^{2}(x)

在叶子区域R_{t,m}将拟合值\gamma _{t,m}代入代价函数

\sum_{x_{i}\in R_{t,m}}^{}L(y_{i},f_{t}(x_{i}))=\sum_{x_{i}\in R_{t,m}}^{}L(y_{i},f_{t-1}(x_{i})+h_{t}(x_{i}))=\sum_{x_{i}\in R_{t,m}}^{}L(y_{i},f_{t-1}(x_{i})+\gamma _{t,m})

\approx \sum_{x_{i}\in R_{t,m}}^{}L(y_{i},f_{t-1}(x_{i}))+\sum_{x_{i}\in R_{t,m}}^{}\frac{\partial L(y_{i},f(x_{i}))}{\partial f(x_{i})}|_{f(x_{i})=f_{t-1}(x_{i})} \gamma _{t,m}+\sum_{x_{i}\in R_{t,m}}^{}\frac{\partial^2 L(y_{i},f(x_{i}))}{2\partial f^2(x_{i})}|_{f(x_{i})=f_{t-1}(x_{i})}\gamma _{t,m}^{2}

=\sum_{x_{i}\in R_{t,m}}^{}L(y_{i},f_{t-1}(x_{i}))+\sum_{x_{i}\in R_{t,m}}^{}{L}'|_{f(x_{i})=f_{t-1}(x_{i})} \gamma _{t,m}+\frac{1}{2}\sum_{x_{i}\in R_{t,m}}^{}{L}''\gamma _{t,m}^{2}

可以看出,上式是关于\gamma _{t,m}的一元二次函数,且其二次项的系数为正,存在极小值,其极小值取在对称轴的位置。

此时,\gamma _{t,m}=-\frac{\sum_{x_{i}\in R_{t,m}}^{}{L}'}{\sum_{x_{i}\in R_{t,m}}{L}''}|_{f(x_{i})=f_{t-1}(x_{i})}=-\frac{\sum_{x_{i}\in R_{t,m}}^{}(-y_{i}+p_{i})}{\sum_{x_{i}\in R_{t,m}}p_{i}(1-p_{i})}

=\frac{\sum_{x_{i}\in R_{t,m}}^{}r_{t,i}}{\sum_{x_{i}\in R_{t,m}}(y_{i}-r_{t,i})(1-y_{i}+r_{t,i})}

3)更新强学习器

f_{t}(x)=f_{t-1}(x)+h_{t}(x)=f_{t-1}(x)+\sum_{m=1}^{M_{t}}\gamma _{t,m}I(x\in R_{t,m})

在不满足停止条件时,继续迭代。

2.2.3 得到最终学习器

在第T轮迭代时:当损失函数小于指定值或满足其它设定的停止条件(如迭代次数、分类器在训练集或测试集上的性能等)时,迭代停止。

f(x)=f_{T}(x)=f_{0}(x)+\sum_{t=1}^{T}\sum_{m=1}^{M_{t}}\gamma _{t,m}I(x\in R_{t,m})

将其sigmoid转换为概率p(x)=\frac{1}{1+e^{-f(x)}}

根据预测的概率,可以对样本进行类别划分。如当p(x)\geqslant 0.5时,归类为正样本,否则为负样本。

4、算法实例

给定如下数据集:

序号0123456789
age18202225283035404550
level1132354261
y0001111010

x=(age,level)y为预测特征。

4.1 模型初始化

初始化的弱学习器为:

f_{0}(x)=ln\frac{\sum_{i=1}^{N}y_{i}}{\sum_{i=1}^{N}(1-y_{i})}=0

这里,我们设定个模型停止迭代的条件:当负梯度为0或迭代次数>5时,停止迭代。

4.2 进行迭代

4.2.1 第1轮迭代

1)计算负梯度

本轮负梯度r_{1,i}=y_{i}-\frac{1}{1+e^{-f_{0}(x_{i})}},得到新的数据集计算结果如下表:

序号0123456789
age18202225283035404550
level1132354261
r1-0.5-0.5-0.50.50.50.50.5-0.50.5-0.5

2)利用负梯度生成回归树

利用负梯度构建新的数据集D_{1}=\left \{ (x_{1},r_{1,1}),(x_{2},r_{1,2}),...,(x_{N},r_{1,N}) \right \}

在CART回归算法下,得到本轮的回归树h_{1}(x)=\sum_{m=1}^{4}\gamma _{1,m}I(x\in R_{1,m})

3)更新强学习器

f_{1}(x)=f_{0}(x)+h_{1}(x)=f_{0}(x)+\sum_{m=1}^{4}\gamma _{1,m}I(x\in R_{1,m})

4.2.2 第2轮迭代

1)计算负梯度

本轮负梯度r_{2,i}=y_{i}-\frac{1}{1+e^{-f_{1}(x_{i})}},得到新的数据集计算结果如下表:

序号0123456789
age18202225283035404550
level1132354261
r2-0.5-0.5-0.50.26890.26890.26890.2689-0.62250.3775-0.5

2)利用负梯度生成回归树

利用负梯度构建新的数据集D_{2}=\left \{ (x_{1},r_{2,1}),(x_{2},r_{2,2}),...,(x_{N},r_{2,N}) \right \}

在CART回归算法下,得到本轮的回归树h_{2}(x)=\sum_{m=1}^{5}\gamma _{2,m}I(x\in R_{2,m})

3)更新强学习器

f_{2}(x)=f_{1}(x)+h_{2}(x)=f_{1}(x)+\sum_{m=1}^{5}\gamma _{2,m}I(x\in R_{2,m})

4.2.3 第3轮迭代

1)计算负梯度

本轮负梯度r_{3,i}=y_{i}-\frac{1}{1+e^{-f_{2}(x_{i})}},得到新的数据集计算结果如下表:

序号0123456789
age18202225283035404550
level1132354261
r3-0.3775 -0.3775 -0.3775 0.2194 0.2194 0.2194 0.2194 -0.4847 0.2937 -0.3633 

2)利用负梯度生成回归树

利用负梯度构建新的数据集D_{3}=\left \{ (x_{1},r_{3,1}),(x_{2},r_{3,2}),...,(x_{N},r_{3,N}) \right \}

在CART回归算法下,得到本轮的回归树h_{3}(x)=\sum_{m=1}^{5}\gamma _{3,m}I(x\in R_{3,m})

3)更新强学习器

f_{3}(x)=f_{2}(x)+h_{3}(x)=f_{2}(x)+\sum_{m=1}^{5}\gamma _{3,m}I(x\in R_{3,m})

 4.2.4 第4轮迭代

1)计算负梯度

本轮负梯度r_{4,i}=y_{i}-\frac{1}{1+e^{-f_{3}(x_{i})}},得到新的数据集计算结果如下表:

序号0123456789
age18202225283035404550
level1132354261
r4-0.2937 -0.2937 -0.2937 0.1842 0.1842 0.1842 0.1842 -0.3810 0.2366 -0.2719 

2)利用负梯度生成回归树

利用负梯度构建新的数据集D_{4}=\left \{ (x_{1},r_{4,1}),(x_{2},r_{4,2}),...,(x_{N},r_{4,N}) \right \}

在CART回归算法下,得到本轮的回归树h_{4}(x)=\sum_{m=1}^{5}\gamma _{4,m}I(x\in R_{4,m})

3)更新强学习器

f_{4}(x)=f_{3}(x)+h_{4}(x)=f_{3}(x)+\sum_{m=1}^{5}\gamma _{4,m}I(x\in R_{4,m})

  4.2.5 第5轮迭代

1)计算负梯度

本轮负梯度r_{5,i}=y_{i}-\frac{1}{1+e^{-f_{4}(x_{i})}},得到新的数据集计算结果如下表:

序号0123456789
age18202225283035404550
level1132354261
r5-0.2366 -0.2366 -0.2366 0.1581 0.1581 0.1581 0.1581 -0.3075 0.1966 -0.2122 

2)利用负梯度生成回归树

利用负梯度构建新的数据集D_{5}=\left \{ (x_{1},r_{5,1}),(x_{2},r_{5,2}),...,(x_{N},r_{5,N}) \right \}

在CART回归算法下,得到本轮的回归树h_{5}(x)=\sum_{m=1}^{5}\gamma _{5,m}I(x\in R_{5,m})

3)更新强学习器

f_{5}(x)=f_{4}(x)+h_{5}(x)=f_{4}(x)+\sum_{m=1}^{5}\gamma _{5,m}I(x\in R_{5,m})

4.3  得到最终学习器

在第5轮迭代时,迭代次数满足停止条件时,迭代停止。

f(x)=f_{5}(x)=f_{0}(x)+\sum_{t=1}^{5}\sum_{m=1}^{M_{t}}\gamma _{t,m}I(x\in R_{t,m})

将其sigmoid转换为概率p(x)=\frac{1}{1+e^{-f(x)}}

根据预测的概率,可以对样本进行类别划分。如当p(x)\geqslant 0.5时,归类为正样本,否则为负样本。

利用f(x)对样本进行预测,预测值为:[-1.40786137, -1.40786137, -1.40786137, 1.83063012, 1.83063012,1.83063012, 1.83063012, -1.07152558, 1.60443296, -1.57152558],

其sigmoid转换值为概率:[0.19657159, 0.19657159, 0.19657159, 0.86183677, 0.86183677, 0.86183677, 0.86183677, 0.25511307, 0.83263704, 0.17199902],

根据概率进行分类:[0,0,0,1,1,1,1,0,1,0]。

5、算法代码实现

本例中,使用sklearn中的GradientBoostingClassifier算法训练分类树。由于该算法中的参数设置原因,最终分类树的结果可能与前述分析不一样。

from sklearn.ensemble import GradientBoostingClassifier
df = pd.DataFrame(
    {'age':[18,20,22,25,28,30,35,40,45,50],
    'level':[1,1,3,2,3,5,4,2,6,1],
    'y':[0,0,0,1,1,1,1,0,1,0]}
)
X = df.iloc[:,0:2]
y = df.iloc[:,2]
gbdt = GradientBoostingClassifier(random_state=0)
gbdt.fit(X,y)
gbdt.predict(X)
array([0, 0, 0, 1, 1, 1, 1, 0, 1, 0])

6、算法说明

1、GBDT算法既支持回归也支持分类,均以CART回归算法作为基学习器。在GBDT二分类算法中,需要对负梯度进行拟合,因此其基学习器采用回归算法。

2、GBDT二分类算法中的输入特征只支持连续特征,不支持类别特征。

3、在GBDT算法中实现过程中, 一般会设置一个学习率learning_rate,用shrinkage(缩减)的思想,缩小每棵树的贡献,减缓大幅度的拟合容易产生的过拟合风险。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值