zoukankan      html  css  js  c++  java
  • 集成学习

    概述

    集成学习通过将多个学习器进行结合,常可获得比单一学习器显著优越的泛化性能,对“弱学习器” 尤为明显。弱学习器常指泛化性能略优于随机猜测的学习器。

    对于每个弱学习器而言,个体学习不能太坏,并且要有“多样性”,即学习器间具有差异。即集成个体应“好而不同”。

    假设基分类器的错误率相互独立,则由Hoeffding不等式可知,随着集成中个体分类器数目T的增大,集成的错误率将指数级下降,最终趋向于零。但是这里有一个关键假设:基学习器的误差相互独立,而现实中个体学习器是为解决同一个问题训练出来的,所以不可能相互独立。因此如何产生并结合“好而不同”的个体学习器是集成学习研究的核心。

    目前集成学习大致分为两大类:

    1、个体学习器间存在强依赖关系,必须串行生成的序列化方法。代表:Boosting和提升树。(请移步我的另一篇博客:https://www.cnblogs.com/CJT-blog/p/10155187.html)

    从偏差-方差分解的角度看,Boosting主要关注降低偏差(即降低错误率,偏差反映学习算法的拟合能力),因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成。

    2、个体学习器间不存在强依赖关系,可同时生成的并行化方法。代表:Bagging和随机森林。

    从偏差-方差分解的角度看,Bagging主要关注降低方差(方差度量同样大小的数据集的变动所导致的学习性能的变化)。当基学习器不稳定(large varance)时,Bagging带来的性能提升尤为明显。因此它在不剪枝决策树、神经网络等易受样本扰动的学习器上效用更为明显。

    Bagging与随机森林

    参考博客:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/7132902.html

    1、Bagging

    引言:欲得到泛化性能强的集成,集成中的个体学习器应尽可能相互独立;无法做到独立,也可设法使基学习器尽可能具有较大的差异:一种是对训练样本进行采样,产生不同子集,每个子集训练一个基学习器,但如果采样的子集不足以进行有效学习,就无法确保产生比较好的基学习器,因此可以考虑使用相互有交叠的采样子集。bagging是并行式集成学习方法最著名的代表,Boostrap的意思是其基于自助采样(bootstrap sampling)。

    做法:给定包含m个样本的数据集,先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样经过m次有放回随机采样操作,即可得到含m个样本的集合(有的样本重复出现,有的样本从未出现,大体约有63.2%的样本出现在采样集中)。照此,我们可以采样出T个含m个训练样本的采样集,然后基于每个采样集训练一个基学习器,再将这些基学习器进行结合。

    ps:其算法复杂度几乎与基分类器相同,因此很高效。

    2、随机森林

    随机森林是Bagging的一个扩展变体,其进一步在决策树的训练过程中引入了随机属性选择。传统决策树在选择划分属性时在当前结点的属性集合(假定有d个属性)中选择一个最优属性;而在RF中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k个属性的子集,然后再从这个子集中选择一个最优属性用于划分。推荐值为:

    ps:随机森林对Bagging只做了小改动,但是与Bagging中基学习器的“多样性”仅通过样本扰动(通过对初始训练集采样)而来不同,随机森林中基学习器的多样性不仅来自样本扰动,还来自特征扰动,这就使得最终集成的泛化性能可通过个体学习器之间的差异度的增加而进一步提升。随机森林的训练效率常优于Bagging,因为在个体决策树的构建过程中,Bagging使用的是“确定型”决策树,在选择划分属性时要对结点的所有属性进行考察,而随机森林使用的“随机型”决策树则只需考虑一个属性子集。随机森林的收敛性与Bagging相似。

    3、结合策略

    学习器结合从三个方面带来好处:

    (1)统计的原因:提升泛化性能。

    (2)计算的原因:降低陷入局部极小点的风险。

    (3)表示的原因:扩大假设空间,更好的近似。

    结合策略分类如下

    (1)对于连续值,常见有:

    A.简单平均法(simple averaging)

     

    B.加权平均法(weighted averaging)

     

    ps:必须使用非负权重才能确保集成性能优于单一最佳个体学习器,因此在集成学习中一般对学习器的权重法以非负约束。

    pps:简单平均法其实是加权平均法令w=1/T的特例。集成学习中的各种结合方法其实都可以视为加权平均法的特例或变体。加权平均法的权重一般是从训练数据中学习而得。由于现实任务中样本不充分或存在噪声,使得学得的权重不完全可靠,有时加权平均法未必一定优于简单平均法。

    (2)对于分类任务,常见有

    A.绝对多数投票法(majority voting)

    即若某标记得票过半数,则预测为该标记;否则拒绝预测。


    B.相对多数投票法(plurality voting)

    即预测为得票最多的标记,若同时有多个标记获最高票,则从中随机选取一个。


    C.加权投票法(weighted voting)

    与加权平均法类似,是对预测分布概率进行加权求和,再取其中概率最大类。

    ps:绝对多数投票法在可靠性要求较高的学习任务中是一个很好的机制,若必须提供结果,则使用相对多数投票法。

    类标记:使用类标记的投票亦称“硬投票”(hard voting)。

    类概率:使用类概率的投票亦称“软投票”(soft voting)。

    硬投票与软投票不能混用,若基学习器产生分类置信度,例如支持向量机的分类间隔值,需使用一些技术如Platt缩放、等分回归、等进行校准后才能作为类概率使用。若基学习器的类型不同,则其类概率值不能直接进行比较,可将类概率输出转化为类标记输出然后再投票。

    (3)学习法

    当训练数据很多时,更为强大的结合策略是使用“学习法”。Stacking是学习法的典型代表,这里把个体学习器称为初级学习器,用于结合的学习器称为次级学习器或元学习器(meta-learner)。

    Stacking先从初始数据集训练出初级学习器,然后“生成”一个新数据集用于训练次级学习器。在这个新数据集中,初级学习器的输出被当做样例输入特征,而初始样本的标记仍被当做样例标记。

    Stacking注意事项:

    在训练阶段,次级训练集是利用初级学习器产生的,若直接用初级学习器的训练集来产生次级训练集,则过拟合风险会比较大。一般通过使用交叉验证或留一法这样的方式,用训练初级学习器未使用的样本来产生次级学习器的训练样本。以k折交叉验证为例(如下图所示),对训练集划分为5份(5折);对每一折Dk为测试集,D-Dk为训练集,训练第一种初级学习器5次,将5次的结果拼接起来即可得到一个N×1的矩阵,以此往复训练5种初级学习器,得到5个N×1矩阵,将其横向拼接,即可得到N×5矩阵,将其作为次级学习器的训练集来训练次级学习器。

    次级学习器的输入属性表示和次级学习器算法对Stacking集成的泛化性能有很大影响,将初级学习器的输出类概率作为次级学习器的输入属性,用多响应线性回归(Multi-response Linear Regression,简称MLR)作为次级学习算法效果较好。在MLR中使用不同的属性集效果更佳。

    Stacking详细举例说明:

    假设是五折的stacking,我们有一个train数据集和一个test数据集,那么一个基本的stacking框架会进行如下几个操作:

    1、选择基模型。我们可以有xgboost,lightGBM,RandomForest,SVM,ANN,KNN,LR等等你能想到的各种基本算法模型。

    2、把训练集分为不交叉的五份。我们标记为train1到train5。

    3、从train1开始作为预测集,使用train2到train5建模,然后预测train1,并保留结果;

    然后,以train2作为预测集,使用train1,train3到train5建模,预测train2,并保留结果;如此进行下去,直到把train1到train5各预测一遍;

    4、把预测的结果按照train1到trian5的位置对应填补上,得到对train整个数据集在第一个基模型的一个stacking转换。

    5、在上述建立的五个模型过程中,每个模型分别对test数据集进行预测,并最终保留这五列结果,然后对这五列取平均,作为第一个基模型对test数据的一个stacking转换。

    6、选择第二个基模型,重复以上2-5操作,再次得到train整个数据集在第二个基模型的一个stacking转换。

    7、以此类推。有几个基模型,就会对整个train数据集生成几列新的特征表达。同样,也会对test有几列新的特征表达。

    8、一般使用LR作为第二层的模型进行建模预测。

     

    bending也是一种模型融合学习方法,对于一般的blending,主要思路是把原始的训练集先分成两部分,比如70%的数据作为新的训练集,剩下30%的数据作为测试集。第一层我们在这70%的数据上训练多个模型,然后去预测那30%数据的label。在第二层里,我们就直接用这30%数据在第一层预测的结果做为新特征继续训练即可。

    相比blending,stacking两层模型都使用了全部的训练数据。

    这两者其实不用分的太清楚,各有好坏:

    Blending与stacking相比优点在于:

    1.比stacking简单(因为不用进行k次的交叉验证来获得新特征)

    2.由于两层使用的数据不同,所以避免了一个信息泄露的问题。

    3.在团队建模过程中,不需要给队友分享自己的随机种子。

    而缺点在于:

    1.由于blending对数据集这种划分形式,第二层的数据量比较少。

    2.由于第二层数据量比较少所以可能会过拟合。

    3.stacking使用多次的CV会比较稳健

    4、多样性

     欲构建泛化能力强的集成,个体学习器应“好而不同”。根据误差-分歧分解:个体学习器准确性越高、多样性越大,则集成越好(证明见西瓜书)。如何度量个体分类器的多样性?典型做法是考虑个体分类器的两两相似/不相似性。

    (1)多样性度量

    (2)多样性增强

    在集成学习中需有效地生成多样性大的个体学习器,如何增强多样性?一般思路在学习过程中引入随机性,常见主要做法是对数据样本、输入属性、输出表示、算法参数进行扰动。

    1. 数据样本扰动

    2. 输入属性扰动

    从初始属性集中抽取出若干个属性子集,在基于每个属性子集训练基学习器。因此对于包含大量冗余属性的数据,不仅能产生多样性大的个体,还会因属性数的减少而大幅节省时间开销,同时减少一些属性后训练出的个体学习器也不至于太差。冗余属性很少的不宜使用输入属性扰动。

    适合稳定基学习器:线性学习器、支持向量机、朴素贝叶斯、k近邻学习器。

    3. 输出表示扰动

    对输出表示进行操纵以增强多样性,可对训练样本的类标记稍作变动,如

    a。翻转法:随机改变一些训练样本的标记;

    b。输出调制法:将分类输出转化为回归输出后构建个体学习器

    c。将原任务拆解为多个可同时求解的子任务:ECOC法,多分类拆解为一系列的二分类。

    4. 算法参数扰动

    基学习算法一般都有参数需进行设置,如神经网络的隐层神经元数、初始连接权值等。通过随机设置不同的参数,往往可产生差别较大的个体学习器。

  • 相关阅读:
    《PhoneApplicationPage》应用程序栏
    Blend 自定义横竖屏切换动画
    《Page》制作页面间跳转动画步骤
    《TextBox》软件键盘 SIP 的所有样式
    《ListBox》———何如实现ListBox下拉刷新和到底部自动加载
    [2]aptget的使用
    Boost asio Tutorial例子Timer.5 make error
    [5]debian5.0 install firefox latest version 安装
    C++对象的复制——具有指针成员的类的对象的复制
    内部链接与外部链接
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10241907.html
Copyright © 2011-2022 走看看