一、集成学习概述
集成学习一般是,先产生一组个体学习器,这些个体学习器可以由同一个学习算法或不同的学习算法从训练数据中产生,再通过某种结合策略将它们结合起来。这里,我们可以看到,个体学习器的产生有两种:
- 集成是同质的,即个体学习器的产生是由同一个学习算法得到的,比如只包括决策树或只包括神经网络等
- 集成是异质的,即个体学习器的产生是由不同的学习算法得到的,比如同时包括决策树和神经网络。
根据个体学习器之间的关联关系,集成学习可以分为以下两种类型:
- 序列集成方法:参与训练的个体学习器是按顺序生成的,这些个体学习器之间是相互依赖的。通过给上一个学习器误分类的样本较高的权重,使得当前的个体学习器重点训练这些误分类的样本。依次迭代,从而整体上提高分类的准确率。比如,Boosting,代表算法为Adaboost算法。
- 并行集成方法:参与训练的学习器是并行生成的。其基本动机是利用个体学习器之间的独立性,通过平均化来减少误差。一般而言,这些独立的个体学习器可以是同质的,也可以是异质的。比如,Bagging与随机森林 Random Forest。
集成学习方法在不同规模的数据集上的处理方式:
- 大规模数据集:划分为多个小数据集,学习多个模型进行组合。
- 小规模数据集:利用Bootstrap方法,有放回的随机抽样,得到多个数据集(和原数据集的规模一致),分别训练多个模型进行组合。
集成学习将多个个体学习器进行组合,常可获得比单一学习器显著优越的泛化性能。这些学习器一般为弱学习器,弱学习器一般是指泛化性能略高于随机猜测的学习器,比如,二分类问题上精度略高于50%的学习器。
集成学习要想到达好的效果,弱学习器需要满足好而不同。好表现在弱学习器的学习效果不能太差,不同表现在弱学习器之间是有差异的,要有多样性。
二、Boosting
Boosting是一族可将弱学习器提升为强学习器的算法。前面我们讲过,它属于串行生成的序列化方法,个体学习器之间是强依赖关系。这族算法的工作机制类似:
首先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本的分布进行调整,使得先前基学习器误分类的样本在后续会受到更多的关注,然后基于调整后的样本分布来训练下一个基学习器,如此重复进行,直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权求和。
—《机器学习》周志华
我们结合这个图来说明Boosting算法,首先利用初始训练集和初始权重训练出第一个弱分类器 ,可以看到,样本集中有两个被误分类,接下来,将误分类的样本的权重提高,使得其在下一次分类中得到更多的关注,然后基于调整的样本权重的数据集训练出新的弱分类器 ,这一次,我们可以看到,之前被误分类的样本被正确的分类,依次重复进行,直到达到预定的分类器的个数M,这里M=4。
每一个弱分类器都有自己的权重 ,就是我们训练出来的分类器,共有个,为加权求和后的分类器。
Boosting算法里主要包括Adaboost算法和提升树(Boosting Tree)算法。提升树算法里面又包括了GBDT梯度提升树(Gradient Boosting Decision Tree)算法和XGBoost极端梯度提升(Extreme Gradient Boosting)算法。
三、Bagging 与随机森林
Bagging
Bagging全称为Bootstrap Aggregating(装袋)。==它出现的意义?==我们之前说了,要得到泛化性能强的集成,需要个体分类器好而不同。这里强调不同,也就是说个体分类器要有差异。给定一个数据集,一种做法是对数据集进行采样,产生若干个不同的子集,再从每个数据子集训练出一个基学习器。但是这样可能会有一个问题,每个子集只是完整数据集的一部分,所以训练出来的基学习器只能反映部分样本,造成基学习器性能不佳。
为了解决这个问题,Bagging提出了Bootstrap的方法,也叫自助采样法,即在训练集中进行有放回的随机抽样。整个Bagging流程如下:
1.从原始数据集中抽取训练集。给定包含m个样本的原始数据集,我们进行有放回的随机抽样,抽取m个样本。这一过程重复K次,因为有K个基学习器。同时这m个样本中可能会有重复的样本。这正是Bootstrap的巧妙之处。自助采样法给Bagging带来的好处就是:每个基学习器使用的数据只占了原数据集的63.2%,剩下的36.8%的样本可以用作验证集来对泛化能力进行“包外估计”。那么这里的63.2%怎么得出来的呢?
假设我们有 个样本,进行有放回的随机抽样,那么每个样本不被抽到的概率为,则每个样本都不被抽到的概率为 。当样本是容量很大,,有
因此,每个样本被抽到的概率就为,
2.每个数据集对应一个模型,K个数据集对应K个基学习器。
3.对得到的模型进行组合,如果是分类问题,则采用投票法,比如绝对多数投票法和相对多数投票法,来得到最终的分类结果;如果是回归问题,则可以采用平均法。
随机森林
随机森林(Random Forest,RF) 是Bagging的一个扩展变体。随机森林的弱学习器都是决策树,同时它在Bagging随机选择数据集的基础之上,加入随机属性选择:
- 传统的决策树在选择划分属性时,是在当前结点的属性集合(假设有 个)中选择一个最优属性。而在RF中,对于基决策树的每个结点,先从该结点的属性集合中随机选择一个包含 个属性的集合,然后再从这个属性集合中选择一个最优属性。其中,参数 控制了随机性的引入程度。当 =d 时,则基决策树的构建和传统的决策树相同;当 时,则是随机选择一个属性进行划分。一般而言, 较为合适。
Bagging中基学习器的多样性主要是靠Bootstrap,数据集的随机扰动来实现的,而随机森林RF不仅能够实现数据集的随机扰动,随机属性选择增加了属性扰动,这使得最终集成的泛化性能可以通过个体学习器之间差异性的增加而得到进一步的提升。
四、结合策略
为什么要使用学习器结合的策略?
- 从统计方面来看,学习任务的假设空间很大,可能会有多个假设在训练集上达到同样的效果,此时若使用单学习器可能会因为误选而导致泛化性能不佳,结合多个学习器就会减少这一风险;
- 从计算方面来看,学习算法有可能陷入局部极小,有些局部极小可能会导致泛化性能极差,而通过多次运行之后结合,可降低陷入糟糕局部极小的风险;
- 从表示来看,某些学习任务的真实假设可能不在当前学习算法所考虑的假设空间内,此时若使用单学习器则肯定无效,而通过结合多个学习器,由于相应的假设空间有所扩大,有可能学到更好的近似。
假设集成包含 个基学习器 ,其中 在 上的输出为 。
一下有三种比较常见的集合策略:
1.平均法
对数值型的回归预测问题,一般使用平均法,即将多个基学习器的输出结果求平均值,然后将这个平均值作为最后的预测结果输出。
简单平均法
加权平均法
其中,为基学习器 的权重,通常要求 ,且有。
2.投票法
对分类任务来说,学习器 将从分类标记集合(即分类标记的可能取值,这里一共有个)中预测一个标记,最常见的策略是使用投票法。假设 在样本 上的预测输出为一个 维向量,其中, 表示 在输入为 下,类别标记为 的输出。
绝对多数投票法
即某标记的投票数过半,则预测为该标记,否则,拒绝该标记。
相对多数投票法
即预测票数最多的那个类标记为最终的类别输出,若有两个相同,则随机选择一个。
加权投票法
其中,为基学习器 的权重,通常要求 ,且有。
3.学习法
上述两种方法对弱学习器的结果进行求平均或投票,结果的误差可能较大。这里介绍一种更为强大的组合策略,就是学习法,特别是在数据量较大的情况下。学习法中的一个典型代表就是 Stacking。
Stacking 就是先从初始的数据集中训练初级学习器,然后将多个初级学习器的输出结果作为新的特征来训练次级学习器,如果存在下一层学习器的话,继续将当前的学习器输出作为下一层的学习器的输入特征。最后一层学习器的输出结果即为预测结果。
举个比较现实的例子:你千辛万苦完成了一篇论文,这篇论文被你投到了某一个C刊上。期刊收到你的论文后,交给了三个同行评审,这三个同行评审就相当于初级学习器,他们在看完你的论文后,给出了意见,这些审稿人意见就是初级学习器的输出,然后这些意见被反馈给了主编,这里的主编相当于次级学习器,他结合审稿人意见,最终给出决定,这个决定就是次级学习器的结果。
我们按照这个图,来理解 Stacking 的操作流程:
假设初始训练集 ,测试集
- 首先对训练集train_set进行交叉验证,这里用5-Fold来说明。5-Fold处理数据集,训练集分为无交集的五个子集,根据每个子集被选为测试集的可能,有五种情况;
- 每个初级学习器在四个子训练集train_data上训练,在一个子测试集test_data上测试,每个学习器的测试结果为 ,最终5个学习器在子测试集上结果作为次级学习器的输入
- 同时,每个初级学习器要在大测试集 上测试,测试结果为 ,我们对5列数据集求均值 得到次级学习器的测试集
五、Boosting和Bagging的区别
Bagging方法可以认为是并行的集成方式,它能够并行的生成相对独立的基模型。Bagging集成后的模型的偏差与基模型近似,但是由于存在多个相对独立的基模型,所以集成后的模型的方差会比单个基模型要小。一句话,Bagging方法通过降低模型的方差,来提高模型的泛化能力。
Boosting方法是串行的集成方式,每一个当前的基模型依赖于前一个基模型,Boosting集成后的模型的方差与基模型近似,但是由于每一个基模型都在纠正前一个模型的结果,所以集成后的模型的偏差会降低。一句话,Boosting方法通过降低模型的偏差,来提高模型的泛化能力。
参考资料:
1.机器学习算法(12)之集成学习之模型融合:
https://blog.csdn.net/qq_20412595/article/details/82561685
2.CSDN的Markdown编辑器如何添加空格:https://blog.csdn.net/xiaotao_1/article/details/78418281
3.常用数学符号的 LaTeX 表示方法:http://mohu.org/info/symbols/symbols.htm
4.集成学习之stacking详解:https://blog.csdn.net/htbeker/article/details/85292037
5.【机器学习】集成学习之stacking:https://blog.csdn.net/qq_32742009/article/details/81366768