机器学习初探(四)集成学习
“集成”的思想
-
众擎易举
集成学习基于这样的思想:对于比较复杂的任务,综合许多人的意见来进行决策会比“一家独大”要更好。换句话说,就是通过适当的方式集成许多“个体模型”得到的最终模型要比单独的“个体模型”的性能更优。可以通过下图来直观感知这个过程。
此时,问题的关键转化为两点:如何选择、生成弱分类器和如何对他们进行提升(集成)。针对以上问题,有三种思路:
(1)将不同类型的弱分类器进行提升
(2)将相同类型但参数不同的弱分类器进行提升
(3)将相同类型但训练集不同的弱分类器进行提升
其中第2和第3种思路的应用更加广泛,分别对应了两种经典的集成学习算法:随机森林与AdaBoost。
具体来说,第一种做法期望各个弱分类器之间的依赖性不强,可以同时生成。这种做法又称为并行方法,其代表为Bagging,而Bagging的一个著名算法就是随机森林。
第二种做法中的弱分类器具有强依赖性,只能序列生成。这种做法又称为串行方法,其代表为Boosting,而Boosting的代表算法为AdaBoost。 -
Bagging与随机森林
Bagging的思想来源于Bootstrap理论。Bootstrap可以翻译为“自举”,它通过模拟的方法来逼近样本的概率分布函数。其背后有着深刻的数理统计思想,这里不展开,我们仅对Bootstrap的过程进行阐述:通过不断地“自采样”来模拟随机变量真实分布生成的数据集。具体而言,其做法是:
1.从样本集中X中随机抽出一个样本(即各个样本被抽出的概率相同)
2.将该样本的拷贝放入数据集Xj
3.将该样本放回X中
以上过程将重复N次,使得一个数据集Xj中有N个样本。整个过程重复M次,得到M个数据集Xj。理论上可以模拟的方法能最优地对真实分布函数进行模拟。
在了解了Bootstrap后,我们来看看Bagging的具体定义。
Bagging全称为Bootstrap Aggregating,其思想很简单:
1.用Bootstrap生成M个数据集
2.用这M个数据集训练出M个弱分类器
3.最终模型即为这M个弱分类器的简单组合
所谓简单组合就是:
1.对于分类问题使用简单的投票表决
2.对于回归问题则进行简单的去平均值
别看简单组合的做法虽然简单,根据霍夫丁不等式可以证明最终模型的错误率随弱分类器的个数M的增加,将会以指数级下降并最终趋向于0。虽然这个结论看起来十分振奋,但是其前提是弱分类器的错误率互相独立。而这在实际中是无法成立的,但是我们能够通过让弱分类器之间的“差异”尽量大,来逼近这个前提。
Bagging的一个著名应用就是随机森林。顾名思义,RF就是当个体模型为决策树时的Bagging算法。随机森林算法的大致流程如下:
1.用Bootstrap生成M个数据集
2.用这M个数据集训练出M棵不进行后剪枝决策树,且在每棵决策树的生成过程中,每次对Node进行划分时,都从可选特征(假设有d个)中随机挑选出k个特征,然后依信息增益的定义从这k个特征中选出信息增益最大的特征作为划分标准
3.最终模型即为这M个弱分类器的简单组合。
注意到随机森林在每个Node进行划分时引入了随机扰动,使得个体模型间的差异进一步增加,从而提升最终模型的泛化能力。 -
PAC框架与Boosting
Boosting产生于计算学习理论,这里简单介绍一下概率近似正确(PAC)学习理论中的“可学习性”。
PAC提出的一个主要的假设,就是它要求数据是从某个稳定的概率分布中产生的。所谓的PAC可学习性,就是看学习的算法是否能够在合理的时间(多项式时间)内,以足够的概率输出一个错误率足够小的模型。由此,所谓的“强可学习”和“弱可学习”的概念就很直观:
1.若存在一个多项式算法可以学习出准确率很高的模型,则称为强可学习
2.若存在一个多项式算法可以学习但准确率仅仅略高于随机猜测,则称为弱可学习
这两个概念在PAC学习框架下是完全等价的。这意味着对于一个学习问题,只要我们找到了一个“弱学习器算法”,就可以把它变成一个“强学习算法”。Boosting算法就能做到这一点。
Boosting事实上是一族算法,该族算法有一个类似的框架:
1.根据当前的数据训练出一个弱模型
2.根据该弱模型的表现调整数据的样本权重。具体而言:
1)让该弱模型做错的样本在后续训练中获得更多的关注
2)让该弱模型做对的样本在后续训练中获得较少的关注
3.最后再根据该弱模型的表现决定该弱模型的“话语权”,亦即投票表决时的“可信度”。自然表现越好就越有话语权。 -
随机森林
具体描述一下随机森林算法。
输入:训练数据集(包含N个数据)、决策树模型、迭代次数M
过程;
(1)对j=1,2,…,M:
(a)通过Bootstrap生成包含N个数据的数据集Dk
(b)利用Dj和输入的决策树模型进行训练,注意不用对训练好的决策树模型gj进行剪枝。同时需要注意的是,在训练决策树的过程中,每一步的生成都要对特征的选取加入随机性。
(2)对个体决策树进行简单的组合。不妨用符号freq(ck)表示类别ck在M个决策树模型的决策中出现的频率,那么:
g(x)=argmax~{ck}freq(ck)
输出:最终分类器g(x) -
AdaBoost
AdaBoost算法:
输入:训练数据集(包含N个数据)、弱学习算法及对应的弱分类器、迭代次数M
过程:
(1)初始化训练数据的权值分布
W 0 = ( w 01 , . . . , w 0 N ) W_{0}=\left ( w_{01},...,w_{0N} \right ) W0=(w01,...,w0N)
(2)对k=0,1,…,M-1:
a)使用权值分布为 w k w_{k} wk的训练数据集训练弱分类器
g k + 1 ( x ) : X → { − 1 , + 1 } g_{k+1}\left ( x \right ):X\rightarrow \left \{ -1,+1 \right \} gk+1(x):X→{ −1,+1}
b)计算 g k + 1 ( x ) g_{k+1}\left ( x \right ) gk+1(x)在训练数据集上的加权错误率
e k + 1 = ∑ i = 1 N w k i I ( g k + 1 ( x i ) ≠ y i ) e_{k+1}=\sum_{i=1}^{N}w_{ki}I\left ( g_{k+1}\left ( x_{i} \right )\neq y_{i} \right )