1.前向分布算法
基本思想:每次只学习一个基函数及系数,逐步逼近最优解。
如下所示:
其中 为基函数,为基函数系数,为基函数的参数,这样只需要给定训练集与损失函数
就可以利用最小化损失函数的原理进行学习,这样每次新一轮的学习只需要学习一个基函数的参数与对应的系数。
一个栗子:小明有100个苹果,小红第一次猜1*50个,剩余50个没猜对(残差),下一次小红猜有1*50 + 2*10个,残差30,如此反复下去,小红会逐渐向正确答案靠拢。其中第一二次中的1*50和2*10中的1,2就相当于系数,50和10可以理解为
2.负梯度拟合与回归
顾名思义,就是在损失函数梯度的负方向上进行学习,至于是怎么在负梯度方向上学习的呢?下面搬运的是台大Hsuan-Tien Lin教授所讲的梯度提升视频里面的内容,我觉得相对容易理解一些。
这是上文所提到的最小化所示函数的过程。这里先看基函数的学习过程(以平方损失函数为例):
这里的看做一个项,根据泰勒展开可得:
这里的为常数,那么要求的方向的话,只需要求上式子中负方向即可。到此,梯度方向的问题解决了,那么要怎么求得呢?
我们知道,的大小我们并不介意,因为后面我们要给它一个系数也就是上式中的去调整它。所以,我们希望它小一点,但是方向是对的就可以。所以可以在优化过程中添加一个损失项,那么上式就变成:
通过变换,可以发现我们最终只需要将设置为一个对残差的回归即可。我理解为,这是一种正则化的方式。接下来需要调整,确定一个合适的步长。在找到合适的,上面式子可以转化成
可以看到,这个又是一个回归问题,只不过这个回归是单变量线性回归。以上就是负梯度拟合的过程
在GBDT中,这里设置一个回归树对残差进行拟合,然后对该树的各叶子节点区域分别给定一个最优的“局部残差”,继而更新强学习器。
3.正则化
GBDT正则化主要有三种方法。
(1)对样本设置采样比例,可以减小方差,但是采样率太小回增大bias
(2)添加learning rate
(3)对子树进行正则化剪枝
4.二分类、多分类问题
在参考【2】中有详细介绍,后期会继续学习、搬运过来
5.优缺点
优点:
- 精度高
- 能处理非线性数据
- 能处理多特征类型
- 适合低维稠密数据
缺点:
- 不好并行处理(因为上下两颗树有联系)
- 多分类的时候 复杂度很大
6.sklearn参数
1) n_estimators: 也就是弱学习器的最大迭代次数,或者说最大的弱学习器的个数。
2) learning_rate: 即每个弱学习器的权重缩减系数νν,也称作步长,默认是1。
3) subsample: 即我们在原理篇的正则化章节讲到的子采样,取值为(0,1]。默认是1.0,即不使用子采样。
4) 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,如果噪音点较多,可以适当降低这个分位数的值。
调参实例:
https://github.com/zzzzzzhang/Datawhale_learn/blob/master/GBDT_cla.py
参考
【1】台大机器学习视频