1. 概述

1.1 集成学习

目前存在各种各样的机器学习算法,例如SVM、决策树、感知机等等。但是实际应用中,或者说在打比赛时,成绩较好的队伍几乎都用了集成学习(ensemble learning)的方法。集成学习的思想,简单来讲,就是“三个臭皮匠顶个诸葛亮”。集成学习通过结合多个学习器(例如同种算法但是参数不同,或者不同算法),一般会获得比任意单个学习器都要好的性能,尤其是在这些学习器都是"弱学习器"的时候提升效果会很明显。

弱学习器指的是性能不太好的学习器,比如一个准确率略微超过50%的二分类器。

下面看看西瓜书对此做的一个简单理论分析。
考虑一个二分类问题、真实函数以及个相互独立且犯错概率均为的个体学习器(或者称基学习器)。我们用简单的投票进行集成学习,即分类结果取半数以上的基学习器的结果:

由Hoeffding不等式知,集成学习后的犯错(即过半数基学习器犯错)概率满足

指出,当犯错概率独立的基学习器个数很大时,集成后的犯错概率接近0,这也很符合直观想法: 大多数人同时犯错的概率是比较低的。

就如上面加粗字体强调的,以上推论全部建立在基学习器犯错相互独立的情况下,但实际中这些学习器不可能相互独立,而如何让基学习器变得“相对独立一些”,也即增加这些基学习器的多样性,正是集成学习需要考虑的主要问题。

按照每个基学习器之间是否存在依赖关系可以将集成学习分为两类:

  1. 基学习器之间存在强依赖关系,一系列基学习器需要串行生成,代表算法是Boosting;
  2. 基学习器之间不存在强依赖关系,一系列基学习器可并行生成,代表算法是Bagging和随机森林。

Boosting系列算法里最著名算法主要有AdaBoost和提升树(Boosting tree)系列算法,本文只介绍最具代表性的AdaBoost。提升树、Bagging以及随机森林不在本文介绍范围内,有时间了再另外介绍。

1.2 Boosting

Boosting指的是一类集成方法,其主要思想就是将弱的基学习器提升(boost)为强学习器。具体步骤如下:

  1. 先用每个样本权重相等的训练集训练一个初始的基学习器;
  2. 根据上轮得到的学习器对训练集的预测表现情况调整训练集中的样本权重(例如提高被错分类的样本的权重使之在下轮训练中得到更多的关注), 然后据此训练一个新的基学习器;
  3. 重复2直到得到个基学习器,最终的集成结果是个基学习器的组合。

由此看出,Boosting算法是一个串行的过程。

Boosting算法簇中最著名的就是AdaBoost,下文将会详细介绍。

2. AdaBoost原理

2.1 基本思想

对于1.2节所述的Boosting算法步骤,需要回答两个问题:

  1. 如何调整每一轮的训练集中的样本权重?
  2. 如何将得到的个学习器组合成最终的学习器?

AdaBoost(Adaptive Boosting, 自适应增强)算法采取的方法是:

  1. 提高上一轮被错误分类的样本的权值,降低被正确分类的样本的权值;
  2. 线性加权求和。误差率小的基学习器拥有较大的权值,误差率大的基学习器拥有较小的权值。

下面先给出AdaBoost算法具体实现步骤,至于算法解释(为什么要这样做)将在下一大节阐述。

2.2 算法步骤

考虑如下形式的二分类(标准AdaBoost算法只适用于二分类任务)训练数据集:其中是一个含有个元素的列向量, 即;是标量,

Adaboost算法具体步骤如下:

  1. 初始化样本的权重

  1. ,重复以下操作得到个基学习器:
    (1) 按照样本权重分布训练数据得到第个基学习器:

(2) 计算在加权训练数据集上的分类误差率:

上式中是指示函数,考虑更加周全的AdaBoost算法在这一步还应该判断是否满足基本条件(例如生成的基学习器是否比随机猜测好), 如果不满足,则当前基学习器被抛弃,学习过程提前终止。

