集成学习--Gradient Boosting Decison Tree(GBDT)梯度提升树

GBDT 的全称是 Gradient Boosting Decision Tree,梯度提升树,属于集成学习中的boosting算法,但是和boosting中的典型算法Adaboost有很大的不同。Adaboost是利用前一轮迭代弱学习器的误差率来更新训练集的权重,这样一轮轮的迭代下去。GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,无论是处理回归问题还是二分类以及多分类。同时迭代思路和Adaboost也有所不同。

GBDT的思想可以用一个通俗的例子解释,假如有个人30岁,我们首先用20岁去拟合,发现损失有10岁,这时我们用6岁去拟合剩下的损失,发现差距还有4岁,第三轮我们用3岁拟合剩下的差距,差距就只有一岁了。如果我们的迭代轮数还没有完,可以继续迭代下面,每一轮迭代,拟合的岁数误差都会减小。

而GBDT的上层就是一个加法模型

其中每个都是一棵CART树。每棵回归树对给定的同一个样本输出的值相加就是该样本最终的输出y。

我们怎么求解最优的y呢,这就需要用到前向分布算法和负梯度优化了,首先来介绍前向分布算法。

目录

前向分布算法

负梯度拟合

损失函数

回归

二分类,多分类

正则化

优缺点

Sklearn参数

应用场景

参考

 

前向分布算法

在李航的《统计学习》一书中8.3.1节讲述了前向分布算法

首先考虑加法模型

                             (1)

其中,b(x,\gamma m)是基函数,是基函数的参数,\beta m是基函数的系数

在给定训练集和损失函数的条件下,学习加法模型成为经验风险极小化即损失函数极小化问题:

这是一个复杂的优化问题,前向分布算法求解这一优化问题的想法是:学习的是加法模型如果能够从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数(1)那么就可以优化简化的复杂度,具体来说每步只需要优化如下损失函数:

给定训练数据集,,yi∈Y={-1,+1},损失函数和基函数的集合,学习加法模型f(x)的前向分布算法如下:

­­­输入:训练数据集,损失函数和基函数集

输出:加法模型f(x)

(1)初始化

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

  • 极小化损失函数

得到参数

  • 更新

  • 得到加法模型‘

这样,前向分布算法将同时求解从m = 1到M所有参数的优化问题简化为逐次求解各个的优化问题。

负梯度拟合

在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是, 损失函数是 ,我们本轮迭代的目标是找到一个CART回归树模型的弱学习器ht(x),让本轮的损失函数最小。也就是说,本轮迭代找到要让样本的损失尽量变得更小的决策树。

针对这个损失函数拟合方法的问题,大牛Freidman提出了用损失函数的负梯度来拟合本轮损失的近似值,进而拟合一个CART回归树。第t轮的第i个样本的损失函数的负梯度表示为:

利用(xi,rti) (i = 1,2,...,M)(i = 1,2,...,M),我们可以拟合一颗CART回归树,得到了第t颗回归树,其对应的叶节点区域Rtj,j = 1,2,...J。其中J为叶子节点的个数。

针对每一个叶子节点里的样本,我们求出使损失函数最小,也就是拟合叶子节点最好的的输出值ctj如下:

这样我们就得到了本轮的决策树拟合函数如下:

从而本轮最终得到的强学习器的表达式如下:

通过损失函数的负梯度来拟合,我们找到了一种通用的拟合损失误差的办法,这样无轮是分类问题还是回归问题,我们通过其损失函数的负梯度的拟合,就可以用GBDT来解决我们的分类回归问题。区别仅仅在于损失函数不同导致的负梯度不同而已。下面来介绍下常用的损失函数。

损失函数

(1).对于分类算法,其损失函数一般有对数损失函数和指数损失函数两种::

  • 指数损失函数

  • 对数损失函数,分为二元分类和多元分类两种,见下面

(2).对于回归算法,常用损失函数有如下4种: 

  • 均方差

  • 绝对损失

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

  • 分位数损失。它对应的是分位数回归的损失函数

回归

输入是训练集样本, 最大迭代次数T, 损失函数L。

输出是强学习器f(x)

(1).初始化弱学习器

(2).对迭代轮数t=1,2,...T有:

a)对样本i=1,2,...m,计算负梯度:

b)利用(xi,rti) (i = 1,2,...,M), 拟合一颗CART回归树,得到第t颗回归树,其对应的叶子节点区域为Rtj,j = 1,2,...J。其中J为回归树t的叶子节点的个数。

c) 对叶子区域j =1,2,..J,计算最佳拟合值

d)更新强学习器

3)得到强学习器f(x)的表达式

二分类,多分类

(1)二分类

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

 

其中y∈{−1,+1}。则此时的负梯度误差为

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

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

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

(2)多分类

假设类别数为K,则此时我们的对数似然损失函数为:

其中如果样本输出类别为k,则yk=1。第k类的概率pk(x)的表达式为:

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

观察上式可以看出,其实这里的误差就是样本i对应类别l的真实概率和t−1轮预测概率的差值。

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

我们一般使用近似值代替

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

正则化

防止过拟合。GBDT的正则化主要有三种方式

  • 步长(learning rate)。定义为ν,对于前面的弱学习器的迭代

如果我们加上了正则化项,则有:

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

  • 设定子采样比例(subsample)。这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。
  • 对弱学习器进行剪枝。

优缺点

  • 优点:

预测精度高,适合低维数据,能处理非线性数据

可以灵活处理各种类型的数据,包括连续值和离散值

  • 缺点:

如果数据维度高时会加大算法的计算复杂度

Sklearn参数

  •  loss:损失函数度量,有对数似然损失deviance和指数损失函数exponential两种,默认是deviance,即对数似然损失,如果使用指数损失函数,则相当于Adaboost模型。
  • criterion: 样本集的切分策略,决策树中也有这个参数,但是两个参数值不一样,这里的参数值主要有friedman_mse、mse和mae3个,分别对应friedman最小平方误差、最小平方误差和平均绝对值误差,friedman最小平方误差是最小平方误差的近似。
  • subsample:采样比例,这里的采样和bagging的采样不是一个概念,这里的采样是指选取多少比例的数据集利用决策树基模型去boosting,默认是1.0,即在全量数据集上利用决策树去boosting。
  • feature_importance_:特征重要性。
  • oob_improvement_:每一次迭代对应的loss提升量。oob_improvement_[0]表示第一次提升对应的loss提升量
  • train_score_:表示在样本集上每次迭代以后的对应的损失函数值。
  • loss_:损失函数。
  • estimators_:基分类器个数

应用场景

可以用于回归/分类问题

参考

李航《统计学习》

https://www.cnblogs.com/pinard/p/6140514.html

https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html

你可能感兴趣的:(机器学习,GBDT,Boosting,集成学习)