GBDT简介

1.简介

GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种采用加法模型(即基函数的线性组合)与前向分步算法并以决策树作为基函数的提升方法。通俗来说就是,是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案。

2.算法原理

2.1 前向分步算法(考虑加法模型)

 加法模型是这样的:

其中, 为基函数, 为基函数的参数, 为基函数的系数。
在给定训练数据及损失函数 的条件下,学习加法模型成为损失函数极小化问题:

前向分步算法求解这一优化问题的思路:因为学习的是加法模型,如果能够从前向后,每一步只学习一个基函数及其系数,逐步去逼近上述的目标函数式,就可简化优化的复杂度,每一步只需优化如下损失函数:
(每步学习一个基函数和系数)

总体来说,前向分步算法将同时求解从m=1到M所有参数 的优化问题简化成逐步求解各个 的优化问题了。

2.2 负梯度拟合

2.2.1 提升树算法

提升方法实际采用加法模型与前向分步算法,以决策树作为基函数的提升方法称为提升树。注意,这里的决策树为CART回归树,不是分类树。当问题是分类问题时,采用的决策树模型为分类回归树。
提升树模型可表示为:

其中, 表示决策树; 为决策树的参数;M为树的个数;M为树的个数。
针对不同的问题,提升树算法的形式有所不同,其主要区别在于使用的损失函数不同。而损失函数的不同,决策树要拟合的值也会不同。就一般而言,对于回归问题的提升树算法来说,若损失函数是平方损失函数,每一步只需简单拟合当前模型的残差。

2.2.2 梯度提升法

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

作为回归问题在当前模型的残差的近似值,拟合一个回归树。

为什么要拟合负梯度呢?这就涉及到泰勒公式和梯度下降法了。

1.泰勒公式
泰勒公式的形式是这样的:
● 定义:泰勒公式是一个用函数在某点的信息描述其附近取值的公式。
● 基本形式:
● 一阶泰勒展开:
● 二阶的泰勒展开式为:
式子本身是使用 代表已知的点去估计
迭代形式:

那么 ,也就是说在上述的一阶泰勒展开式中 和
那么式子本身的意义是使用 代表已知的点去估计

2.梯度下降法
梯度下降法(英语:Gradient descent)是一个一阶最优化算法,通常也称为最速下降法。 要使用梯度下降法找到一个函数的局部极小值,必须向函数上当前点对应梯度(或者是近似梯度)的反方向的规定步长距离点进行迭代搜索。
也就是说梯度下降法是用来最小化损失函数的 ,其中的 是模型参数,求无约束最优化问题,即在给与了初始值后,不断进行迭代。
当我们给与了初始值 后,
可以得
代入一阶泰勒展开式,并把函数改成损失函数

然后是时候开始真正的技术啦
为了使每次迭代的损失函数不断变小,我们使用了一个绝妙的替代:
使用
这也就产生了

那么这就保证了我们每次迭代都是使损失函数减少的,也就是梯度下降法啦
其中 是步长,通过line search决定(也就是暴力搜索 - -!),但是一般都给一个比较小的数。

本质上GBDT使用了梯度下降法,XGBoost使用了牛顿法分别进行优化。
Tips:广义上GBDT泛指所有梯度提升树算法,包括了XGBoost。狭义上我们把GBDT定义为Gradient Boosting Decision Tree。

2.3 损失函数

在GBDT算法中,损失函数的选择十分重要。针对不同的问题,损失函数有不同的选择。
1.对于分类算法,其损失函数一般由对数损失函数和指数损失函数两种。
(1)指数损失函数表达式:

(2)对数损失函数可分为二分类和多分类两种。
2.对于回归算法,常用损失函数有如下4种。
(1)平方损失函数:

(2)绝对损失函数:

对应负梯度误差为:

(3)Huber损失,它是均方差和绝对损失的折中产物,对于远离中心的异常点,采用绝对损失误差,而对于靠近中心的点则采用平方损失。这个界限一般用分位数点度量。损失函数如下:

对应的负梯度误差为:

(4)分位数损失。它对应的是分位数回归的损失函数,表达式为:

其中 为分位数,需要我们在回归之前指定。对应的负梯度误差为:

对于Huber损失和分位数损失,主要用于健壮回归,也就是减少异常点对损失函数的影响。

2.4 GBDT分类算法

   这里看看GBDT分类算法,GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合输出类别的误差。
  为了解决这个问题,主要有两个方法,一个是用指数损失函数,此时GBDT退化为Adaboost算法。另一种方法用类似逻辑回归的对数似然函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。此处仅讨论用对数似然函数的GBDT分类。对于对数似然损失函数,我们有又有二元分类和的多元分类的区别。
  先看看两个模型的基本分类器——CART。
  本质上来说GBDT是多个CART模型的加总,给与一个适当的权重,那么我们可以设定:

其中 是权重,t表示每棵树的权重,w为CART的参数,h则表示CART。
之后我们把因变量放入,使用梯度下降法最小化损失函数,也就是最小化下列模型:

2.4.1 二分类GBDT算法

对于二分类GBDT,如果用类似逻辑回归的对数似然损失函数,则损失函数为:

其中 {-1,1}。此时的负梯度误差为:

对于生成的决策树,我们各个叶子节点的最佳负梯度拟合值为

