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

 

0x01、提升树模型

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

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

        

BRT提升回归树 增强回归树brt_BRT提升回归树

  其中, 

BRT提升回归树 增强回归树brt_损失函数_02

表示决策树,

BRT提升回归树 增强回归树brt_拟合_03

为决策树的参数,

BRT提升回归树 增强回归树brt_决策树_04

为树的个数。

 

0x02、提升树算法

1、提升树算法基本原理

提升树模型可以表示为决策树的加法模型(如下式),其中 

BRT提升回归树 增强回归树brt_损失函数_05

表示决策树,

BRT提升回归树 增强回归树brt_拟合_06

 为决策树的参数,M 为树的个数:        

BRT提升回归树 增强回归树brt_拟合_07

   提升树算法采用前向分步算法。首先确定初始提升树 

BRT提升回归树 增强回归树brt_拟合_08

,第 m 步的模型是:        

BRT提升回归树 增强回归树brt_BRT提升回归树_09

  其中,

BRT提升回归树 增强回归树brt_决策树_10

为当前模型,通过经验风险极小化确定下一棵决策树的参数 

BRT提升回归树 增强回归树brt_拟合_03

:        

BRT提升回归树 增强回归树brt_拟合_12

  

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

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

已知一个训练集 

BRT提升回归树 增强回归树brt_决策树_13

 ,

BRT提升回归树 增强回归树brt_决策树_14

 为输入空间,

BRT提升回归树 增强回归树brt_损失函数_15

为输出空间。如果将输入空间划分为 J 个互不相交的区域 

BRT提升回归树 增强回归树brt_损失函数_16

,并且在每个区域上确定输出的常量 

BRT提升回归树 增强回归树brt_损失函数_17

,那么树可以表示为:        

BRT提升回归树 增强回归树brt_决策树_18

  

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

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

        

   在前向分步算法的第 m 步,给定当前模型 

BRT提升回归树 增强回归树brt_决策树_10

,需求解得第 m 棵树的参数

BRT提升回归树 增强回归树brt_BRT提升回归树_20

 :         

  当采用平方误差损失函数时,

BRT提升回归树 增强回归树brt_决策树_21

 ,其损失变为:

BRT提升回归树 增强回归树brt_BRT提升回归树_22

 ,这里

BRT提升回归树 增强回归树brt_决策树_23

 是当前模型拟合数据的残差(residual)。所以,对回归问题的提升树算法来说,只需要简单地拟合当前模型的残差,算法是相当简单的。

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

输入:训练数据集 

BRT提升回归树 增强回归树brt_决策树_13

 ;输出:提升树 

BRT提升回归树 增强回归树brt_拟合_25

。(1)初始化 

BRT提升回归树 增强回归树brt_拟合_08

 ;(2)对 

BRT提升回归树 增强回归树brt_拟合_27

:        a. 根据回归树的表达式,计算残差:

BRT提升回归树 增强回归树brt_决策树_28

 ;        b. 拟合残差 

BRT提升回归树 增强回归树brt_BRT提升回归树_29

学习一个回归树,得到 

BRT提升回归树 增强回归树brt_损失函数_05

 ;        c. 更新:

BRT提升回归树 增强回归树brt_拟合_31

 ;(3)得到回归问题提升树:  

  。

 

0x03、GBDT算法

1、梯度提升算法

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

        

BRT提升回归树 增强回归树brt_BRT提升回归树_32

  

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

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

2、GBDT回归算法

输入:训练数据集 

BRT提升回归树 增强回归树brt_决策树_13

;损失函数 

BRT提升回归树 增强回归树brt_损失函数_34

;输出:回归树 

BRT提升回归树 增强回归树brt_BRT提升回归树_35

。(1)初始化:

BRT提升回归树 增强回归树brt_决策树_36

(2)对 

BRT提升回归树 增强回归树brt_拟合_27

:        a. 对 

BRT提升回归树 增强回归树brt_损失函数_38

 ,计算:

  ;        b. 对 

BRT提升回归树 增强回归树brt_拟合_39

