机器学习(六):集成算法(1)Bagging

来源:互联网 发布:yii框架连接数据库 编辑:程序博客网 时间:2024/06/06 08:57

1.Aggregation概论

1.1 引言

三个臭皮匠,顶个诸葛亮。
假设我们有多个预测模型g1,g2...gT,能不能将这些模型组合起来,获得更好的性能?回想一下,之前我们Validation:是在多个模型中选择出一个好的模型,现在问题变成了:多个模型组合出一个更好的模型。
能不能呢?我们从直观上来看:
这里写图片描述
我们组合是有效果的。

1.2 这么多g是怎么获得的?

这里写图片描述
如果使用H1,H2...HT,那么aggregation算法的模型复杂度则complexity(Tt=1Ht)

1.3 为什么aggregation可以起作用?

最终采用如下形式:

G(x)=1Tt=1Tgt(x)
假设我们试图预测的真实函数为f(x),那么每一个g都可以表示为:
gt(x)=f(x)+ϵt(x)
则G的预测的平方和误差的期望是:
E[(Gf(x))2]=E[(1Tt=1Tϵt(x))2]
,假设误差的均值是0,且不具有相关性,即
E[ϵt(x)]=0,E[ϵt(x)ϵu(x)]=0
则有
E[G(x)]=1TEav,Eav=1Tt=1TE[ϵt(x)2]
即:⼀个模型的平均误差可以仅仅通过对模型的M个版本求平均的⽅式减⼩M倍。不幸的是,它依赖于我们的关键假设,即由各个单独的模型产⽣的误差是不相关的。在实际应⽤中,误差通常是⾼相关的,因此整体的误差下降是通常是很⼩的。然⽽,可以证明,G误差的期望不会超过各个分量模型g的期望误差

1.4 Bootstrap Aggregation(bagging)

假设对于某一个学习算法A,使用无限多不同的数据集Dt来训练,得到无限多的gt,然后使用G,则可以消除学习算法A中的Varaince部分。
然而,通常情况下,我们无法获取如此多的训练数据集,我们通常采用一种叫做Bootstrap的方法来获取数据集:
这里写图片描述

1.5 小结

模型的表现分为Bias和Variance两部分,而aggregation的原理是将Variance部分尽可能的减小。那么这非常适用于如下情况:有一系列low Bias High Variance的模型。——我们可以得到这样一个结论:Aggregation类似于正则化过程。
但是,很显然地,Aggregation有类似于特征转换的部分:
这里写图片描述
这又当如何理解呢?

2. 决策树——CART

决策树的原理非常简单,在此不叙述。给出一个决策树的递归定义:
这里写图片描述
看得出对于决策树,我们只需要做四个决定:1.分支的多少;2.如何进行分支;3.什么时候终止;4.终止时(叶结点)的g。
对于CART,我们选择:
C=2;g——constant:对于分类问题,最多的y;对于回归问题,是y的平均值;
现在还剩两个问题:

2.1 如何进行分支?

因为只有两个分支,我们将数据集D分成两个D1,D2,那么我们选择这样的分支:使得D1,D2的纯度越高越好:

b(x)=argmindecision stumps h(x)c=12|Dcwith h|i˙mpurity(Dcwith h)

这里写图片描述

2.2 什么时候不再进行分支?

这里写图片描述

2.3 CART分类算法

CART回归算法就不再说了,只是impurity不同。

  1. 设结点的训练数据集为D,计算现有特征对该数据集的基尼指数。
  2. 在所有可能的特征A以及它们所有可能的切分点a,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
  3. 对两个子结点递归调用上述两个步骤,直到满足停止条件。
  4. 生成CART树

其中的停止条件是结点中的样本数小于预定阈值,或样本及的基尼指数小于预定阈值,或没有更多特征。

2.4 CART剪枝

这里写图片描述
我们知道,CART基本上来说,一定会过拟合。那么如何来正则化呢?
使用叶结点的个数来表征CART的复杂度,那么很自然地:

J(G)=cost(G)+λ|G|
其中|G|是叶结点的个数。
那么,问题又回到了之前我们讨论正则化时候的情况,使用不同的λ并使用validation来选取即可。

对于CART来说,有更为具体地、我们称之为剪枝的算法。剪枝算法分为两步:

  1. 从生成算法产生的决策树T0底端开始不断剪枝,直到T0的根结点,形成一个子树序列{T0,T1,...,Tn}
  2. 通过交叉验证法在独立的验证数据集上对子树序列进行测试,选择最优子树。