(3) 计算的系数(即最终集成使用的的基学习器的权重):

(4) 更新训练样本的权重,其中是规范化因子,目的是为了使的所有元素和为1。

  1. 构建最终的分类器线性组合

   得到最终的分类器为

由式知,当基学习器的误差率时,,并且随着的减小而增大,即分类误差率越小的基学习器在最终集成时占比也越大。即AdaBoost能够适应各个弱分类器的训练误差率,这也是它的名称中"适应性(Adaptive)"的由来。

由式知, 被基学习器误分类的样本权值得以扩大,而被正确分类的样本的权值被得以缩小。

需要注意的是式中所有的的和并不为1(因为没有做一个softmax操作),的符号决定了所预测的类,其绝对值代表了分类的确信度。

3. AdaBoost算法解释

有没有想过为什么AdaBoost算法长上面这个样子,例如为什么要用式那样计算?本节将探讨这个问题。

3.1 前向分步算法

在解释AdaBoost算法之前,先来看看前向分步算法。就以AdaBoost算法的最终模型表达式为例:

可以看到这是一个“加性模型(additive model)”。我们希望这个模型在训练集上的经验误差最小,即

通常这是一个复杂的优化问题。前向分步算法求解这一优化问题的思想就是: 因为最终模型是一个加性模型,如果能从前往后,每一步只学习一个基学习器及其权重, 不断迭代得到最终的模型,那么就可以简化问题复杂度。具体的,当我们经过轮迭代得到了最优模型时,因为

所以此轮优化目标就为求解上式即可得到第个基分类器及其权重
这样,前向分步算法就通过不断迭代求得了从的所有基分类器及其权重,问题得到了解决。

3.2 AdaBoost算法证明

上一小结介绍的前向分步算法逐一学习基学习器,这一过程也即AdaBoost算法逐一学习基学习器的过程。本节就证明前向分步算法的损失函数是指数损失函数(exponential loss function)时,AdaBoost学习的具体步骤就如2.2节所示。

指数损失函数即,指数损失函数是分类任务原本0/1损失函数的一致(consistent)替代损失函数(损失函数的上界,优化指数损失函数,等价于优化AdaBoost的损失函数)。由于指数损失函数有更好的数学性质,例如处处可微,所以我们用它替代0/1损失作为优化目标。

将指数损失函数代入式,优化目标就为因为与优化变量无关,如果令

这个其实就是2.2节中归一化之前的权重

那么式等价于

我们分两步来求解式所示的优化问题的最优解:

  1. 对任意的, 求上式将指数函数换成指示函数是因为前面说的指数损失函数和0/1损失函数是一致等价的。

式子所示的优化问题其实就是AdaBoost算法的基学习器的学习过程,即2.2节的步骤2(1),得到的是使第轮加权训练数据分类误差最小的基分类器。

  1. 求解

将式子中的目标函数展开注:为了简洁,上式子中的被略去了被略去了下标,下同
将上式对求导并令导数为0,即解得其中,是分类误差率:如果式子中的归一化成和为1的话那么式也就和2.2节式一模一样了,进一步地也有上面的也就是2.2节的
最后来看看每一轮样本权值的更新,由可得如果将上式进行归一化成和为1的话就和与2.2节中完全相同了。

由此可见,2.2节所述的AdaBoost算法步骤是可以经过严密推导得来的。总结一下,本节推导有如下关键点:

  • AdaBoost算法是一个加性模型,将其简化成前向分步算法求解;
  • 将0/1损失函数用数学性质更好的指数损失函数替代。

代码如下

    1. 对任意的, 求上式将指数函数换成指示函数是因为前面说的指数损失函数和0/1损失函数是一致等价的。
      式子所示的优化问题其实就是AdaBoost算法的基学习器的学习过程,即2.2节的步骤2(1),得到的是使第轮加权训练数据分类误差最小的基分类器。