拟合一个回归树,得到第 

BRT提升回归树 增强回归树brt_拟合_39

棵树的叶结点区域 

BRT提升回归树 增强回归树brt_决策树_41

 ;        c. 对 

BRT提升回归树 增强回归树brt_决策树_42

,计算: 

BRT提升回归树 增强回归树brt_损失函数_43

  ;        d. 更新:

BRT提升回归树 增强回归树brt_拟合_44

  ;(3)得到回归树:

BRT提升回归树 增强回归树brt_损失函数_45

  。

3、二元GBDT类算法

输入:训练数据集 

BRT提升回归树 增强回归树brt_决策树_13

;损失函数:        

 ;输出:分类树 

BRT提升回归树 增强回归树brt_BRT提升回归树_35

 。(1)初始化:

BRT提升回归树 增强回归树brt_拟合_48

  ;(2)对 

BRT提升回归树 增强回归树brt_拟合_27

:        a. 对 

BRT提升回归树 增强回归树brt_损失函数_38

 ,计算负梯度:            

        b. 对 

BRT提升回归树 增强回归树brt_拟合_39

拟合一个分类树,得到第 

BRT提升回归树 增强回归树brt_拟合_39

棵树的叶结点区域 

BRT提升回归树 增强回归树brt_决策树_41

 ,J 为分类树的叶子结点的个数 ;        c. 对 

BRT提升回归树 增强回归树brt_决策树_42

,计算各个叶子结点的最佳负梯度拟合值:            

BRT提升回归树 增强回归树brt_拟合_55

  ,由于上式比较难,一般使用近似值代替:

BRT提升回归树 增强回归树brt_决策树_56

  ;        d. 更新:

BRT提升回归树 增强回归树brt_拟合_44

  ;(3)得到分类树:

BRT提升回归树 增强回归树brt_损失函数_45

  。

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

        

BRT提升回归树 增强回归树brt_BRT提升回归树_59

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

4、多元GBDT分类算法

输入:训练数据集 

BRT提升回归树 增强回归树brt_决策树_13

;损失函数: 

 ,其中 

BRT提升回归树 增强回归树brt_决策树_61

 表示是否属于第 k 类别,

BRT提升回归树 增强回归树brt_损失函数_62

表示共有多少分类的类别;输出:分类树

BRT提升回归树 增强回归树brt_BRT提升回归树_35

 。(1)初始化:

BRT提升回归树 增强回归树brt_BRT提升回归树_64

 ;(2)对迭代轮数 

BRT提升回归树 增强回归树brt_拟合_27

 ,        a. 对 

BRT提升回归树 增强回归树brt_损失函数_38

 ,对样本计算样本点属于每个类别

BRT提升回归树 增强回归树brt_损失函数_67

 的概率:            

BRT提升回归树 增强回归树brt_拟合_68

        b. 对类别 

BRT提升回归树 增强回归树brt_损失函数_62

 ,根据损失函数和第k类的概率,可计算出第 m 轮的第 i 个样本对应类别

BRT提升回归树 增强回归树brt_损失函数_67

 的负梯度误差为:             

 这里的误差就是样本 i 对应类别

BRT提升回归树 增强回归树brt_损失函数_67

 的真实概率 和 m-1 轮预测概率的差值。        c. 对概率伪残差 

BRT提升回归树 增强回归树brt_损失函数_72

拟合一个分类树 ;        d. 对 

BRT提升回归树 增强回归树brt_决策树_42

,计算各个叶子结点的最佳负梯度拟合值:            

BRT提升回归树 增强回归树brt_拟合_74

  ,由于上式比较难,一般使用近似值代替:

BRT提升回归树 增强回归树brt_决策树_75

  ;        d. 更新强学习器:

BRT提升回归树 增强回归树brt_BRT提升回归树_76

  ;(3)得到分类树:

BRT提升回归树 增强回归树brt_BRT提升回归树_77

  。

 

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

参数

参数类型

默认值

参数含义

详细说明

loss

{'deviance',

'exponential'}

