算法梳理2:GBDT

GBDT是一种迭代的决策树算法,用于回归和分类任务。它通过前向分步算法逐步优化损失函数,每次迭代拟合负梯度方向。GBDT使用CART回归树作为弱学习器,并可通过正则化防止过拟合。损失函数的选择影响模型的优化,如平方损失和指数损失。分类时,GBDT可用对数似然损失函数。在sklearn中,GBDT的参数如n_estimators(迭代次数)、learning_rate(步长)和subsample(子采样比例)需配合调整。GBDT广泛应用于特征工程和评估特征重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. GBDT概述
2. 前向分步算法
3. 损失函数
4. 负梯度拟合回归模型
5. 分类算法
6. 正则化
7. 优缺点
8. sklearn参数
9. 应用场景

梯度提升树(Gradient Boosting Decison Tree, 以下简称GBDT),又称GBT(Gradient Boosting Tree), GTB(Gradient Tree Boosting ),GBRT(Gradient Boosting Regression Tree), MART(Multiple Additive Regression Tree)。

1. GBDT概述

GBDT是集成学习Boosting家族的成员,有两部分组成: gradient boosting,decision tree。
GBDT是迭代,使用了前向分步算法,但是弱学习器限定了只能使用CART回归树模型,迭代思路:假设我们前一轮迭代得到的强学习器是ft−1(x), 损失函数是L(y,ft−1(x)), 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器ht(x),让本轮的损失函数L(y,ft(x)=L(y,ft−1(x)+ht(x))最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。

GBDT中的树是回归树(不是分类树),GBDT用来做回归预测,调整后也可以用于分类。

回归树总体流程类似于分类树,区别在于,回归树的每一个节点都会得一个预测值,以年龄为例,该预测值等于属于这个节点的所有人年龄的平均值。分枝时穷举每一个feature的每个阈值找最好的分割点,但衡量最好的标准不再是最大熵,而是最小化平方误差。也就是被预测出错的人数越多,错的越离谱,平方误差就越大,通过最小化平方误差能够找到最可靠的分枝依据。

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

GBDT的思想使其具有天然优势可以发现多种有区分性的特征以及特征组合。
业界中,Facebook使用其来自动发现有效的特征、特征组合,来作为LR模型中的特征,以提高 CTR预估(Click-Through Rate Prediction)的准确性;GBDT在淘宝的搜索及预测业务上也发挥了重要作用。
boosting类的算法,都要解决这4个问题:

  1. 如何计算学习误差率e?
  2. 如何得到弱学习器权重系数α?
  3. 如何更新样本权重D?
  4. 使用何种结合策略?

2. 前向分步算法

求解思路

根据学习的加法模型(additive model)
在这里插入图片描述
在给定训练数据及损失函数L( y, f(x) )的条件下,学习加法模型 f(x)成为经验风险极小化即损失函数极小化问题:
在这里插入图片描述
如果能够从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式,具体,每步只需优化如下损失函数:
在这里插入图片描述

算法

在这里插入图片描述
这样,向前分步算法将同时求解从m=1到M的所有参数β(m),γ(m)的优化问题简化到逐步求解各个所有参数β(m),γ(m)的优化问题。

3. 损失函数

对常用的GBDT损失函数做一个总结。

  1. 对于分类算法,其损失函数一般有对数损失函数和指数损失函数两种:
    (a)如果是指数损失函数(Adaboost),则损失函数表达式为
    L(y,f(x))=exp(−yf(x))
    (b)如果是对数损失函数,分为二元分类和多元分类两种,参见文章第5节。
  2. 对于回归算法,常用损失函数有如下4种:
    (a)均方差。最常见
    L(y,f(x))=(y−f(x))2
    (b)绝对损失。同样常见
    L(y,f(x))=|y−f(x)|
    对应负梯度误差为:sign(yi−f(xi))
    (c)Huber损失:均方差和绝对损失的折衷产物。
    对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。损失函数如下:L(y,f(x))={12(y−f(x))2δ(|y−f(x)|−δ2)|y−f(x)|≤δ|y−f(x)|>δ
    (d)分位数损失:分位数回归的损失函数
    表达式为L(y,f(x))=∑y≥f(x)θ|y−f(x)|+∑y<f(x)(1−θ)|y−f(x)|
    其中θ为分位数,需要我们在回归前指定。

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

4. 负梯度拟合回归模型

提升树利用加法模型和前向分步算法实现学习的优化过程。当损失函数时平方损失和指数损失函数时,每一步的优化很简单,如平方损失函数学习残差回归树。
在这里插入图片描述
但对于一般的损失函数,往往每一步优化没那么容易,如上图中的绝对值损失函数和Huber损失函数。针对这一问题,Freidman提出了梯度提升算法:利用最速下降的近似方法,即利用损失函数的负梯度在当前模型的值,作为回归问题中提升树算法的残差的近似值,拟合一个回归树。(注:私以为,与其说负梯度作为残差的近似值,不如说残差是负梯度的一种特例))

算法

在这里插入图片描述
(截图来自《The Elements of Statistical Learning》)
算法步骤解释:

  1. 初始化,估计使损失函数极小化的常数值,它是只有一个根节点的树,即ganma是一个常数值。
  2. (a)计算损失函数的负梯度在当前模型的值,将它作为残差的估计
    (b)估计回归树叶节点区域,以拟合残差的近似值
    (c)利用线性搜索估计叶节点区域的值,使损失函数极小化
    (d)更新回归树
  3. 得到输出的最终模型 f(x)

5.分类算法

为什么没有加上分类算法一起?因为分类算法的输出是不连续的类别值,需要一些处理才能使用负梯度。

GBDT的分类算法从思想上和GBDT的回归算法没有区别,但是由于样本输出不是连续的值,而是离散的类别,导致我们无法直接从输出类别去拟合类别输出的误差。
为了解决这个问题,主要有两个方法,一个是用指数损失函数,此时GBDT退化为Adaboost算法。另一种方法是用类似于逻辑回归的对数似然损失函数的方法。也就是说,我们用的是类别的预测概率值和真实概率值的差来拟合损失。而对于对数似然损失函数,我们又有二元分类和多元分类的区别。

二元分类

在这里插入图片描述
除了负梯度计算和叶子节点的最佳残差拟合的线性搜索,二元GBDT分类和GBDT回归算法过程相同。

多元分类

多元GBDT要比二元GBDT复杂一些,对应的是多元逻辑回归和二元逻辑回归的复杂度差别。假设类别数为K,则此时我们的对数似然损失函数为:
在这里插入图片描述
除了负梯度计算和叶子节点的最佳残差拟合的线性搜索,多元GBDT分类和二元GBDT分类以及GBDT回归算法过程相同。

6.正则化

为防止过拟合,会加入正则化项。GBDT的正则化主要有三种方式。

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

fk(x)=fk−1(x)+hk(x)
如果我们加上了正则化项,则有fk(x)=fk−1(x)+νhk(x)
ν的取值范围为0<ν≤1。对于同样的训练集学习效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。

2. 子采样(subsample),比例取值为(0,1]

注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间。
使用了子采样的GBDT有时也称作随机梯度提升树(Stochastic Gradient Boosting Tree, SGBT)。由于使用了子采样,程序可以通过采样分发到不同的任务去做boosting的迭代过程,最后形成新树,从而减少弱学习器难以并行学习的弱点。

3. 对于弱学习器即CART回归树剪枝

7.优缺点

优点

  1. 可以灵活处理各种类型的数据,包括连续值和离散值。
  2. 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。
  3. 使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。

缺点

  1. 于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过子采样的SGBT来达到部分并行。

8.sklearn参数

推荐GBDT树的深度:6
(横向比较:DecisionTree/RandomForest需要把树的深度调到15或更高)

(以下摘自知乎上的一个问答,问题和回复都很好的阐述了这个参数设置的数学原理。)
【问】xgboost/gbdt在调参时为什么树的深度很少就能达到很高的精度?
用xgboost/gbdt在在调参的时候把树的最大深度调成6就有很高的精度了。但是用DecisionTree/RandomForest的时候需要把树的深度调到15或更高。用RandomForest所需要的树的深度和DecisionTree一样我能理解,因为它是用bagging的方法把DecisionTree组合在一起,相当于做了多次DecisionTree一样。但是xgboost/gbdt仅仅用梯度上升法就能用6个节点的深度达到很高的预测精度,使我惊讶到怀疑它是黑科技了。请问下xgboost/gbdt是怎么做到的?它的节点和一般的DecisionTree不同吗?
【答】
这是一个非常好的问题,题主对各算法的学习非常细致透彻,问的问题也关系到这两个算法的本质。这个问题其实并不是一个很简单的问题,我尝试用我浅薄的机器学习知识对这个问题进行回答。
一句话的解释,来自周志华老师的机器学习教科书( 机器学习-周志华):Boosting主要关注降低偏差,因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成;Bagging主要关注降低方差,因此它在不剪枝的决策树、神经网络等学习器上效用更为明显。
随机森林(random forest)和GBDT都是属于集成学习(ensemble learning)的范畴。集成学习下有两个重要的策略Bagging和Boosting。
Bagging算法是这样做的:每个分类器都随机从原样本中做有放回的采样,然后分别在这些采样后的样本上训练分类器,然后再把这些分类器组合起来。简单的多数投票一般就可以。其代表算法是随机森林。Boosting的意思是这样,他通过迭代地训练一系列的分类器,每个分类器采用的样本分布都和上一轮的学习结果有关。其代表算法是AdaBoost, GBDT。
其实就机器学习算法来说,其泛化误差可以分解为两部分,偏差(bias)和方差(variance)。这个可由下图的式子导出(这里用到了概率论公式D(X)=E(X2)-[E(X)]2)。偏差指的是算法的期望预测与真实预测之间的偏差程度,反应了模型本身的拟合能力;方差度量了同等大小的训练集的变动导致学习性能的变化,刻画了数据扰动所导致的影响。这个有点儿绕,不过你一定知道过拟合。
在这里插入图片描述
如下图所示,当模型越复杂时,拟合的程度就越高,模型的训练偏差就越小。但此时如果换一组数据可能模型的变化就会很大,即模型的方差很大。所以模型过于复杂的时候会导致过拟合。
当模型越简单时,即使我们再换一组数据,最后得出的学习器和之前的学习器的差别就不那么大,模型的方差很小。还是因为模型简单,所以偏差会很大。

在scikit-learn中,GradientBoostingClassifier为GBDT的分类类,而GradientBoostingRegressor为GBDT的回归类。两者的参数类型完全相同,当然有些参数比如损失函数loss的可选择项并不相同。把重要参数分为两类,第一类是Boosting框架的重要参数,第二类是弱学习器即CART回归树的重要参数。

第一类:boosting框架参数

首先,我们来看boosting框架相关的重要参数。由于GradientBoostingClassifier和GradientBoostingRegressor的参数绝大部分相同,我们下面会一起来讲,不同点会单独指出。

  1. n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是100。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。
  2. learning_rate: 即每个弱学习器的权重缩减系数ν,也称作步长,在原理篇的正则化章节我们也讲到了,加上了正则化项,我们的强学习器的迭代公式为fk(x)=fk−1(x)+νhk(x)。ν的取值范围为0<ν≤1。对于同样的训练集拟合效果,较小的ν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数n_estimators和learning_rate要一起调参。一般来说,可以从一个小一点的ν开始调参,默认是1。
  3. subsample: 即我们在原理篇的正则化章节讲到的子采样,取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间,默认是1.0,即不使用子采样。
  4. init: 即我们的初始化的时候的弱学习器,拟合对应原理篇里面的f0(x),如果不输入,则用训练集样本来做样本集的初始化分类回归预测。否则用init参数提供的学习器做初始化分类回归预测。一般用在我们对数据有先验知识,或者之前做过一些拟合的时候,如果没有的话就不用管这个参数了。
  5. loss: 即我们GBDT算法中的损失函数。分类模型和回归模型的损失函数是不一样的。
    对于分类模型,有对数似然损失函数"deviance"和指数损失函数"exponential"两者输入选择。默认是对数似然损失函数"deviance"。在原理篇中对这些分类损失函数有详细的介绍。一般来说,推荐使用默认的"deviance"。它对二元分离和多元分类各自都有比较好的优化。而指数损失函数等于把我们带到了Adaboost算法。
    对于回归模型,有均方差"ls", 绝对损失"lad", Huber损失"huber"和分位数损失“quantile”。默认是均方差"ls"。一般来说,如果数据的噪音点不多,用默认的均方差"ls"比较好。如果是噪音点较多,则推荐用抗噪音的损失函数"huber"。而如果我们需要对训练集进行分段预测的时候,则采用“quantile”。
  6. alpha:这个参数只有GradientBoostingRegressor有,当我们使用Huber损失"huber"和分位数损失“quantile”时,需要指定分位数的值。默认是0.9,如果噪音点较多,可以适当降低这个分位数的值。

第二类:弱学习器参数

由于GBDT使用了CART回归决策树,因此它的参数基本来源于决策树类,也就是说,和DecisionTreeClassifier和DecisionTreeRegressor的参数基本类似(见上篇算法梳理1:随机森林)。

9.应用场景

  1. 利用GBDT去产生特征的组合,最后把这些新特征加入原有特征一起训练模型。(例如Facebook用GBDT+LR做CTR预测模型,详见论文“Practical Lessons from Predicting Clicks on Ads at Facebook”)
  2. GBDT是衡量特征的重要性的:计算所有的非叶子节点在分裂时加权不纯度的减少,减少得越多说明特征越重要。
  3. GBDT几乎可用于所有回归问题(线性/非线性),相对logistic regression仅能用于线性回归,GBDT的适用面非常广。亦可用于二分类问题(设定阈值,大于阈值为正例,反之为负例)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值