10 集成学习
10.1 Boosting(提升法)
梯度提升算法首先给定一个目标损失函数,它的定义域是所有可行的弱函数集合;提升算法通过迭代的选择一个负梯度方向上的基函数来逐渐逼近局部最小值。
提升的理论意义:如果一个问题存在弱分类器,则可以通过提升的办法得到强分类器。
基本思想:一个接一个的(串行)训练基学习器,每一个基学习器主要用来修正前面学习器的偏差。
10.1.1 梯度提升(GBDT)
DT表示使用决策树作为基学习器,使用的CART树。GBDT是迭代,但GBDT每一次的计算是都为了减少上一次的残差,进而在残差减少(负梯度)的方向上建立一个新的模型,其弱学习器限定了只能使用CART回归树模型。 残差=(实际值-预测值)
10.1.1.1 GBDT是训练过程如何选择特征?
GBDT使用基学习器是CART树,CART树是二叉树,每次使用yes or no进行特征选择,数值连续特征使用的最小均方误差,离散值使用的gini指数。在每次划分特征的时候会遍历所有可能的划分点找到最有的特征分裂点,这是用为什么gbdt会比rf慢的主要原因之一。
10.1.1.2 GBDT如何防止过拟合?
一般使用缩减因子对每棵树进行降权,可以使用带有dropout的GBDT算法,dart树,随机丢弃生成的决策树,然后再从剩下的决策树集中迭代优化提升树。
GBDT与Boosting区别较大,它的每一次计算都是为了减少上一次的残差,而为了消除残差,可以在残差减小的梯度方向上建立模型;
在GradientBoost中,每个新的模型的建立是为了使得之前的模型的残差往梯度下降的方法。
10.1.1.3 梯度提升的如何调参?
1. 首先我们从步长(learning rate)和迭代次数(n_estimators)入手。
开始选择一个较小的步长来网格搜索最好的迭代次数。将步长初始值设置为0.1;
2. 找到了一个合适的迭代次数,对决策树进行调参。首先对决策树最大深度max_depth和内部节点再划分所需最小样本数(min_samples_split)进行网格搜索。
再对min_samples_split和叶子节点最少样本数(min_samples_leaf)一起调参。
得出: {'min_samples_leaf': 60, 'min_samples_split': 1200},
3.对比最开始完全不调参的拟合效果,可见精确度稍有下降,主要原理是我们使用了0.8的子采样,20%的数据没有参与拟合。
需要再对最大特征数(max_features)进行网格搜索。
10.1.1.4 GBDT对标量特征要不要one-hot编码?
从效果的角度来讲,使用category特征和one-hot是等价的,所不同的是category特征的feature空间更小。微软在lightGBM的文档里也说了,category特征可以直接输入,不需要one-hot编码,准确度差不多,速度快8倍。而sklearn的tree方法在接口上不支持category输入,所以只能用one-hot编码。
10.1.1.5 为什么GBDT用负梯度当做残差?
1. 负梯度的方向可证,模型优化下去一定会收敛
2. 对于一些损失函数来说最大的残差方向,并不是梯度下降最好的方向,倒是损失函数最小与残差最小两者目标不统一
10.1.2 自适应提升(AdaBoost)
定义: 是一种提升方法,将多个弱分类器,组合成强分类器。
Adaboost既可以用作分类,也可以用作回归。
算法实现:
1.提高上一轮被错误分类的样本的权值,降低被正确分类的样本的权值;
2.线性加权求和。误差率小的基学习器拥有较大的权值,误差率大的基学习器拥有较小的权值。