采用如上所述的剪枝步骤,则所有的λ都已经被考虑在内了
证明过程如下:

  • 当λ等于0时,不需要剪枝;当λ无穷大时,根结点组成的单结点树最优;随着λ增大,被剪掉的结点越多;
  • 对于整体树T0开始,对于每一个内部结点t,都有:1)如果剪掉这个以t为根结点的子树,只保留t,此时子树的损失函数是J(t)=cost(t)+λ;2)如果不剪掉,那么子树的损失函数是J(Tt)=cost(Tt)+λ|Tt|。令两者相等,得λ=cost(t)cost(Tt)|Tt|1。当λ小于这个值时,不剪掉t最优;当λ大于这个值时,剪掉最优。
  • 所以我们对每一个内部结点t都计算g(t)=cost(t)cost(Tt)|Tt|1,先从T0剪掉g(t)最小的t子树,得到T1,令λ1=g(t),则T1是区间[λ1,λ2)的最优子树。

[具体参见李航的《统计学习方法》]

3. 随机森林

我们前面介绍了Bagging集成算法;
我们还介绍了决策树算法,我们知道决策树算法1)对训练数据非常敏感;2)可以使Ein非常小——low bias,high variance。
而这两个缺点,恰好能通过Bagging来解决!
Bagging+决策树=随机森林。
这里写图片描述

3.1 随机森林中随机

针对于随机森林,我们不只有bootstrap中的随机选取,还可以再新增加一个层次的random:
这里写图片描述
random subspace——从属性集中随机选择k个属性。

3.2 out-of-bag examples

当我们使用Bagging方法的时候,对于每一个gt我们会发现有一些数据没有用到,这些数据称为gt的out-of-bag(OOB)数据:
这里写图片描述
对于某个gt,都会有大约三分之一的数据OOB:
某个数据属于OOB的概率为:

(11N)N1e

那么这些数据能不能利用一下?
没有被污染的数据我们通常用来干什么呢?validation和test都可以。
但是这里还存在一些问题:
这里写图片描述
我们要validation/test的模型是G,而G由许多g组成,然而每个g的OOB都是不一样的,可能(x(i),y(i))g1中是OOB数据,但是在g2中却是training data。对于这种情况,我们可以采用如下方式:

  • 对于每一个数据(x(i),y(i)),找出此数据是哪些g的OOB数据?假设为g2,g3.gt的OOB数据,那么Gi(x)=average(g2,g3,gt),计算err(y(i),Gi(x(i)))
  • 计算Eoob(G)=1mmi=1err(y(i),Gi(x(i))),用Eoob取代Eval/Etest

我们说对于Bagging方法,它是自验证的。

3.3 随机森林的一个应用——特征选择

假设输入空间有1万个特征,可能很多特征是没用的,这样可能会导致过拟合问题,我们需要选择出我们感兴趣的特征。
譬如说,两个特征可能是重复的,“生日”和“年龄”这两个特征就是重复的;又或者某个特征与我们研究的问题根本没有关系。去除这些特征是有好处的。

上述情况下的特征很好去掉,但是却是完全人工的、完全依赖于研究者的直觉的。如何系统地选择特征?
——我们可以给每个特征计算出一个重要度,我们只使用那些重要度高的特征。
以线性模型为例,我们使用wTx=ni=1wixi这样的形式,那么|wi|就是特征重要度的重要衡量。

可是,对于非线性模型呢?这种方法很明显不再适用。我们可以使用随机森林来计算重要度。
假设对于某个特征,如果它是“重要”的,那么如果我们在数据的这个特征维度上使用随机值,那么模型的性能必然降低。这称为random test:
这里写图片描述
这里需要注意的问题是:如何获取某个特征的随机值?一种想法是使用诸如随机分布、高斯分布之类的概率模型来产生数据,然而这样做的问题是:我们选取的概率模型可能不是此特征的真是概率模型。

所以我们采用例如bootstrap的方法:将训练数据这个特征的数据全部打乱排序,获取新的数据集D’,自然而言的:

importance(i)=performance(D)performance(D)
根据之前OOB的讨论:
importance(i)=Eoob(G)Eoob(G)

3.4 小结

我们可以看到,随机森林并不复杂,而且虽然OOB和特征选择这两个主题是在随机森林这里引申的,但是却不仅仅是适用于随机森林。OOB适用于所有的Bagging方法;而特征选择的random test适用于任何机器学习算法。

4. 小结

正如我们之前所说的,Bagging这种形式的组合方式,限制太多,在实际应⽤中,误差通常是高度相关的,因此整体的误差下降是通常是很⼩的。为了得到更显著的提升,我们转向⼀种更加复杂的组合的⽅法,被称为提升⽅法。

0 0