集成学习就是组合这里的多个弱监督模型以期得到一个更好更全面的强监督模型,集成学习潜在的思想是即便某一个弱分类器得到了错误的预测,其他的弱分类器也可以将错误纠正回来。
集成方法是将几种机器学习技术组合成一个预测模型的元算法,以达到**减小方差(bagging)、偏差(boosting)或改进预测(stacking)**的效果。
集成学习在各个规模的数据集上都有很好的策略。
数据集大:划分成多个小数据集,学习多个模型进行组合
数据集小:利用Bootstrap方法进行抽样,得到多个数据集,分别训练多个模型再进行组合
根据不同的分类标准有两种分类:
集成学习器性能要好于单个个体学习器需要满足好而不同的两点要求:
第一个条件相对来说比较容易实现,在当前问题下训练一个模型,结果比瞎猜的结果好就行了。第二个条件是集成学习研究的核心问题。【每个个体学习器学习的都是同一个问题,所以个体学习器不可能做到完全相互独立。】
① 将多个分类方法聚集在一起,以提高分类的准确率。(这些算法可以是不同的算法,也可以是相同的算法。)
② 集成学习法由训练数据构建一组基分类器,然后通过对每个基分类器的预测进行投票来进行分类
③ 严格来说,集成学习并不算是一种分类器,而是一种分类器结合的方法。
④ 通常一个集成分类器的分类性能会好于单个分类器
⑤ 如果把单个分类器比作一个决策者的话,集成学习的方法就相当于多个决策者共同进行一项决策。
1)怎么训练每个算法?
2)怎么融合每个算法?
这篇博客将会介绍一下集成学习的五个方法。
想要在个体学习器足够好的前提下,增强其多样性,我们可以直观上来想象一下。整个的算法学习过程是从数据到模型再到输出。
首先考虑输入。如果每个学习器学习不同的样本,那么可以学习出相对来说不同的个体学习器。那么现在的问题就是怎么划分训练样本,你可以随机抽取,或者利用不同的属性子集训练出不同的个体学习器。
其次考虑模型,如果基学习器的模型不一样,也能训练出不同的个体学习器。
最后考虑输出,如果我们依据标签的特性来进行划分,也能得到不同的个体学习器。
依据上述三点概念,主要有以下5种方法:
从原始训练样本中产生不同的样本子集,然后利用不同的样本子集训练不同的个体学习器。如Bagging中使用的自助采样,Boosting中使用的序列采样。
这种训练样本扰动的方法简单高效,但只对不稳定的基学习器有效,像决策树、神经网络等;对于稳定的基学习器,如线性学习器、支持向量机、朴素贝叶斯、K-NN等,就效果不明显,产生这个问题的原因就是因为稳定的基学习器,“变通能力”并不是很强。
具体的实现方法是:首先给每一个训练样例赋予相同的权重,然后训练第一个基本分类器并用它来对训练集进行测试,对于那些分类错误的测试样例提高其权重(实际算法中是降低分类正确的样例的权重),然后用调整后的带权训练集训练第二个基本分类器,然后重复这个过程直到最后得到一个足够好的学习器。
AdaBoost(Adaptive boosting)算法:刚开始训练时对每一个训练例赋相等的权重,然后用该算法对训练集训练t轮,每次训练后,对训练失败的训练例赋以较大的权重,也就是让学习算法在每次学习以后更注意学错的样本,从而得到多个预测函数。通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。
GBDT(Gradient Boost Decision Tree),每一次的计算是为了减少上一次的残差,GBDT在残差减少(负梯度)的方向上建立一个新的模型。
是并行式集成学习方法著名代表,基于自助采样法(bootstrap sampling[2]),给定包含m个样本的数据集,有放回随机采样,经过m次得到含有m个样本的采样集,这样的采样,初始训练集中约有63.2%的样本出现在采样集中。
照这样采样出m个含m个训练样本的采样集,然后基于每个采样集训练一个基学习器,再将这些基学习器进行结合。在预测输出时,Bagging通常对分类任务使用简单投票法。对回归任务使用简单平均法。
由此,总结一下bagging方法:
① Bagging通过降低基分类器的方差,改善了泛化误差
② 其性能依赖于基分类器的稳定性;如果基分类器不稳定,bagging有助于降低训练数据的随机波动
③ 由于每个样本被选中的概率相同,因此bagging并不侧重于训练数据集中的任何特定实例
1、Bagging和Boosting的区别:
1)样本选择上:
2)样例权重:
3)预测函数:
4)并行计算:
Stacking[1]方法是指训练一个模型用于组合其他各个模型。首先我们先训练多个不同的模型,然后把之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。理论上,Stacking可以表示上面提到的两种Ensemble方法,只要我们采用合适的模型组合策略即可。但在实际中,我们通常使用logistic回归作为组合策略。
如下图,先在整个训练数据集上通过bootstrap抽样得到各个训练集合,得到一系列分类模型,然后将输出用于训练第二层分类器。
这个方法自己也没有仔细研究,大家可查阅更多相关知识了解
1)Bagging + 决策树 = 随机森林
2)AdaBoost + 决策树 = 提升树
3)Gradient Boosting + 决策树 = GBDT
输入属性扰动通常是从初始属性集中抽取出若干个属性子集,然后利用不同的属性子集训练出不同的个体学习器。比如有:随机森林
RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入随机属性。传统决策树在选择划分属性时是在当前结点的属性集合中选择一个最优属性;而在RF中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。
随机森林中基学习器多样性不仅来自样本扰动,还来自属性扰动,使得最终集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升。
但这类输入属性扰动的方法只对大量冗余属性的数据集有效,但若数据集只包含少量属性,或者冗余属性很少,则不宜使用。随机森林由于起始引入了属性扰动,性能会比Bagging差一点,但随着个体数量增多,随机森林通常会收敛到更低的泛化误差。
算法参数扰动指的是通过随机设置不同的参数来训练差别较大的个体学习器。
输出标记扰动是对训练样本的类别标记稍作变动,将原来的多分类问题随机转化多个二分类问题来训练基学习器。经典的一个算法就是纠错输出编码法(Error-Correcting Output Codes,ECOC)
将每个类别对应一个长度为n的二进制位串(称为码字),共形成m个码字,这些码字的同一位描述了一个二值函数。学习结束后获得n个二分器,在分类阶段,每个二分器对输入样本产生的输出形成输出向量,然后由决策规则判定输入样本的类别。
这类方法对类数足够多的数据集有效,但若数据集包含的类数较少,则不宜使用。
混合扰动在同一个集成算法中同时使用上述多种扰动方法。比如随机森林就同时使用了训练样本扰动和输入属性扰动。
上文五点讨论的是如何产生好而不同的个体学习器。那产生了好而不同的个体学习器之后,我们如何结合这些策略?主要有平均法和常见的投票法(voting),具体包括:
简单平均法
简单地将输出结果平均一下
加权平均法
乘以权值系数将其加起来。
绝对多数投票法(majority voting)
即若某标记得票过半数,则分类为该标记,否则拒绝分类。
相对多数投票法(plurality voting)
分类为得票最多的标记,若同时有多个标记获最高票,则从中随机选取一个。
加权投票法(weighted voting)
给每个个体学习器预测的类标记赋一个权值,分类为权值最大的标记。这里的权值通常为该个体学习器的分类置信度(类成员概率)。
[0] https://zhuanlan.zhihu.com/p/105038453
[1] https://www.cnblogs.com/zongfa/p/9304353.html#top
[2] https://www.jianshu.com/p/369e3f4d239f