机器学习系列(8)——提升树与GBDT算法

本文介绍提升树模型与GBDT算法。

 

0x01、提升树模型

提升树是以分类树或回归树为基本分类器的提升方法。提升树被认为是统计学习中性能最好的方法之一。

提升方法实际采用加法模型(即基函数的线性组合)与前向分步算法,以决策树为基函数的提升方法称为提升树(boosting tree)。对分类问题决策树是二叉分类树,对回归问题决策树是二叉回归树。提升树模型可以表示为决策树的加法模型:

        f_M(x)=\sum_{m=1}^{M}T(x;\Theta _{m})  

其中, T(x;\Theta _{m}) 表示决策树,\Theta _{m} 为决策树的参数,M 为树的个数。

 

0x02、提升树算法

1、提升树算法基本原理

提升树模型可以表示为决策树的加法模型(如下式),其中 T(x;\Theta_m) 表示决策树,\Theta_m 为决策树的参数,M 为树的个数:

        f_M(x)= \sum_{m=1}^{M} T(x;\Theta_m)   

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

        f_m(x)=f_{m-1}(x) + T(x;\Theta _{m})  

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

        \hat{\Theta _{m}}=average\left ( \min_{\Theta _{m}}\sum_{i=1}^{N} L(y_{i}, f_{m-1}(x_i) + T(x_i;\Theta _m)) \right )  

由于树的线性组合可以很好地拟合训练数据,即使数据中的输入与输出之间的关系很复杂也是如此,所以提升树是一个高功能的学习算法。

2、针对回归问题的提升树算法

已知一个训练集 T= \left\{ (x_1,y_1),(x_2,y_2),...,(x_N,y_N) \right\},~x_i \in \chi \sqsubseteq R^n, ~y_i \in \gamma \sqsubseteq R ,\chi 为输入空间,\gamma 为输出空间。如果将输入空间划分为 J 个互不相交的区域 R_1,R_2,...,R_J ,并且在每个区域上确定输出的常量 c_j ,那么树可以表示为:

        T(x;\Theta)= \sum_{j=1}^{J} c_j I(x \in R_j)  

其中,  表示树的区域划分和各区域上的常数,J 是回归树的复杂度即叶结点个数。

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

        f_0(x)=0 \\ ~~~~~~f_m(x)=f_{m-1}(x) + T(x;\Theta_m), ~m=1,2,...,M \\ ~~~~~~f_M(x)= \sum_{m-1}^{M}T(x;\Theta_m)   

在前向分步算法的第 m 步,给定当前模型 f_{m-1}(x) ,需求解得第 m 棵树的参数 \hat{\Theta}_m :

         \hat{\Theta}_m=arg~ \min_{\Theta_m} \sum_{i=1}^{N} L(y_i,~f_{m-1}(x_i) + T(x_i;\Theta_m))  

当采用平方误差损失函数时,L(y,f(x))=(y-f(x))^2 ,

其损失变为: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)|^2 ,

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

【回归问题的提升树算法】

输入:训练数据集 T= \left\{ (x_1,y_1),(x_2,y_2),...,(x_N,y_N) \right\},~x_i \in \chi \sqsubseteq R^n, ~y_i \in \gamma \sqsubseteq R ;

输出:提升树 f_M(x)

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

(2)对 m=1,2,...,M

        a. 根据回归树的表达式,计算残差:r_(mi)=y_i - f_{m-1}(x_i), ~i=1,2,...,N ;

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

        c. 更新:f_m(x)=f_{m-1}(x)+T(x;\Theta _m) ;

(3)得到回归问题提升树:  f_M(x)= \sum_{m=1}^{M}T(x;\Theta_m)  。

 

0x03、GBDT算法

1、梯度提升算法

提升树利用加法模型与前向分步算法 实现学习的优化过程,当损失函数是平方损失和指数损失时,每一步优化是很简单的,但对一般损失函数而言,往往每一步优化并不那么容易。梯度提升(gradient boosting)算法利用最速下降法的近似方法,其关键是利用损失函数的负梯度在当前模型的值作为回归问题提升算法中的残差的近似值,拟合一个回归树。

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

GBDT优点:(1)可以灵活地处理各种类型的数据,包括连续和离散值;(2)相对于SVM,较少的调参可以达到较好的预测效果;(3)使用健壮的损失函数时,模型鲁棒性非常强,首异常值影响小。

GBDT缺点:弱学习器之间存在依赖关系,难以并行训练数据。

2、GBDT回归算法

输入:训练数据集 T= \left\{ (x_1,y_1),(x_2,y_2),...,(x_N,y_N) \right\},~x_i \in \chi \sqsubseteq R^n, ~y_i \in \gamma \sqsubseteq R ;损失函数 L(y,f(x))

