集成学习
集成思想主要分为两大流派,Boosting一族通过将弱学习器提升为强学习器的集成方法来提高预测精度(典型算法为AdaBoost);而另一类则为Bagging,即通过自助采样的方法生成众多并行式的分类器,通过“少数服从多数”的原则来确定最终的结果(典型算法为随机森林)
Bagging
Bagging也叫自举汇聚法(bootstrap aggregating),此类算法可以有效降低variance,其算法过程如下:
- 从原始样本集中抽取训练集。每轮从原始样本集中使用
Bootstraping
的方法有放回抽取n个训练样本(未被抽到的1/3的样本构成袋外数据OOB)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)- 每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)
- 对
分类
问题:将上步得到的k个模型采用投票
的方式得到分类结果;对回归
问题,计算上述模型的均值
作为最后的结果。(所有模型的重要性相同)
Bagging: 随机森林
算法思想
随机森林只是将使用CART决策树作为弱学习器的Bagging方法称为随机森林,特征随机性,相对于一般的Bagging算法,RF会选择采集和训练集样本数N一样个数的样本。
【特点】由于随机性,对于降低模型的方差很有作用,故随机森林一般不需要额外做剪枝,即可以取得较好的泛化能力和抗过拟合能力(Low Variance)。当然对于训练集的拟合程度就会差一些,也就是模型的偏倚会大一些(High Bias)。
【基尼系数】的选择的标准就是每个子节点达到最高的纯度,即落在子节点中的所有观察都属于同一个分类,此时基尼系数最小,纯度最高,不确定度最小,数据分割越彻底,越干净。
RF优点:
- 由于采用了集成算法,本身精度比大多数单个算法要好 ;
- 在测试集上表现良好,由于两个随机性(样本随机、特征随机)的引入,使得随机森林不容易陷入过拟合(样本随机,特征随机) ;
- 在工业上,由于两个随机性的引入,使得随机森林具有一定的抗噪声能力,对比其他算法具有一定优势 ;
- 由于树的组合,使得随机森林可以处理非线性数据,本身属于非线性分类(拟合)模型 ;
- 它能够处理很高维度(feature很多)的数据,并且不用做特征选择,对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化 ;
- 训练速度快,可以运用在大规模数据集上 ;
- 可以处理缺省值(单独作为一类),不用额外处理 ;
- 由于有袋外数据(OOB),可以在模型生成过程中取得真实误差的无偏估计,且不损失训练数据量 ;
- 在训练过程中,能够检测到feature间的互相影响,且可以得出feature的重要性,具有一定参考意义 ;
- 由于每棵树可以独立、同时生成,容易做成并行化方法 ;
- 由于实现简单、精度高、抗过拟合能力强,当面对非线性数据时,适于作为基准模型。
Boosting(提升方法)
算法思想:
从弱学习算法出发,反复学习,得到一系列弱(基本)分类器,然后组合这些弱分类器,构成一个强分类器,大多数的提升方法都是改变训练数据的概率分布(训练数据的权值分布),针对不同的训练数据调用弱学习算法学习一系列弱分类器。
实际上采用:加法模型(基函数的线性组合)与前向分步算法。
两个问题:
- 在每一轮如何改变训练数据的权值或概率分布 ?
答:AdaBoost的做法是,提高那些被前一轮弱分类器错误分类样本的权值
。降低那些被正确分类样本的权值。- 如何将弱分类器组合成一个强分类器?
答:AdaBoost的做法是,加权多数表决
,加大分类误差率小的弱分类器的权值,减小分类误差率大的弱分类器的权值。
Boosting: AdaBoost
算法思想:
通过迭代每次学习一个基本分类器,每次迭代中,使用全部的样本,改变
样本的权重
,提高那些被前一轮弱分类器错误分类样本的权值,降低那些被正确分类样本的权值。最后,将基本分类器线性组合作为强分类器,其中给分类误差率小的弱分类器以大的权值,给分类误差率大的弱分类器以小的权值。
每次迭代可以减少它在训练数据集上的分类误差率。
停止条件:当
残差足够小
或者达到设置的最大迭代次数
则停止。
AdaBoost的另一种解释:
模型为
加法模型
,损失为指数函数
,学习算法为前向分步算法
(AdaBoost是前向分步算法的特例)。
Boosting: 提升树 boosting tree
被认为是统计学习中最有效的方法之一。
算法思想:
提升树模型采用加法模型(基函数的线性组合)与前向分步算法,同时基函数采用决策树算法,对待分类问题采用二叉分类树,对于回归问题采用二叉回归树。提升树模型可以看作是决策树的加法模型。
对决策树的参数Θ的确定采用经验风险最小化来确定:对于不同的问题采用的损失函数不同。对于分类问题,在决策树中使用的就是0/1损失函数,和前面的adaBoost中的关于分类的推导相同。对回归问题来说,一般采用平方误差函数。
Boosting: 梯度提升树GBDT
算法思想及理解:
一方面可以从
残差
的角度来理解,每一棵回归树都是在学习之前的树的残差;(使用代价函数对上一轮训练出的模型函数f的偏导来拟合残差。)
一方面可以从梯度
的角度掌握算法,即每一棵回归树通过梯度下降法学习之前的树的梯度下降值。
相同点:这两种理解角度从总体流程和输入输出上没有区别的,它们都是迭代回归树,都是累加每棵树结果作为最终结果,每棵树都在学习前面树尚存的不足。
不同点:每一步迭代时的求解方法的不同。
- 前者使用
残差(残差是全局最优值)
,每一步都试图向最终结果方向优化。- 后者使用
梯度(梯度是局部最优方向)
,每一步试图让当前结果更好一点。
看起来前者更科学一点,毕竟有绝对最优方向不学,为什么舍近求远去估计一个局部最优方向呢?原因在于灵活性。
前者最大问题是,由于它依赖残差,损失函数一般固定为反映残差的均方差,因此很难处理纯回归问题之外的问题。而后者求解方法为梯度下降,只要可求导的损失函数都可以使用。
优缺点:
- 优点:预测精度高、适合低维数据、能处理非线性数据。
- 缺点:并行麻烦(因为上下两棵树有联系)如果数据维度较高时会加大算法的计算复杂度。
梯度提升树GBDT 主要由三个概念组成:
- Regression Decistion Tree 回归树
- Gradient Boosting 梯度提升
- Shrinkage 缩减
Regression Decistion Tree 回归树:
GBDT中的所有决策树都是
回归树
,而非分类树。以ID3为例,穷举每一个属性特征的信息增益值,每一次都选取使信息增益最大的特征进行分枝,直到分类完成或达到预设的终止条件,实现决策树的递归构建。
- 回归树的每个节点得到的是一个预测值而非分类树式的样本计数。
- 在分枝节点的选取上,回归树并没有选用最大熵值来作为划分标准,而是使用了最小化均方差。
一般来讲,回归树的分枝不太可能实现每个叶子节点上的属性值都唯一,更多的是达到我们预设的终止条件即可(例如叶子个数上限),这样势必会存在多个属性取值,那么该节点处的预测值自然就为基于这些样本所得到的平均值了。
Gradient Boosting 梯度提升:
GB基本思想为:沿着梯度方向,构造一系列的弱分类器函数,并以一定权重组合起来,形成最终决策的强分类器。每一棵树所学习的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。利用最速下降的近似方法,即利用损失函数的负梯度在当前模型的值,作为回归问题中提升树算法的残差的近似值,拟合一个回归树。
举个例子,同样使用年龄进行分枝,假设我们A的真实年龄是18岁,但第一棵树的预测年龄是12岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁……以此类推学习下去,这就是梯度提升在GBDT算法中的直观意义。
Shrinkage 缩减:
Shrinkage思想:每次走一小步逐渐逼近结果的效果,要比每次迈一大步很快逼近结果的方式更容易避免过拟合。换句话说缩减思想不完全信任每一个棵残差树,它认为每棵树只学到了真理的一小部分,累加的时候只累加一小部分,只有通过多学几棵树才能弥补不足。
Bagging,Boosting二者之间的区别
1)样本选择上:
- Bagging:训练集是在原始集中采用
Bootstrap有放回抽样
,从原始集中选出的各轮训练集之间是独立的。- Boosting:
每一轮的训练集不变
,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2)样例权重:
- Bagging:使用均匀取样,每个样例的
权重相等
。- Boosting:根据错误率不断调整样例的权值,
错误率越大则权重越大
。
3)预测函数:
- Bagging:所有预测函数的权重相等。
- Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
4)集成学习方法:
- Bagging:
并行化方法
各个预测函数可以并行生成。
Boosting:序列化方法
各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
Bagging + 决策树 =
随机森林
AdaBoost(提升方法) + 决策树 =提升树
Gradient Boosting + 决策树 =GBDT(梯度提升树)
5)划重点
为什么说bagging是减少variance,而boosting是减少bias?
- Bagging对样本重采样,对每一重采样得到的子样本集训练一个模型,最后取平均。由于子样本集的相似性以及使用的是同种模型,因此各模型有近似相等的bias和variance(事实上,各模型的分布也近似相同,但不独立)。由于:
所以bagging后的bias和单个子模型的接近,一般来说不能显著降低bias。
另一方面,若各子模型独立,可以显著降低variance
:若各子模型完全相同,此时不会降低variance
:bagging方法得到的各子模型是有一定相关性的,属于上面两个极端状况的中间态,因此可以一定程度降低variance。
为了进一步降低variance,Random forest通过随机选取变量子集做拟合的方式de-correlated了各子模型(树),使得variance进一步降低。
- boosting从优化角度来看,是用
forward-stagewise
这种贪心法
去最小化损失函数 。
常见的AdaBoost即等价于用这种方法最小化exponential loss:所谓forward-stagewise,就是在迭代的第n步,求解新的子模型f(x)及步长a(或者叫组合系数),来最小化:这里fn-1(x)是前n-1步得到的子模型的和。
因此boosting是在sequential地最小化损失函数,其bias自然逐步下降。
但由于是采取这种sequential、adaptive的策略,各子模型之间强相关
,于是子模型之和并不能显著降低variance
。所以说boosting主要还是靠降低bias来提升预测精度。
【参考资料】
- 【CSDN】http://www.cnblogs.com/earendil/p/8872001.html
- 《统计学习方法》ch8. 李航