总述
GBDT(gradient boosting decision tree)梯度提升决策树,是属于boosting集成算法的一类。bagging算法是每个个体学习器的样本是存在差异的,但是boosting每个个体学习器的样本是不变,但是每次迭代的样本权重是不同的。Adabost算法也是boosting算法之一,它是根据上一次的误差修改此次训练的样本权重,不断的迭代实现误差接近于零。而GBDT算法采用前向分布算法。
前向分布算法
输入数据: 训练数据集T ={(x1,y1), (x2, y2), …, (xN, yN)};损失函数L(y, f(x));基函数集{b(x; r)};
输出: 加法模型f(x)
因此,前向分布算法将同时求解从m=1到M的所有参数βm, rm的优化问题简化为逐次求解各个βm, rm的优化问题。
负梯度拟合
在Boosting tree提升树提到,当采用平方误差函数时,下一个模型拟合的就是上一个模型的残差,当损失函数不是平方误差函数,是指数损失函数、绝对损失呢?
GBDT的梯度提升体现在构建cart树所需的负梯度阶段,这个时候基学习器拟合前一轮模型损失函数的负梯度,而不是残差,残差是损失函数的其中一种情况,因此负梯度也被称为“响应 (response)”或“伪残差 (pseudo residual)”,从名字可以看出是一个与残差接近的概念。
损失函数
1.分类问题损失函数
对于分类算法,其损失函数一般有对数损失函数和指数损失函数两种:
(1)如果是指数损失函数,则损失函数表达式为
(2)如果是对数损失函数,分为二元分类和多元分类两种,
对于二元分类
2.回归问题损失函数
对于回归算法,常用损失函数有如下4种:
(1)均方差,这个是最常见的回归损失函数了
(2)绝对损失,这个损失函数也很常见
(3)Huber损失,它是均方差和绝对损失的折衷产物,对于远离中心的异常点,采用绝对损失,而中心附近的点采用均方差。这个界限一般用分位数点度量。
(4)分位数损失。它对应的是分位数回归的损失函数。
回归
回归,指研究一组随机变量(Y1 ,Y2 ,…,Yi)和另一组(X1,X2,…,Xk)变量之间关系的统计分析方法,又称多重回归分析。通常Y1,Y2,…,Yi是因变量,X1、X2,…,Xk是自变量。
输入:训练样本 D={(x1,y1),(x2,y2),⋯,(xm,ym)}D={(x1,y1),(x2,y2),⋯,(xm,ym)},最大迭代次数(基学习器数量) T,损失函数 L
输出:强学习器 H(x)
算法流程:
二分类,多分类
对于二元GBDT,如果用类似于逻辑回归的对数似然损失函数,则损失函数为:
其中,y∈{−1,+1}。此时的负梯度误差是 :
对于生成的决策树,我们各个叶子节点的最佳残差拟合值为 :
由于上式比较难优化,我们一般使用近似值代替:
除了负梯度计算和叶子节点的最佳残差拟合的线性搜索,二元GBDT分类和GBDT回归算法过程相同。
正则化
- Shrinkage (缩减)
在每一轮迭代获取最终学习器的时候按照一定的步长进行更新。
Shrinkage的思想认为,每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它不完全信任每一个棵cart树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,通过多学几棵树弥补不足。
宁肯慢一点,一步一步往下降。 - subsample(子采样)
取值为(0,1],采用的不放回采样,如果取值为1,则全部样本都使用,等于没有使用子采样,如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。 - 基函数剪枝
CART回归树进行正则化剪枝。
优缺点
GBDT主要的优点有:
- 可以灵活处理各种类型的数据,包括连续值和离散值。
- 在相对少的调参时间情况下,预测的准确率也可以比较高。这个是相对SVM来说的。
- 使用一些健壮的损失函数,对异常值的鲁棒性非常强。比如 Huber损失函数和Quantile损失函数。
GBDT的主要缺点有:
- 由于弱学习器之间存在依赖关系,难以并行训练数据。不过可以通过自采样的SGBT来达到部分并行。
Sklearn参数
在sacikit-learn中,GradientBoostingClassifier为GBDT的分类类, 而GradientBoostingRegressor为GBDT的回归类。两者的参数类型完全相同,当然有些参数比如损失函数loss的可选择项并不相同。这些参数中,类似于Adaboost,我们把重要参数分为两类,第一类是Boosting框架的重要参数,第二类是弱学习器即CART回归树的重要参数。
- n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。一般来说n_estimators太小,容易欠拟合,n_estimators太大,又容易过拟合,一般选择一个适中的数值。默认是100。在实际调参的过程中,我们常常将n_estimators和下面介绍的参数learning_rate一起考虑。
- learning_rate: 即每个弱学习器的权重缩减系数νν,也称作步长,在原理篇的正则化章节我们也讲到了,加上了正则化项,我们的强学习器的迭代公式为fk(x)=fk−1(x)+νhk(x)fk(x)=fk−1(x)+νhk(x)。νν的取值范围为0<ν≤10<ν≤1。对于同样的训练集拟合效果,较小的νν意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。所以这两个参数n_estimators和learning_rate要一起调参。一般来说,可以从一个小一点的νν开始调参,默认是1。
- subsample: 即我们在原理篇的正则化章节讲到的子采样,取值为(0,1]。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。如果取值为1,则全部样本都使用,等于没有使用子采样。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。推荐在[0.5, 0.8]之间,默认是1.0,即不使用子采样。
- init: 即我们的初始化的时候的弱学习器,拟合对应原理篇里面的f0(x)f0(x),如果不输入,则用训练集样本来做样本集的初始化分类回归预测。否则用init参数提供的学习器做初始化分类回归预测。一般用在我们对数据有先验知识,或者之前做过一些拟合的时候,如果没有的话就不用管这个参数了。
- loss: 即我们GBDT算法中的损失函数。分类模型和回归模型的损失函数是不一样的。
对于分类模型,有对数似然损失函数"deviance"和指数损失函数"exponential"两者输入选择。默认是对数似然损失函数"deviance"。在原理篇中对这些分类损失函数有详细的介绍。一般来说,推荐使用默认的"deviance"。它对二元分离和多元分类各自都有比较好的优化。而指数损失函数等于把我们带到了Adaboost算法。
对于回归模型,有均方差"ls", 绝对损失"lad", Huber损失"huber"和分位数损失“quantile”。默认是均方差"ls"。一般来说,如果数据的噪音点不多,用默认的均方差"ls"比较好。如果是噪音点较多,则推荐用抗噪音的损失函数"huber"。而如果我们需要对训练集进行分段预测的时候,则采用“quantile”。 - alpha:这个参数只有GradientBoostingRegressor有,当我们使用Huber损失"huber"和分位数损失“quantile”时,需要指定分位数的值。默认是0.9,如果噪音点较多,可以适当降低这个分位数的值。
应用场景
业界中,Facebook使用其来自动发现有效的特征、特征组合,来作为LR模型中的特征,以提高 CTR预估(Click-Through Rate Prediction)的准确性;GBDT在淘宝的搜索及预测业务上也发挥了重要作用
参考资料
- 梯度提升树(GBDT)原理小结 https://www.cnblogs.com/pinard/p/6140514.html
- scikit-learn 梯度提升树(GBDT)调参小结 https://www.cnblogs.com/pinard/p/6143927.html
- 机器学习算法梳理—GBDT算法
https://www.smwenku.com/a/5c3268cebd9eee35b21cbdee/zh-cn - 算法梳理五:GBDT
https://zhuanlan.zhihu.com/p/52958501