本文结构:

  • 什么是集成学习?
  • 为什么集成的效果就会好于单个学习器?
  • 如何生成个体学习器?
  • 什么是 Boosting?
  • Adaboost 算法?

什么是集成学习

集成学习就是将多个弱的学习器结合起来组成一个强的学习器。

这就涉及到,先产生一组‘个体学习器’,再用一个策略将它们结合起来。

个体学习器可以选择:决策树,神经网络。
集成时可以所有个体学习器属于同一类算法:全是决策树,或全是神经网络;也可以来自不同的算法。
结合策略:例如分类问题,可以用投票法,少数服从多数。

之所以用这种集成的思想,是因为单独用一个算法时,效果往往不容易达到很好,但如果多个个体算法结合在一起,取长补短,整体效果就会比单独一个要强。


什么时候集成的效果就会好于单个学习器

当然集成并不是不管怎么选择学习器,怎么组合都一定会获得更好的效果,最好的情况是,每个学习器都不是特别差,并且要具有一定的多样性,否则可能集成后的会没有效果,或者起负作用:

来证明一下:

假设个体学习器的错误率为 ε,

假设错误率相互独立,由 Hoeffding 不等式可得到整体学习器的错误率为:

由不等式的右边可知,如果将学习器的数目 T 逐渐增大,那么整个学习器的错误率将指数级下降,甚至最终趋向于零。


这里提到了‘错误率相互独立’的假设,这就是集成学习的一个核心问题:
如何生成准确性又不是很差,并且还能保证多样性的个体学习器呢

目前主要有两种生成方式:

Boosting:个体学习器间存在强依赖关系,必须串行生成。
Bagging,随机森林:个体之间不存在强依赖关系,可并行生成。


Boosting 思想:
给定初始训练数据,由此训练出第一个基学习器;
根据基学习器的表现对样本进行调整,在之前学习器做错的样本上投入更多关注;
用调整后的样本,训练下一个基学习器;
重复上述过程 T 次,将 T 个学习器加权结合。

根据 Boosting 的定义,它有三个基本要素:
基学习器
组合方式
目标函数


Boosting 的代表是 Adaboost:
AdaBoost方法相对于大多数其它学习算法而言,不会很容易出现过拟合现象。

Adaboost 算法

  • 第 1 行,初始化样本权重分布,此时每个数据的权重是一样的,所以是 1/m;
    以分类问题为例,最初令每个样本的权重都相等,对于第 t 次迭代操作,我们就根据这些权重来选取样本点,进而训练分类器 C_t

  • 第 2 行,进入 for 循环 T 次,即基学习器的个数为 T 个;

  • 第 3 行,根据具有当前权重分布 D_t 的数据集,学习出 h_t
    前一个分类器分错的样本会被用来训练下一个分类器。
    h_t 是分量分类器 C_t 给出的对任一样本点 xi 的标记(+1或-1),h_t(xi) = yi 时,样本被正确分类。

  • 第 4 行,计算当前学习器的误差;

  • 第 5 行,如果误差大于 0.5,就停止;
    AdaBoost 方法中使用的分类器可能很弱(比如出现很大错误率),但只要它的分类效果比随机好一点(比如两类问题分类错误率略小于0.5),就能够改善最终得到的模型。

  • 第 6 行,计算当前学习器的权重 α_t
    权值是关于误差的表达式,当下一次分类器再次错分这些点之后,会提高整体的错误率,这样就导致分类器权值变小,进而导致这个分类器在最终的混合分类器中的权值变小,也就是说,Adaboost算法让正确率高的分类器占整体的权值更高,让正确率低的分类器权值更低,从而提高最终分类器的正确率。

  • 第 7 行,得到下一时刻的权重分布 D_t+1.
    如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它被选中的概率就被降低;相反,如果某个样本点没有被准确地分类,那么它的权重就得到提高。通过这样的方式,AdaBoost 方法能“聚焦于”那些较难分(更富信息)的样本上。

最后的总体分类的判决可以使用各个分量分类器加权平均来得到,
再取符号,这样,最后对分类结果的判定规则是:


举个例子

图中“+”和“-”表示两种类别,
共10个样本,故每个样本权值为0.1,

第一次划分有3个点划分错误,根据误差表达式得到误差:e1=(0.1+0.1+0.1)/1.0=0.3

分类器权重:

根据算法,对于正确分类的7个点,权值不变,仍为0.1, 对于错分的3个点,权值为:
D1=D0*(1-e1)/e1=0.1*(1-0.3)/0.3=0.2333

第二次分类,有3个 "-" 分类错误,按照算法计算如下:
上轮分类后权值之和为:0.17+0.23333=1.3990
分类误差:e2=0.1*3/1.3990=0.2144
分类器权重 a2=0.6493
错分的3个点权值为:D2=0.1*(1-0.2144)/0.2144=0.3664

第三次:

最后将三次的分类器结合起来,得到上面的分类结果:


接下来看 α_t , D_t 是怎么推导出来的

我们最后学习出来的预测数据的模型为 H:

即强学习器是基学习器的线性组合形式。

目标函数用指数损失函数:

为什么目标函数用指数损失函数?

当我们用指数损失函数时,

我们需要求得 H 使得损失函数达到极小,那么就想到求偏导,

并使其为 0,得到 H 的形式:

那么最终的判定规则为:

说明若指数损失达到最小,则分类错误率也将最小化,也就是说指数损失可以作为分类任务 0 1 损失的替代函数,因为它连续可微,就用它来替代 0 1 损失函数作为优化目标。

