• 集成学习--(摘自西瓜书)


    集成学习通过将多个学习器进行结合,常可获得比单一学习器显著优越的泛化性能,对“弱学习器” 尤为明显。弱学习器常指泛化性能略优于随机猜测的学习器。集成学习的结果通过投票法产生,即“少数服从多数”。个体学习不能太坏,并且要有“多样性”,即学习器间具有差异。即集成个体应“好而不同”

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

      1. 个体学习器间存在强依赖关系,必须串行生成的序列化方法。代表:Boosting
      2. 个体学习器间不存在强依赖关系,可同时生成的并行化方法。代表:Bagging和随机森林(Random Forest)

    一、boosting (证明见书)

    Boosting的主要思想:先从初始训练集训练出一个基学习器,再根据学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器;如此重复进行直至基学习器数目达到事先指定的值T,最终将这T个基学习器进行加权结合。
    Boosting族算法著名代表是AdaBoost,AdaBoost算法有多种推导方法,比较容易理解地是基于“加法模型”(additive model),即基学习器的线性组合来最小化指数损失函数:

     若指数损失函数最小化,则分类错误率也将最小化;这说明指数损失函数是分类任务原本0/1算是函数的一致的替代函数,其有更好的数学性质即连续可微。
    其算法流程:即初始化样本权值,基于分布 $D_t$ 从数据集中训练出分类器 $h_t$。估计 $h_t$ 的误差,确定分类器 $h_t$ 的权重 $α_t$。该权重应使得 $α_t h_t$ 最小化指数损失函数。更新样本分布,使下一轮的基学习器能纠正Ht-1的一些错误。其中Zt是规范化因子,以确保Dt+1是一个分布。Boosting算法在训练的每一轮都要检查当前生成的基学习器是否满足基本条件(即是否比随机好,算法描述第5行),一旦条件不满足,则当前基学习器即被抛弃并停止学习。

    Boosting算法要求基学习器能对特定的数据分布进行学习,这可通过“重赋权法”(re-weighting)实施。对无法接受带权样本的基学习算法,则可通过“重采样法”(re-sampling)来处理。若采用“重采样法”,则可获得“重启动”机会以避免训练过程过早停止。可根据当前分布重新对训练样本进行采样,再基于新的采样结果重新训练处基学习器。
    从偏差-方差分解的角度看,Boosting主要关注降低偏差(即降低错误率,偏差反映学习算法的拟合能力),因此Boosting能基于泛化性能相当弱的学习器构建出很强的集成。

     二、bagging

    欲得到泛化性能强的集成,集成中的个体学习器应尽可能相互独立;无法做到独立,也可设法使基学习器尽可能具有较大的差异:一种是对训练样本进行采样,产生不同子集,每个子集训练一个基学习器,但如果采样的子集不足以进行有效学习,就无法确保产生比较好的基学习器,因此可以考虑使用相互有交叠的采样子集。

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

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

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

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

    三、结合策略

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

    1. 统计的原因:提升泛化性能。
    2. 计算的原因:降低陷入局部极小点的风险。
    3. 表示的原因:扩大假设空间,更好的近似。

    平均法

    1. 简单平均法(simple averaging)

     

    2. 加权平均法(weighted averaging)

     

    注意:必须使用非负权重才能确保集成性能优于单一最佳个体学习器,因此在集成学习中一般对学习器的权重法以非负约束。
    简单平均法其实是加权平均法令w=1/T的特例。集成学习中的各种结合方法其实都可以视为加权平均法的特例或变体。加权平均法的权重一般是从训练数据中学习而得。由于现实任务中样本不充分或存在噪声,使得学得的权重不完全可靠,有时加权平均法未必一定优于简单平均法。

    投票法

    对分类任务来说,最常见的结合策略使用投票法
    1. 绝对多数投票法(majority voting)
    即若某标记得票过半数,则预测为该标记;否则拒绝预测

    2. 相对多数投票法(plurality voting)
    即预测为得票最多的标记,若同时有多个标记获最高票,则从中随机选取一个。

    3. 加权投票法(weighted voting)
    与加权平均法类似

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

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

    学习法

    当训练数据很多时,更为强大的结合策略是使用“学习法”。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,我们有一个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作为第二层的模型进行建模预测。

    四、多样性

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

    多样性度量

     给定数据集D={(X1,y1),(x2,y2),…,(xm,ym)},对二分类任务,yi∈{-1,+1},分类器hi与hj的预测结果列联表(contingency table)为:

     

    1. 不合度量(disagreement measure)

    disij的值域为[0,1]。值越大则多样性越大。

     2. 相关系数(correlation coefficient)

    ρij的值域为[-1,1]。若hi与hj无关,则值为0;若hi与hj正相关则值为正,否则为负。
    3. Q-统计量(Q-statistic)

    4. k-统计量(k-statistic)

    多样性增强

    在集成学习中需有效地生成多样性大的个体学习器,如何增强多样性?一般思路在学习过程中引入随机性,常见主要做法是对数据样本、输入属性、输出表示、算法参数进行扰动。
    1. 数据样本扰动
    从初始数据集中产生不同的数据子集,再利用不同的数据子集训练处不同的个体学习器。例如采样法。
    适合不稳定基学习器:决策树、神经网络。训练样本稍加变化就会导致学习器有显著变动。
    2. 输入属性扰动
    从初始属性集中抽取出若干个属性子集,在基于每个属性子集训练基学习器。因此对于包含大量冗余属性的数据,不仅能产生多样性大的个体,还会因属性数的减少而大幅节省时间开销,同时减少一些属性后训练出的个体学习器也不至于太差。冗余属性很少的不宜使用输入属性扰动
    适合稳定基学习器:线性学习器、支持向量机、朴素贝叶斯、k近邻学习器。
    3. 输出表示扰动
    对输出表示进行操纵以增强多样性,可对训练样本的类标记稍作变动,如
    a。翻转法:随机改变一些训练样本的标记;
    b。输出调制法:将分类输出转化为回归输出后构建个体学习器
    c。将原任务拆解为多个可同时求解的子任务:ECOC法,多分类拆解为一系列的二分类。
    4. 算法参数扰动
    基学习算法一般都有参数需进行设置,如神经网络的隐层神经元数、初始连接权值等。通过随机设置不同的参数,往往可产生差别较大的个体学习器。

    参考:

    http://bealin.github.io/2017/02/27/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%97%E2%80%949-%E9%9B%86%E6%88%90%E5%AD%A6%E4%B9%A0/

    https://mp.weixin.qq.com/s?__biz=MzIzMzgzOTUxNA==&mid=2247483804&idx=1&sn=7f6df26aee9b29c11a6124714dbbebd5&chksm=e8fecf69df89467f7e9516f7e746075fd4918f73fc9c6f1824a4c4fae777016a91c22949a87b&mpshare=1&scene=23&srcid=062128M1g7vAXkhJ6KOPdeqh#rd

  • 相关阅读:
    驱动开发之基本
    Bitmap文件格式+生成一个BMP文件
    PPP 转义字符 编码 和 解码
    数组数据整体按位左移或右移一位
    一个assert的写法
    c++11 右值引用 && std::move()
    openMP一小时初探
    linux命令学习_实验楼(一)
    50 行 Python 代码完成图片转字符
    LFW精确度验证__c++双线程读写txt
  • 原文地址:https://www.cnblogs.com/ljygoodgoodstudydaydayup/p/7132902.html
Copyright © 2020-2023  润新知