输出:回归树 f(x)

(1)初始化:f_0(x)=arg \min_{c} \sum_{i=1}^{N} L(y_i,c)

(2)对 m=1,2,...,M

        a. 对 i=1,2,...,N ,计算:r_{mi} = - \left\[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right\]_{f(x)=f_{m-1}(x)}  ;

        b. 对 m 拟合一个回归树,得到第 m 棵树的叶结点区域 R_{mj}, ~j=1,2,...,J  ;

        c. 对 j=1,2,...,J ,计算: c_{mj}=arg \min_{c} \sum_{x_i \in R_{mj}} L(y_i,f_{m-1}(x_i) + c)  ;

        d. 更新:f_m(x) = f_{m-1}(x) + \sum_{j=1}^J c_{mj}I(x \in R_{mj})  ;

(3)得到回归树:\hat{f}(x)=f_M(x)= \sum_{m=1}^{M} \sum_{j=1}^{J} c_{mj} I(x \in R_{mj})  。

3、二元GBDT类算法

输入:训练数据集 T= \left\{ (x_1,y_1),(x_2,y_2),...,(x_N,y_N) \right\},~x_i \in \chi \sqsubseteq R^n, ~y_i \in \gamma \sqsubseteq R ;损失函数:

        L(y,f(x))=log(1+exp(-yf(x))) ;

输出:分类树 f(x) 。

(1)初始化:f_0(x)=\frac{1}{2} log \frac{P(y=1|x)}{P(y=-1|x)}  ;

(2)对 m=1,2,...,M

        a. 对 i=1,2,...,N ,计算负梯度:

            r_{mi} = - \left\[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right\]_{f(x)=f_{m-1}(x)} = \frac{y_i}{1+exp(y_{i}f(x_i))}

        b. 对 m 拟合一个分类树,得到第 m 棵树的叶结点区域 R_{mj}, ~j=1,2,...,J ,J 为分类树的叶子结点的个数 ;

        c. 对 j=1,2,...,J ,计算各个叶子结点的最佳负梯度拟合值:

            c_{mj}=arg \min_{c} \sum_{x_i \in R_{mj}} log(1+exp(-y_{i}(f_{t-1}(x_i)+c)) )  ,

由于上式比较难,一般使用近似值代替:c_{mj} = \frac{ \sum_{x_i \in R_{mj}}r_{mj}}{ \sum_{x_i \in R_{mj}} |r_{mj}|(1-|r_{mj}|) }  ;

        d. 更新:f_m(x) = f_{m-1}(x) + \sum_{j=1}^J c_{mj}I(x \in R_{mj})  ;

(3)得到分类树:\hat{f}(x)=f_M(x)= \sum_{m=1}^{M} \sum_{j=1}^{J} c_{mj} I(x \in R_{mj})  。

由于使用的是类别的预测概率值和真实概率值的差来拟合损失,所以最后还要将概率转换为类别:

        P(y=1|x) = \frac{1}{1+exp(-f(x))}, ~ P(y=-1|x)=\frac{1}{1+exp(f(x))}

最红输出比较类别概率大小,概率大的就预测为该类别。

4、多元GBDT分类算法

输入:训练数据集 T= \left\{ (x_1,y_1),(x_2,y_2),...,(x_N,y_N) \right\},~x_i \in \chi \sqsubseteq R^n, ~y_i \in \gamma \sqsubseteq R ;损失函数: L(y,f(x))= - \sum_{k=1}^{K} y_{k}log~p_{k}(x) ,其中 y_{k}= \left\{0,1 \right\} 表示是否属于第 k 类别,k=1,2,...,K 表示共有多少分类的类别;

输出:分类树f(x) 。

(1)初始化:f_{k0}(x) = 0, ~k=1,2,...,K ;

(2)对迭代轮数 m=1,2,...,M ,

        a. 对 i=1,2,...,N ,对样本计算样本点属于每个类别 l 的概率:

            p_{k}(x) = \frac{exp(f_{k}(x))}{ \sum_{l=1}^{K}exp(f_{l}(x)) }

        b. 对类别 k=1,2,...,K ,根据损失函数和第k类的概率,可计算出第 m 轮的第 i 个样本对应类别 l 的负梯度误差为:

             r_{mi} = - \left\[\frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right\]_{f_k(x)=f_{l,m-1}(x)} = y_{il} - p_{l,t-1}(x_i) 

这里的误差就是样本 i 对应类别 l 的真实概率 和 m-1 轮预测概率的差值。

        c. 对概率伪残差 \left\{ (x_1,r_{t1l}),..,(x_i,r_{til}) \right\} 拟合一个分类树 ;

        d. 对 j=1,2,...,J ,计算各个叶子结点的最佳负梯度拟合值:

            c_{mj}=arg \min_{cjl} \sum_{i=1}^{N} \sum_{k=1}^{K} L \left\(y_k,~f_{m-1,l}(x) + \sum_{j=1}^{J}c_{jl}I(x_i \in R_{tjl}) \right\)  ,

