集成方法

 

1、集成方法概述

  集成学习(Ensemble Learning)有时也被笼统地称作提升(Boosting)方法,广泛用于分类和回归任务。它最初的思想很简单:使用一些(不同的)方法改变原始训练样本的分布,从而构建多个不同的分类器,并将这些分类器线性组合得到一个更强大的分类器,来做最后的决策。也就是常说的“三个臭皮匠顶个诸葛亮”的想法。

  集成学习的理论基础来自于Kearns和Valiant提出的基于PAC(probably approximately correct)的可学习性理论 ,PAC 定义了学习算法的强弱:

弱学习算法:识别错误率小于1/2(即准确率仅比随机猜测略高的算法) 
强学习算法:识别准确率很高并能在多项式时间内完成的算法

对于集成学习,我们面临两个主要问题: 
1.如何改变数据的分布或权重 
2.如何将多个弱分类器组合成一个强分类器

集成方法通常分为两种:

  • 平均方法,该方法的原理是构建多个独立的估计器,然后取它们的预测结果的平均。一般来说组合之后的估计器是会比单个估计器要好的,因为它的方差减小了。

    示例: Bagging 方法 , 随机森林 , …

  • 相比之下,在 boosting 方法 中,基估计器是依次构建的,并且每一个基估计器都尝试去减少组合估计器的偏差。这种方法主要目的是为了结合多个弱模型,使集成的模型更加强大。

    示例: AdaBoost , 梯度提升树 , …

  •  Stacking算法,使用较少

2、Boosting方法

2.1 概述

  Boosting方法是一种典型的基于bootstrapping思想的应用,其特点是:每一次迭代时训练集的选择与前面各轮的学习结果有关,而且每次是通过更新各个样本权重的方式来改变数据分布。总结起来如下:

1.分步学习每个弱分类器,最终的强分类器由分步产生的分类器组合而成 
2.根据每步学习到的分类器去改变各个样本的权重(被错分的样本权重加大,反之减小)

Boosting算法要解决的问题:

    1)如何计算学习误差率e?

    2) 如何得到弱学习器权重系数αα?

    3)如何更新样本权重D?

    4) 使用何种结合策略?

只要是boosting大家族的算法,都要解决这4个问题。那么Adaboost是怎么解决的呢?

 

2.2 Adaboosting

2.2.1 总体流程

  AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由Yoav Freund和Robert Schapire在1995年提出。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。

    具体说来,整个Adaboost 迭代算法就3步:

  1. 初始化训练数据的权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N。
  2. 训练弱分类器。具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被降低;相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。(a的更新)
  3. 将各个训练得到的弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。(D权重的更新)

算法过程如下:

其中Zi是归一化因子,即分子的和,使得出的D为概率。

 

2.2.2 解决4个问题的具体推导过程:

假设我们的训练集样本是

\(T={(x_,y_1),(x_2,y_2), ...(x_m,y_m)}\)

训练集的在第k个弱学习器的输出权重为

 \(D(k) = (w_{k1}, w_{k2}, ...w_{km}) ;\;\; w_{1i}=\frac{1}{m};\;\; i =1,2...m\)

首先我们看看Adaboost的分类问题。

  分类问题的误差率很好理解和计算。由于多元分类是二元分类的推广,这里假设我们是二元分类问题,输出为{-1,1},则第k个弱分类器\(G_k(x)\)在训练集上的加权误差率为

\(e_k = P(G_k(x_i) \neq y_i) = \sum\limits_{i=1}^{m}w_{ki}I(G_k(x_i) \neq y_i)\)

接着我们看弱学习器权重系数,对于二元分类问题,第k个弱分类器\(G_k(x)\)的权重系数为

\(\alpha_k = \frac{1}{2}log\frac{1-e_k}{e_k}\)

  为什么这样计算弱学习器权重系数?从上式可以看出,如果分类误差率ek越大,则对应的弱分类器权重系数αk越小。也就是说,误差率小的弱分类器权重系数越大。具体为什么采用这个权重系数公式,我们在讲Adaboost的损失函数优化时再讲。

第三个问题,更新更新样本权重D。假设第k个弱分类器的样本集权重系数为\(D(k) = (w_{k1}, w_{k2}, ...w_{km})\)则对应的第k+1个弱分类器的样本集权重系数为

