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

    一、集成学习(Ensemble Learning)

    集成学习是指通过训练多个分类器,然后将这些分类器组合起来,来获得比单个分类器更优的性能(比最好的那个分类器还要好)。如果每个分类器都是同种类型的(比如都是决策树或者都是SVM等等),那么这些单个的分类器我们称为基学习器;如果集成中包含不同类型的分类器,这样的集成是异质的。需要注意的是,这些单个的分类器性能不一定要很好,只需要比随机猜测好就可以。在我们一般的经验中,如果把好的东西与坏的东西掺杂在一起,那么结果通常是比最坏的要好但比最好的要差一些。那么,为什么集成学习可以获得比最好的单一学习器更好的性能呢?这要从人们对一个问题的争论谈起,即,强可学习与弱可学习是否等价。

    1、强可学习VS弱可学习

    强可学习((Strong PAC Learnability):一个概念C在假设空间H下是强可学习的,是指存在一个算法A,对cϵC、输入空间上的任意分布D以及εϵ(0,12)δϵ(0,12),从数据集D中给定多项式个(与1ε,1δ)独立同分布的样本,存在一个假设hϵH,使得:

    P(err(h)ε)1δ

    弱可学习(Weak PAC Learnability)一个概念C在假设空间H下是弱可学习的,是指存在一个算法A和一个γ>0,对cϵC、输入空间上的任意分布D以及δϵ(0,12),从数据集D中给定多项式个(与1δ同阶)独立同分布的样本,存在一个假设hϵH,使得:
    P(err(h)12γ)1δ

    也就是说,一个概念强可学习,那么其错误几乎可以很小;而一个弱可学习的概念,则只是比随机猜测好一点。
    Rob Schapire证明了强可学习与弱可学习是等价的,于是在学习中如果存在弱学习算法,我们就可以通过组合多个弱学习算法来得到强学习算法。
    如何选择学习器?
    每个学习器应尽可能不相关,同时分类错误率小于0.5。分类器要有足够的多样性(Diversity)。如何获得这些不相关的学习器呢?一种方法是,对训练数据集采样,这样采样出的子集有差异,训练出来的学习器也就有较大的差异;另一种方法是,先训练一个分类器,然后根据这个分类器的表现改变训练数据的分布,使得被分类错误的样本有更大的权重。这样,集成学习方法可以分成两类,一类是bagging/随机森林,一类是提升算法(Boosting)。


    二、Bagging与随机森林(Random Forest)、随机蕨(Random Fern)

    1、决策树(Decision Tree)

    决策树是一个常用的机器学习算法。它采用了分而治之的策略,也就是对一个分类问题,每次从学习得到的特征集中选取一个特征把输入数据分成两类。训练也就是生成决策树的时候,最关键的就是选择每个节点的划分标准。按照节点划分标准的不同,决策树可以分成三类:ID3、C4.5、CART。

    ID3

    ID3算法每次选择一个特征,使得样本集的信息量减少最大。这样,熵减少得最快,有望获得一棵深度最浅的树。具体是:已知训练样本集D(假设有C类),我们可以根据这个样本集中每一类出现的概率,算出样本集D包含的信息量。然后,从特征集X中选择一个特征x,则我们可以计算已知x的情况下各类的条件概率,然后计算出已知x的情况下D包含的信息量。也就是说,我们要选择一个x使得x与D相互包含的信息量最大:

    argmaxxϵXI(x,D)

    C4.5

    C4.5算法不直接用信息增益,而是使用信息增益率来选择最优划分。

    CART

    CART使用基尼指数来选择划分。基尼指数反映的是从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此基尼指数越少,数据集D包含的信息量越少。CART在候选特征集中选取一个特征,使得划分后基尼指数最小。

    防止过拟合

    决策树防止过拟合的方法分别是:

    • 剪枝:包括预剪枝、后剪枝
    • 集成学习

    实际经验表明,决策树划分标准的选择,如信息增益、信息增益率、基尼指数虽然对决策树的深度有较大影响,但对泛化性能影响有限。而剪枝对决策树泛化性能的影响是相当显著的。

    2、Bagging集成

    如前所述,训练每个分类器的时候,每次从训练数据集中采样,用样本集训练基分类器。Bagging是一种有放回的采样。也就是训练的时候使用了相互有交叠的子集。

    3、随机森林(Random Forest)

    • 随机森林在以决策树为基学习器构建bagging集成基础上做了一些修改:在决策树训练的过程中引入了随机的属性选择,对决策树的每个节点,从该节点的属性集中随机选择一个子集,然后再从这个子集中选择一个最优的属性作为划分。这种随机选择增强了基学习器的多样性。
    • 引入选择属性的随机性,降低了单个决策树的性能,但随着学习器数目的增加,随机森林比Bagging收敛到更低的泛化误差。

    三、提升算法(Boosting)

    1、常用的提升算法包括Adaboost(自适应提升算法)、Gradient Boost(梯度提升)等。
    Boosting算法的训练过程是:从初始训练集中训练出一个基学习器,再根据基学习器调整训练样本的分布,使得先前分类错误的样本获得更多的关注,然后用调整后的样本分布训练下一个基学习器。如此重复直到基学习器数目达到预定的值。最后输出是这T个学习器的某种加权。
    2、提升算法的关键有两个,一是如何改变训练样本的分布;二是如何将弱分类器组合成强分类器。
    Adaboost训练时提高那些被前一轮分类错误的样本的权值,而降低那些被分类正确的样本的权值;Gradient Boost每一次的计算都是为了减少上一次的残差,使得损失函数在梯度方向下降。

    Adaboost算法

    输入:训练集D={(x1,y1),(x2,y2),…,(xm,ym)};基学习算法ε;训练轮数T
    过程:
    1、D1(x)=1m
    2、for t=1,2,3,…,T,do
      ht=ε(D,Dt)
      εt=PxDt(ht(x)f(x))
      if εt>0.5,then break
      αt=12ln1εtεt
      Dt+1(x)=Dt(x)Zt×{exp(αt),if ht(x)=f(x)exp(αt),if ht(x)f(x)
      end for
    输出:H(x)=sign(ΣTt=1αtht(x))

      

    参考文献:
    [1]李航.统计学习方法
    [2]周志华.机器学习

  • 相关阅读:
    JUnit中的设计模式:组合模式 Composite
    Activity在屏幕显示的方向切换
    Jenkins插件之有用
    Jenkins插件之Dashboard和wall display
    python技巧32[常用技巧集]
    Jenkins插件之构建与MSBuild
    Jenkins插件之Publish Over SSH/CIFS/FTP
    使用devenv/MSBuild在命令行编译单个project
    Jenkins中执行batch和Python
    python翻译[排序高级]
  • 原文地址:https://www.cnblogs.com/goodluckcwl/p/5686106.html
Copyright © 2011-2022 走看看