AdaBoost算法详解与python实现的更多相关文章

  1. 机器学习经典算法详解及Python实现--基于SMO的SVM分类器

    原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector  ...

  2. SILC超像素分割算法详解(附Python代码)

    SILC算法详解 一.原理介绍 SLIC算法是simple linear iterative cluster的简称,该算法用来生成超像素(superpixel) 算法步骤: 已知一副图像大小M*N,可 ...

  3. sip鉴权认证算法详解及python加密

    1. 认证和加密    认证(Authorization)的作用在于表明自己是谁,即向别人证明自己是谁.而相关的概念是MD5,用于认证安全.注意MD5仅仅是个hash函数而已,并不是用于加密.因为ha ...

  4. 第三十一节,目标检测算法之 Faster R-CNN算法详解

    Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal network ...

  5. 【目标检测】Faster RCNN算法详解

    Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal network ...

  6. 详解用python实现简单的遗传算法

    详解用python实现简单的遗传算法 今天整理之前写的代码,发现在做数模期间写的用python实现的遗传算法,感觉还是挺有意思的,就拿出来分享一下. 首先遗传算法是一种优化算法,通过模拟基因的优胜劣汰 ...

  7. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  8. kmp算法详解

    转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...

  9. [转] KMP算法详解

    转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段.    我们这里说的K ...

随机推荐

  1. JAVA简单上传图片至七牛

    utils package com.example.demo.utils; import com.alibaba.fastjson.JSONObject; import com.qiniu.commo ...

  2. Centos-显示或修改系统时间与日期-date

    date 显示或者修改系统时间与日期,只有超级用户才能用date命令设置和修改时间,普通用户只能显示时间 相关参数 -s 设置设置时间,格式为 Y-m-d H:M:S -d    对日期进行运算, + ...

  3. Java学习day04

    day04-课堂笔记 1.运算符[剩下的运算符] * 赋值运算符 两种类型: 基本赋值运算符:= 扩展的赋值运算符: += -= *= /= %= 它们都是先执行等号右边的表达式,最后再经过运算赋值给 ...

  4. RT Thread SPI设备 使用

    后记: 之前,我把SPI的片选在Cubemx中配置成了SPI_NSS.现在我给它改为了GPIO_OUTPUT.  同时参考了别人的类似的一个操作无线模块(采用SPI设备驱动)的例子程序(清楚了RTT的 ...

  5. Java知识系统回顾整理01基础02面向对象02属性

    一.根据实例给出"属性"的定义 一个英雄有姓名,血量,护甲等等状态 这些状态就叫做一个类的属性 二.属性的类型 属性的类型可以是基本类型,比如int整数,float 浮点数 也可以 ...

  6. MySQL数据库入侵及防御方法

    来自:http://blog.51cto.com/simeon/1981572 作者介绍 陈小兵,高级工程师,具有丰富的信息系统项目经验及18年以上网络安全经验,现主要从事网络安全及数据库技术研究工作 ...

  7. ATMEGA的SPI总线 - 第1部分

    转自: 1. https://www.yiboard.com/thread-782-1-1.html 2.https://mansfield-devine.com/speculatrix/2018/0 ...

  8. JavaCV FFmpeg采集摄像头YUV数据

    前阵子使用利用树莓派搭建了一个视频监控平台(传送门),不过使用的是JavaCV封装好的OpenCVFrameGrabber和FFmpegFrameRecorder. 其实在javacpp项目集中有提供 ...

  9. 通过VNC远程连接Linux实例

    无法使用Workbench和远程连接软件(例如PuTTY.Xshell.SecureCRT等)连接Linux实例时,您可以通过控制台的VNC远程连接实例,查看云服务器操作界面的实时状态. 前提条件 已 ...

  10. 每日一题 LeetCode 491. 递增子序列 【递推】【递增子序列】【动态规划】

    题目链接 https://leetcode-cn.com/problems/increasing-subsequences/ 题目说明 题解 主要方法:递推:动态规划 解释说明: 数据表示:观察数据范 ...