deviance

损失函数

对分类:deviance:对数似然损失函数。Exponential:指数损失函数。一般使用默认值,对二元和多元分类各自都有比较好的优化。

对回归:均方差ls:数据点噪音不多时使用;绝对损失lad;Huber损失huber:抗噪音;分位数损失quantile:分段预测。

learning_rate

float

0.1

每个弱学习器的权重缩减系数v(步长)

0<v<=1.较小的v意味着需要更多的弱学习器迭代次数,要和n_estimators一起调参,可从一个小一点的v开始

n_estimators

int

100

弱学习器的最大迭代次数

n_estimators太小,容易欠拟合,太大则容易过拟合。

subsample

float

1

子采样,取值为(0,1]

不放回抽样,若值为1,则全部样本都使用,若小于1,则只有一部分样本会去做拟合。选择小于1的比例可减少方差,防止过拟合,但会增加样本拟合的偏差,推荐在[0.5,0.8]。

criterion

{'friedman_mse',

'mse','mae'}

friedman_mse

特征选择标准

friedman_mse:使用Friedman改进得分的均方误差;mse:均方误差;mae:平均绝对误差;

min_samples_split

int/float

2

内部节点再划分所需最小样本数

限制了子树继续划分的条件,如果某节点的样本数少于min_samples_split,则不会继续再尝试选择最优特征来进行划分。 

min_samples_leaf

int/float

1

叶子节点最少样本数

限制了叶子节点最少的样本数,如果某叶子节点数目小于样本数,则会和兄弟节点一起被剪枝。

min_weight_fraction_leaf

float

0

叶子节点最小的样本权重和

限制了叶子节点所有样本权重和的最小值,如果小于这个值,则会和兄弟节点一起被剪枝。 

max_depth

int

3

决策树的最大深度

数据少或特征少的时候可以不限制。如果模型样本、特征多,可限制这个最大深度,具体的取值取决于数据的分布。

min_impurity_decrease

float

0

节点划分最小不纯度

限制了决策树的增长,如果某节点的不纯度(基于基尼系数,均方差)小于这个阈值,则该节点不再生成子节点。

init

extimator or 'zero'

None

初始化的时候的弱学习器

None:用训练集样本来做样本集的初始化分类回归预测,否则用init提供的学习器做初始化回归预测。一般在有先验知识的情况下使用。

random_state

int/随机状态实例

None

随机性控制

若为RandomState实例,random_state就是随机数生成器;None:随机数生成器是np.random使用的RandomState实例。

max_features

int/float

/{'auto','sqrt','log2'}

None

划分时考虑的最大特征数

None:划分时考虑所有的特征数;log2:划分时最多考虑log2N个特征;sqrt或auto:划分时最多考虑N−−√N个特征。整数:考虑的特征绝对数。浮点数:考虑特征百分比,即考虑(百分比xN)取整后的特征数。

verbose

int

0

详细输出

0:不输出任何结果;1:打印特定区域的树的输出结果;大于1:打印所有结果;

max_leaf_nodes

int

None

最大叶子节点数

限制最大叶子节点数,可以防止过拟合,None:不限制最大的叶子节点数。如果加了限制,算法会建立在最大叶子节点数内最优的决策树。

warm_start

bool

False 

热启动

True:重复使用之前的调用,再加入更多弱学习器

validation_fraction

float

0.1

早期停止的训练集

预留的训练数据比例作为早期停止的验证集。仅当n_iter_no_change是整数时使用。

n_iter_no_change

int

None

验证得分没有得到改善时提前终止训练

当验证得分没有得到改善时可以提前终止训练。None:不允许提前结束;整数:将 validation_fraction的大小作为验证,并在验证得分没有得到改善时终止训练。

tol

float

1.00E-04

容忍提前停止

当n_iter_no_change 迭代的损失没有改善时,允许提前停止。

ccp_alpha

非负的浮点型

0

用于最小代价复杂度修剪的复杂度参数

将会选择最大代价复杂度小于ccp_alpha的子树。默认不修剪。