\(w_{k+1,i} = \frac{w_{ki}}{Z_K}exp(-\alpha_ky_iG_k(x_i))\)

这里Zk是规范化因子

\(Z_k = \sum\limits_{i=1}^{m}w_{ki}exp(-\alpha_ky_iG_k(x_i))\)

  从该公式看出,如果第i个样本分类错误,则yiGk(xi)<0,导致样本的权重在第k+1个弱分类器中增大,如果分类正确,则权重在第k+1个弱分类器中减少.

 最后一个问题是集合策略。Adaboost分类采用的是加权平均法,最终的强分类器为

\(f(x) = sign(\sum\limits_{k=1}^{K}\alpha_kG_k(x))\)

 

接着我们看看Adaboost的回归问题。

由于Adaboost的回归问题有很多变种,这里我们以Adaboost R2算法为准。

我们先看看回归问题的误差率的问题,对于第k个弱学习器,计算他在训练集上的最大误差

\(E_k= max|y_i - G_k(x_i)|\;i=1,2...m\)

 然后计算每个样本的相对误差

\(e_{ki}= \frac{\left |y_i - G_k(x_i) \right |}{E_k}\)

这里是误差损失为线性时的情况,如果我们用平方误差,则

\(e_{ki}= \frac{(y_i - G_k(x_i))^2}{E_k^2}\)

如果我们用的是指数误差,则

\(e_{ki}= 1 - exp(\frac{-y_i + G_k(x_i))}{E_k})\)

最终得到第k个弱学习器的误差率

\(e_k =  \sum\limits_{i=1}^{m}w_{ki}e_{ki}\)

我们再来看看如何得到弱学习器权重系数α。这里有

\( \alpha_k = \frac{e_k}{1-e_k} \)

对于更新更新样本权重D,第k+1个弱学习器的样本集权重系数为

\(w_{k+1,i} = \frac{w_{ki}}{Z_k}\alpha_k^{1-e_{ki}}\)

 这里Zk是规范化因子

\(Z_k = \sum\limits_{i=1}^{m}w_{ki}\alpha_k^{1-e_{ki}}\)

 

最后是结合策略,和分类问题稍有不同,采用的是对加权的弱学习器取中位数的方法,最终的强回归器为

\(f(x) = \sum\limits_{k=1}^{K}(ln\frac{1}{\alpha_k})g(x)\)

 其中,g(x)是所有\(\alpha_kG_k(x), k=1,2,....K\)的中位数。

 

2.2.3 AdaBoost分类问题的损失函数优化

刚才上一节我们讲到了分类Adaboost的弱学习器权重系数公式和样本权重更新公式。但是没有解释选择这个公式的原因,让人觉得是魔法公式一样。其实它可以从Adaboost的损失函数推导出来。

从另一个角度讲, Adaboost是模型为加法模型,学习算法为前向分步学习算法,损失函数为指数函数的分类问题。

模型为加法模型好理解,我们的最终的强分类器是若干个弱分类器加权平均而得到的。

前向分步学习算法也好理解,我们的算法是通过一轮轮的弱学习器学习,利用前一个弱学习器的结果来更新后一个弱学习器的训练集权重。

 

 

 

 

 

 

 2.2 GBDT

 

3、Bagging方法

3.1 bagging概述

Bagging (bootstrap aggregating) 方法完全基于bootstrapping思想,即把训练集看做全体数据的子集,训练集对全体数据中某参数的估计等价于用训练集子采样获得的数据来估计训练集。其中,每一次迭代前,采用有放回的随机抽样来获取训练数据。这样做直接体现了bagging的一大特点:每次迭代不依赖之前建立的模型,即生成的各个弱模型之间没有关联,因此就可以彻底实现数据并行训练。这是bagging方法与上述boosting方法最大的区别。

对于一个样本,在一次含m个样本的训练集的随机采样,每次被抽到的概率是1/m。不被抽到的概率为1−1/m。如果m次采样都没有被抽到的概率是(1−1/m)mm。当m→∞时,(1−1/m)mm→1e≃0.368。就是说,在bagging的每轮随机采样中,训练集中大约有36.8%的数据没有被采样集抽到。这大约36.8%的没有被采样到的数据,我们常常称之为袋外数据(Out Of Bag, OOB)。这些数据没有参与训练集模型的拟合,因此可作为验证集检验模型的效果。