第一个基学习器由初始数据得到,之后的 α_t , h_t 都是迭代产生。

第 6 行: α_t

想要求得 α_t 使得 α_t*h_t 最小化指数损失函数:

那就需要对 α_t 求导:

使导数为 0 后得到 α_t 的解为:

第 4,5 行: h_t 的条件

学习到 H_t-1 后,希望下一个 h_t 可以纠正 H_t-1 的全部错误,即使下面的目标函数达到最小:

经过一系列推导后,可得到理想的基学习器为:

即理想的 h_t 将在分布 D_t 下最小化分类误差,也就是在用 D_t 训练 h_t 时,分类误差应小于 0.5。

第 7 行:再推导一下 D_tD_t-1 之间的关系

这样就推导出了 Adaboost 算法。

参考:
《机器学习》
https://zh.wikipedia.org/wiki/AdaBoost
http://blog.csdn.net/iemyxie/article/details/40423907

【机器学习笔记之四】Adaboost 算法的更多相关文章

  1. python机器学习笔记:EM算法

    EM算法也称期望最大化(Expectation-Maximum,简称EM)算法,它是一个基础算法,是很多机器学习领域的基础,比如隐式马尔科夫算法(HMM),LDA主题模型的变分推断算法等等.本文对于E ...

  2. Python机器学习笔记:K-Means算法,DBSCAN算法

    K-Means算法 K-Means 算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛.K-Means 算法有大量的变体,本文就从最传统的K-Means算法学起,在其基础上学习 ...

  3. 机器学习实战之AdaBoost算法

    一,引言 前面几章的介绍了几种分类算法,当然各有优缺.如果将这些不同的分类器组合起来,就构成了我们今天要介绍的集成方法或者说元算法.集成方法有多种形式:可以使多种算法的集成,也可以是一种算法在不同设置 ...

  4. 《机器学习技法》---AdaBoost算法

    1 AdaBoost的推导 首先,直接给出AdaBoost算法的核心思想是:在原数据集上经过取样,来生成不同的弱分类器,最终再把这些弱分类器聚合起来. 关键问题有如下几个: (1)取样怎样用数学方式表 ...

  5. 机器学习——提升方法AdaBoost算法,推导过程

    0提升的基本方法 对于分类的问题,给定一个训练样本集,求比较粗糙的分类规则(弱分类器)要比求精确的分类的分类规则(强分类器)容易的多.提升的方法就是从弱分类器算法出发,反复学习,得到一系列弱分类器(又 ...

  6. 吴裕雄 python 机器学习——集成学习AdaBoost算法回归模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,ensemble from sklear ...

  7. 吴裕雄 python 机器学习——集成学习AdaBoost算法分类模型

    import numpy as np import matplotlib.pyplot as plt from sklearn import datasets,ensemble from sklear ...

  8. 【学习笔记】 Adaboost算法

    前言 之前的学习中也有好几次尝试过学习该算法,但是都无功而返,不仅仅是因为该算法各大博主.大牛的描述都比较晦涩难懂,同时我自己学习过程中也心浮气躁,不能专心. 现如今决定一口气肝到底,这样我明天就可以 ...

  9. Python机器学习笔记——随机森林算法

    随机森林算法的理论知识 随机森林是一种有监督学习算法,是以决策树为基学习器的集成学习算法.随机森林非常简单,易于实现,计算开销也很小,但是它在分类和回归上表现出非常惊人的性能,因此,随机森林被誉为“代 ...

随机推荐

  1. Example003通过按钮创建窗口

    <!--实例003通过按钮创建窗口--> <head> <meta charset="UTF-8"> </head> <for ...

  2. 如何为一个eclipse安装android环境

    据说android已经不再支持android adt-bundle的开发环境了,所以如果继续使用的话,会不再更新 使用eclipse来安装android环境或者使用android studio 但是以 ...

  3. Spring Security Filter详解

    Spring Security Filter详解 汇总 Filter 作用 DelegatingFilterProxy Spring Security基于这个Filter建立拦截机制 Abstract ...

  4. SQL数据库操作(CURD)

    对数据仓库的操作(CURD): 新增:  create database db_test; 新增的时候设置编码: create database da_test_1 character set utf ...

  5. 多表链接 Left join

    select * from( select  U_User.LinkMan, SP_Approval.* ,SP_Approval_Msg.ApprovalUserID,ROW_NUMBER()   ...

  6. c# Activex开发之HelloWorld

    最近需要在Web上使用WinFrom程序,所以要用到Activex技术将WinFrom程序变成插件在Web运行 一.创建用户控件 1.1 新建用户控件项目 1.2 在界面上拉一个label,Text赋 ...

  7. webpack教程(三)——热刷新

    现在我们如果修改代码,需要重新打包,再一次在命令行下输入webpack命令,很麻烦. 热刷新是什么呢?就是我们该完代码保存之后webpack会自动打包引起浏览器自动刷新,你只需要把精力都专注在代码研发 ...

  8. SQL Server 2008R2的安装

    一.安装前的准备工作:SQL Server 200R2安装包 二.SQL Server2008R2的安装 1.打开SQL Server2008R2的安装包,找到setup.exe 2.双击sql se ...

  9. Dapper.Rainbow 简单使用

    一.  Dapper 简介        一个效率比较高的微型ORM.   二 . Dapper.Rainbow        Dapper的扩展,在这个扩展里面实现了 Dynamic 的 插入和更新 ...

  10. 列表的系列操作(python)

    除了定义和切片外,这里总结下系列的操作: # hanbb come on! names = ["hbb",'tian','bao','cheng'] #Add names.appe ...