zoukankan      html  css  js  c++  java
  • 集成学习(一):概述

             集成学习通过构建多个学习器然后进行某种方式的组合来达到学习的任务,通过集成学习可以增强模型的学习和泛化能力。下面总结以下集成学习的最基本概念。

    1.常用集成学习方法:

       

       1.1 Bagging

             Bagging( Bootstrap Aggregation)是一种最著名的并行式集成学习算法,其基本思想是对于训练集做$M$次自助采样(Bootstrap Sampling)得到$M$个采样集,然后对每个采样集进行训练,得到$M$个模型,最后进行$M$个模型的整合,对分类问题用投票法,对回归问题用求平均的方法。

             Bagging的最大优点是降低模型的方差。注意到如果数据集足够大,每一次采样平均只能采集到大概63.2%的样本,于是由不同采样集之间重合的样本数一般也不会超过30%,训练出来的两个模型的独立性要大大增强,最终的模型方差将大大减小。用数学语言来描述,例如对回归问题,我们有$M$个由训练集$D$自助采样后训练出的模型$f_{1},...,f_{M}$, 对于任意的输入$x$,我们假设$f_{i}$在$x$处的方差均约等于$delta^{2}(x)$而对任意不同的子模型$f_{i},f_{j}$在$x$处的协方差均为正且约为$ ho(x)delta^{2}(x)( ho(x)in (0,1))$,则Bagging所得到的模型$f=frac{1}{M}sum_{i=1}^{M}f_{i}$在$x$处的方差为:

                                  egin{split} ext{Var}_{D}(frac{1}{M}sum_{i=1}^{M}f_{i})&=frac{1}{M^{2}}sum_{i=1}^{M} ext{Var}_{D}(f_{i}(x))+frac{2}{M^{2}}sum_{1leq i<jleq M} ext{Cov_{D}}(f_{i}(x),f_{j}(x)) ewline &approxfrac{delta^{2}(x)}{M}+frac{M-1}{M} ho(x)delta^{2}(x) ewline &= ho(x)delta^{2}+frac{(1- ho(x))delta^{2}(x)}{M}end{split}

     

    注意到随着Bagging的子模型数量的增加,$f$的方差不断减小,最后$M ightarrow infty$趋于$ ho(x)delta^{2}(x)$, 严格小于单独模型的方差$delta^{2}(x)$。注意到我们已经分析过了,由于自助法的应用,$ ho(x)$也会比较小,所以Bagging方法将大大减小模型方差,增强泛化能力。但是我们同时注意到,方差的降低不是无限制的,如果每个模型的复杂度过高导致$delta(x)$过大,就算是$M ightarrow infty$模型仍然会过拟合,所有我们在训练的时候仍然注意得防止过拟合。

            Bagging采样自助法的另外一个好处就是训练每一个子模型的时候都可以计算其袋外误差来判断每个子模型的泛化能力,另外袋外误差还可以有其他更多用途。

            由于Bagging的每个子模型的采样和训练完全是和其他模型不相关的,所有Bagging算法可以方便的进行并行运算。

            基于树模型的随机森林算法是Bagging的进一步扩展,将在下一次单独讨论。

       1.2 三个臭皮匠,顶一个诸葛亮——Boosting方法

             所谓Boosting(提升方法)是指的一系列将若干弱的学习器提升为强的学习“委员会”("commitee")的算法。Boosting是近20余年发展出的一种强大的机器学习思想,起先是用于分类问题,后来也出现了很多同样可以应用于回归问题的提升方法。

             所有的Boosting方法的基本想法都是先训练出一个学习器,然后不断根据前一步的学习器的训练效果对学习策略进行调整来学习下一个学习器,然后对所有学习器进行整合。常见的Boosting算法有AdaBoost, GBDT以及近几年很火热的XGBoost,LightGBM 等等。

             很多Boosting算法均可以概括为一种“前向分步可加模型”(Forward Stagewise Additive Modeling). 在该模型中,我们如果有训练数据集$D={(x_{1},y_{1}),...,(x_{N},y_{N})}$我们希望学习一组基模型并将其线性组合得到最终模型:

                                             egin{equation}f(x)=sum_{m=1}^{M}eta_{m}b(x; gamma_{m})end{equation}       

    使得经验误差函数:

                                         $$sum_{i=1}^{N}L(f(x_{i}),y_{i})$$ 

    最小,其中$b$为某基模型,$gamma_{i}$为每个基模型的参数,$eta_{i}geq 0$为组合系数。这个时候最最直接的方法当然是求:

             egin{equation}eta^{ast},gamma^{ast}= ext{argmin}_{eta,gamma} L(sum_{m=1}^{M}eta_{m}b(x_{i}; gamma_{m}),x_{i}),end{equation}但是这个问题的求解太过困难。相反我们可以考虑一种贪婪算法,一步一步求解,我们称其为“前向分步可加模型”,如下所示:

                           ——————————————————————————————————————————

                           输入:训练集$D={(x_{1},y_{1}),...,(x_{N},y_{N})}$,损失函数$L$,基模型$b$和数$M>0$

                           输出:提升后的模型

                           Step1. 初始化$f_{0}(x)=0$.

                           Step2. 对$m$从1到M:

                                      (1) 计算出$(eta_{m}^{ast},gamma_{m}^{ast})= ext{argmin}_{eta_{m},gamma_{m}}sum_{i=1}^{N}L(f_{m-1}(x_{i})+eta_{m}b(x_{i}; gamma_{m}) ,y_{i})$ 

                                      (2) 令$f_{m}(x)=f_{m-1}(x)+eta_{m}^{ast}b(x,gamma^{ast}_{m})$

                           Step3.  输出模型$f_{M}$

                           ——-————————————————————————————————————————

       

        1.3 Stacking

              Stacking算法简单得说就是将一组模型输出作为另外一个模型输入的算法,具体说先用一组“初始学习算法”学习初级数据集$D={(x_{1},y_{1}),...,(x_{N},y_{N})}$得到模型$f_{1},...,f_{T}$,然后生成一个新的数据集:

    $D^{prime}=lbrace(f_{1}(x_{i}),f_{2}(x_{i}),...,f_{T}(x_{i}),y_{i})mid i=1,...,N brace,$

    再选择一个次级学习算法学习$D^{prime}$ 得到模型$f$,最终输出模型:

    $$F(x)=f(f_{1}(x),...,f_{N}(x))$$

             为了防止过拟合,一般也是用类似于交叉验证的办法来生成新的数据集$D^{prime}$。我个人很欣赏这种算法,因为其很机智,实际上是在学习一个复合函数,但是我对其也不太了解没有使用过,希望以后加强这方面的学习。

     

    2. 误差,分歧分解

         就如我们在Bagging中看到的那样,我们引入了自助法来训练不同的模型,各个模型由于学习的数据集重合度不高所以呈现出一定的差异。一般的,集成学习中的各个子模型也应该“好而不同”,下面我们从所谓误差,分歧分解的角度从理论上看为什么。

            我们令$mathcal{S}subsetmathbb{R}^{P} imesmathbb{R}$为样本的总体,我们记$E_{mathcal{S}}(f(x,y))$为某个函数$f$在$mathcal{S}$上的期望, 而我们通过一个训练集$Dsubset S$得到了$M$个不同的模型$f_{1},...,f_{M}$,并且取权重$w_{1},...,w_{M} $将模型进行集成得到模型:

             $$F=sum_{i=1}^{M}w_{i}f_{i}.$$

            注意到,对任意的$(x,y)inmathcal{S}$, $i=1,...,M$我们有:

            egin{split}&w_{i}(h_{i}(x)-y)^{2} ewline =&w_{i}(f_{i}(x)-F(x)+F(x)-y) ewline =&w_{i}(f_{i}-F(x))^{2}+2w_{i}(f_{i}(x)-F(x))(F(x)-y)+w_{i}(f_{i}(x)-y)end{split}

    上式两边同时取$sum_{i=1}^{M}$,右边第二项消失,我们得到:

            $$sum_{i=1}^{M}w_{i}(f_{i}(x)-y)^{2}=sum_{i=1}^{M}w_{i}(f_{i}(x)-F(x))^{2}+sum_{i=1}^{M}w_{i}(F(x)-y)^{2}$$

    上式两边再取$E_{mathcal{S}}$我们就可以得到:

    egin{equation}sum_{i=1}^{M}w_{i}E_{mathcal{S}}((f_{i}(x)-y)^{2})=sum_{i=1}^{M}w_{i}E_{mathcal{S}}((f_{i}(x)-F(x))^{2})+sum_{i=1}^{M}E_{mathcal{S}}((F(x)-y)^{2})end{equation} 

            我们观察一下,上式第一项实际上是各个子模型的均方误差(有时候我也称误差为风险)的加权平均和我们记其为$overline{E}$,而第二项实际上是体现了各个子模型的差异程度,其中令$A_{i}=E_{mathcal{S}}((f_{i}(x)-F(x))^{2})$, 称其为模型$f_{i}$与集成模型$F$的分歧(ambiguity), 则第二项其实就是所有分歧的加权平均我们记其为$overline{A}$,而最后一项为集成之后模型$F$的均方误差(风险)我们记为$E$,所以我们有:

            egin{equation}overline{E}=overline{A}+Eend{equation}

    上式就称为误差-分歧分解。可以知道实际上:$E=overline{E}-overline{A}$,所以为了使得$E$尽量小,也就是模型泛化能力强,我们应该在保证$overline{E}$不变的情况下尽量增大模型的多样性,使得$overline{A}$尽量大。

            有若干种方法进行多样性的增强,例如:

    • 数据样本扰动:例如重采样法,AdaBoost中的调整训练权重等
    • 输入扰动:例如列采样Column Subsampling        
    • 输出表示扰动: Flipping Output, Output Smearing, ECOC等
    • 参数扰动法:对不同的子模型用不同的参数进行学习。

    3.参考文献

        1】周志华:机器学习,清华大学出版社,2016年第一版

           【2】 Trevor Hastie,Robert Tibshirani,Jerome Friedman: The Elements of Statistical Learning Data Mining,Inference,and Prediction, second edition, Springer Verleg, 2009

  • 相关阅读:
    判断质数
    猜拳三局两胜
    输入年月日判断是这一年的哪一天
    switch case
    猜拳
    判断年月日是否正确
    老狼老狼几点了
    判断是否中奖
    平滑部署war包到tomcat-deploy.sh
    只用120行Java代码写一个自己的区块链-3挖矿算法
  • 原文地址:https://www.cnblogs.com/szqfreiburger/p/11669384.html
Copyright © 2011-2022 走看看