和boosting方法一样,bagging方法常用的基本模型也是决策树和神经网络,而且基本模型越简单,往往最终的集成模型泛化能力越强,越不易发生过拟合。模型组合的方法也很简单,对于分类任务,一般采用多数投票;对于回归任务,则采用算术平均法。

 

bagging 方法有很多种,其主要区别在于随机抽取训练子集的方法不同:

  • 如果抽取的数据集的随机子集是样例的随机子集,我们叫做粘贴 (Pasting) [B1999] 。
  • 如果样例抽取是有放回的,我们称为 Bagging [B1996] 。
  • 如果抽取的数据集的随机子集是特征的随机子集,我们叫做随机子空间 (Random Subspaces) [H1998] 。
  • 最后,如果基估计器构建在对于样本和特征抽取的子集之上时,我们叫做随机补丁 (Random Patches) [LG2012] 。

3.2 boosting和bagging的比较

Boosting利用前一轮迭代的误差率(或残差)进行拟合训练(相当于改变原始样本的权重),每轮的训练集分布依赖之前的训练结果,因而每轮模型只能顺序生成。主要关注降低偏差,因此Boosting能基于泛化性能很弱的分类器构建出很强的集成模型。

Bagging采取对原始样本有放回的均匀抽样方式获取每一次的数据来训练,每轮训练集相互独立,因而模型可以并行生成。主要关注降低方差,因此它在不剪枝的决策树、神经网络等弱模型上效果更好。

3.3 随机森林

随机森林(Random Forest)算法由上世纪八十年代Breiman等人提出来,基本思想就是构造多棵相互独立的CART决策树,形成一个森林,利用这些决策树共同决策输出类别。随机森林算法秉承了bagging方法的思想,以构建单一决策树为基础,同时也是单一决策树算法的延伸和改进。

在整个随机森林算法的过程中,有两个随机过程:

1.输入数据是随机的:从全体训练数据中选取一部分来构建一棵决策树,并且是有放回的选取 

2.每棵决策树的构建所需的特征是从全体特征中随机选取的

 

随机森林算法具体流程: 
1.从原始训练数据中随机选取n个数据作为训练数据输入(通常n远小于全体训练数据N,这样就存在一部分“袋外数据”始终不被取到,它们可以直接用于测试误差(而无需单独的测试集或验证集)。 
2.选取了要输入的训练数据后,开始构建决策树,具体方法是每一个结点从全体特征集M中选取m个特征进行构建(通常m远小于M)。 
3.在构造每棵决策树时,选取基尼指数最小的特征来分裂节点构建决策树。决策树的其他结点都采取相同的分裂规则进行构建,直到该节点的所有训练样例都属于同一类或者达到树的最大深度。(该步骤与构建单一决策树相同) 
4.重复第2步和第3步多次,每一次输入数据对应一颗决策树,这样就得到了一个随机森林,用于对预测数据进行决策。 
5.对待预测数据进行预测时,多棵决策树同时进行决策,采用多数投票的方式产生最终决策结果。

 

随机森林的优点: 
1.两个随机性的引入,使得随机森林抗噪声能力强,方差小泛化能力强,不易陷入过拟合(因此不需要剪枝) 
2.易于高度并行训练,且训练速度快,适合处理大数据 
3.由于可以随机选择决策树节点划分的特征,因此能够处理高维度(特征多)的数据,事先不用做特征选择;而且连续和离散数据均可,且无需归一化数据。 
4.创建随机森林时,是对参数的无偏估计 
5.训练后,可以给出各个特征对于输出结果的重要性排序,并且能够检测到特征间的相互影响 
6.相对于boosting系列算法,实现简单 
7.对部分特征缺失不敏感 
8.由于随机森林对误差率是无偏估计,因此在算法中不需要再进行交叉验证或者设置单独的测试集来获取测试集上误差的无偏估计

随机森林的缺点: 
对于取值划分比较多的特征,容易对随机森林的决策产生较大影响,从而影响拟合效果。

 

4、stacking方法

 

 

 

 

posted @ 2018-08-02 00:21  热之雪  阅读(678)  评论(0编辑  收藏  举报