由于上式比较难,一般使用近似值代替:c_{mj} = \frac{K-1}{K} \frac{ \sum_{x_i \in R_{mjj}}r_{mjl}}{ \sum_{x_i \in R_{mjl}} |r_{mjl}|(1-|r_{mjl}|) }  ;

        d. 更新强学习器:f_{mk}(x) = f_{m-1,k}(x) + \sum_{j=1}^{J} c_{mjk}I(x \in R_{mjk})  ;

(3)得到分类树:\hat{f}(x)=f_{Mk}(x)= f_{0}(x) + \sum_{m=1}^{M} \sum_{j=1}^{J} c_{mjk} I(x \in R_{mjk})  。

 

0x04、GBDT算法在sklearn中的实现

参数参数类型默认值参数含义详细说明
loss{'deviance',
'exponential'}
deviance损失函数对分类:deviance:对数似然损失函数。Exponential:指数损失函数。一般使用默认值,对二元和多元分类各自都有比较好的优化。
对回归:均方差ls:数据点噪音不多时使用;绝对损失lad;Huber损失huber:抗噪音;分位数损失quantile:分段预测。
learning_ratefloat0.1每个弱学习器的权重缩减系数v(步长)0<v<=1.较小的v意味着需要更多的弱学习器迭代次数,要和n_estimators一起调参,可从一个小一点的v开始
n_estimatorsint100弱学习器的最大迭代次数n_estimators太小,容易欠拟合,太大则容易过拟合。
subsamplefloat1子采样,取值为(0,1]不放回抽样,若值为1,则全部样本都使用,若小于1,则只有一部分样本会去做拟合。选择小于1的比例可减少方差,防止过拟合,但会增加样本拟合的偏差,推荐在[0.5,0.8]。
criterion{'friedman_mse',
'mse','mae'}
friedman_mse特征选择标准friedman_mse:使用Friedman改进得分的均方误差;mse:均方误差;mae:平均绝对误差;
min_samples_splitint/float2内部节点再划分所需最小样本数限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 
min_samples_leafint/float1叶子节点最少样本数限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。
min_weight_fraction_leaffloat0叶子节点最小的样本权重和限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 
max_depthint3决策树的最大深度数据少或特征少的时候可以不限制。如果模型样本、特征多,可限制这个最大深度,具体的取值取决于数据的分布。
min_impurity_decreasefloat0节点划分最小不纯度限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。
initextimator or 'zero'None初始化的时候的弱学习器None:用训练集样本来做样本集的初始化分类回归预测,否则用init提供的学习器做初始化回归预测。一般在有先验知识的情况下使用。
random_stateint/随机状态实例None随机性控制若为RandomState实例,random_state就是随机数生成器;None:随机数生成器是np.random使用的RandomState实例。
max_featuresint/float
/{'auto','sqrt','log2'}
None划分时考虑的最大特征数None:划分时考虑所有的特征数;log2:划分时最多考虑log2N个特征;sqrt或auto:划分时最多考虑N−−√N个特征。整数:考虑的特征绝对数。浮点数:考虑特征百分比,即考虑(百分比xN)取整后的特征数。
verboseint0详细输出0:不输出任何结果;1:打印特定区域的树的输出结果;大于1:打印所有结果;
max_leaf_nodesintNone最大叶子节点数限制最大叶子节点数,可以防止过拟合,None:不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。
warm_startboolFalse 热启动True:重复使用之前的调用,再加入更多弱学习器
validation_fractionfloat0.1早期停止的训练集预留的训练数据比例作为早期停止的验证集。仅当n_iter_no_change是整数时使用。
n_iter_no_changeintNone验证得分没有得到改善时提前终止训练当验证得分没有得到改善时可以提前终止训练。None:不允许提前结束;整数:将 validation_fraction的大小作为验证,并在验证得分没有得到改善时终止训练。
tolfloat1.00E-04容忍提前停止当n_iter_no_change 迭代的损失没有改善时,允许提前停止。
ccp_alpha非负的浮点型0用于最小代价复杂度修剪的复杂度参数将会选择最大代价复杂度小于ccp_alpha的子树。默认不修剪。

 

 

参考:

[1]. 李航. 统计学习方法(第二版)

[2]. 周志华. 机器学习

[3]. 梯度提升树(GBDT)原理小结 - 博客园

[4]. 集成学习之梯度提升树(GBDT)算法 - 博客园

[5]. scikit-learn 梯度提升树(GBDT)调参小结 - 博客园

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值