由于上式比较难优化,我们一般使用近似值代替

除了负梯度计算和叶子节点的最佳负梯度拟合的线性搜索,二分类GBDT与GBDT回归算法过程相同。

2.4.2 多分类GBDT算法

多分类GBDT比二分类GBDT复杂些,对应的是多元逻辑回归和二元逻辑回归的复杂度差别。假设类别数为K,则此时我们的对数似然损失函数为:

其中如果样本输出类别为k,则 =1.第k类的概率 的表达式为:

集合上两式,我们可以计算出第t轮的第i个样本对应类别l的负梯度误差为:

观察上式可以看出,其实这里的误差就是样本i对应类别l的真实概率和t-1轮预测概率的差值。
对于生成的决策树,我们各个叶子节点的最佳负梯度拟合值为:

由于上式比较难优化,我们一般使用近似值代替

除了负梯度计算和叶子节点的最佳负梯度拟合的线性搜索,多分类GBDT与二分类GBDT以及GBDT回归算法过程相同。

2.4.3 对GBDT进行正则化来防止过拟合

对GBDT进行正则化来防止过拟合,主要有三种形式。
1.给每棵数的输出结果乘上一个步长a(learning rate)。
对于前面的弱学习器的迭代:

加上正则化项,则有

此处,a的取值范围为(0,1]。对于同样的训练集学习效果,较小的a意味着需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起决定算法的拟合效果。

2.第二种正则化的方式就是通过子采样比例(subsample)。取值范围为(0,1]。
GBDT这里的做法是在每一轮建树时,样本是从原始训练集中采用无放回随机抽样的方式产生,与随机森立的有放回抽样产生采样集的方式不同。若取值为1,则采用全部样本进行训练,若取值小于1,则不选取全部样本进行训练。选择小于1的比例可以减少方差,防止过拟合,但可能会增加样本拟合的偏差。取值要适中,推荐[0.5,0.8]。

3.第三种是对弱学习器即CART回归树进行正则化剪枝。(如控制树的最大深度、节点的最少样本数、最大叶子节点数、节点分支的最小样本数等)

3.优缺点

1.GBDT优点
● 可以灵活处理各种类型的数据,包括连续值和离散值。
● 在相对较少的调参时间情况下,预测的准确率也比较高,相对SVM而言。
● 在使用一些健壮的损失函数,对异常值得鲁棒性非常强。比如Huber损失函数和Quantile损失函数。
2.GBDT缺点
● 由于弱学习器之间存在较强依赖关系,难以并行训练。可以通过自采样的SGBT来达到部分并行。

4.应用场景

GBDT几乎可以用于所有回归问题(线性/非线性),相对loigstic regression仅能用于线性回归,GBDT的适用面非常广,亦可用于分类问题。

5.模型及参数

在scikit-learning中,GradientBoostingClassifier对应GBDT的分类算法,GradientBoostingRegressor对应GBDT的回归算法。
具体算法参数情况如下:
GradientBoostingRegressor(
loss=’ls’,
learning_rate=0.1,
n_estimators=100,
subsample=1.0,
criterion=’friedman_mse’,
min_samples_split=2,
min_samples_leaf=1,
min_weight_fraction_leaf=0.0,
max_depth=3,
min_impurity_decrease=0.0,
min_impurity_split=None, init=None,
random_state=None,
max_features=None,
alpha=0.9,
verbose=0,
max_leaf_nodes=None,
warm_start=False,
presort=’auto’,
validation_fraction=0.1,
n_iter_no_change=None,
tol=0.0001)
参数说明:
● n_estimators:弱学习器的最大迭代次数,也就是最大弱学习器的个数。
● learning_rate:步长,即每个学习器的权重缩减系数a,属于GBDT正则化方化手段之一。
● subsample:子采样,取值(0,1]。决定是否对原始数据集进行采样以及采样的比例,也是GBDT正则化手段之一。
● init:我们初始化的时候的弱学习器。若不设置,则使用默认的。
● loss:损失函数,可选{‘ls’-平方损失函数,‘lad’绝对损失函数-,‘huber’-huber损失函数,‘quantile’-分位数损失函数},默认’ls’。
● alpha:当我们在使用Huber损失"Huber"和分位数损失"quantile"时,需要指定相应的值。默认是0.9,若噪声点比较多,可适当降低这个分位数值。
● criterion:决策树节搜索最优分割点的准则,默认是"friedman_mse",可选"mse"-均方误差与’mae"-绝对误差。
● max_features:划分时考虑的最大特征数,就是特征抽样的意思,默认考虑全部特征。
● max_depth:树的最大深度。
● min_samples_split:内部节点再划分所需最小样本数。
● min_samples_leaf:叶子节点最少样本数。
● max_leaf_nodes:最大叶子节点数。
● min_impurity_split:节点划分最小不纯度。
● presort:是否预先对数据进行排序以加快最优分割点搜索的速度。默认是预先排序,若是稀疏数据,则不会预先排序,另外,稀疏数据不能设置为True。
● validationfraction:为提前停止而预留的验证数据比例。当n_iter_no_change设置时才能用。
● n_iter_no_change:当验证分数没有提高时,用于决定是否使用早期停止来终止训练。

参考资料
GBDT算法梳理
GBDT算法原理
GDBT详解

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值