更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/

AdaBoost算法

集成学习中弱学习器之间有强依赖关系的,称之为Boosting系列算法,而AdaBoost则是Boosting系列算法中最著名的算法之一。

AdaBoost算法强大之处在于既可以解决分类问题,又可以解决回归问题。

一、AdaBoost算法学习目标

  1. AdaBoost算法目标函数优化
  2. 强分类器和强回归器流程
  3. AdaBoost算法优缺点

二、AdaBoost算法详解

2.1 Boosting算法回顾

Boosting算法的流程是:首先训练处一个弱学习器,根据弱学习器的误差率更新训练样本的权重,然后基于调整权重后的训练集训练第二个弱学习器,直到弱学习器达到事先指定的数目T,停止算法。

对于Boosting算法的流程,可以看到如果我们解决以下4个问题,既可以得到完整的Boosting算法

  1. 弱学习器的误差率
  2. 训练样本的权重\(w\)更新方法
  3. 更新样本权重的方法
  4. 结合策略

2.2 AdaBoost算法

上面讲到了Boosting算法需要解决的4个问题,因为AdaBoost算法隶属于Boosting算法,那么AdaBoost算法也需要解决这4个问题,其实也可以说成只要是Boosting系列的算法,都需要解决这4个问题。

2.3 AdaBoost算法目标函数优化

AdaBoost算法可以理解成模型是加法模型、目标函数是指数函数、学习算法是前向分步算法时的学习方法。其中加法模型可以理解成强学习器是由之前所有的弱学习器加权平均得到的;前向分步算法则可以理解成弱学习器训练数据的权重通过前一个弱学习器更新。

AdaBoost算法的模型是加法模型,即强学习器的模型为
\[
f(x) = \sum_{k=1}^K \alpha_kG_k(x)
\]
其中\(K\)是\(K\)个弱学习器。

AdaBoost算法的事前向分步算法,即经过\(k-1\)次迭代后,第\(k-1\)轮后强学习器为
\[
\begin{align}
f_{k-1}(x) & = \alpha_1G_1(x)+\alpha_2G_2(x)+\cdots+\alpha_{k-1}G_{k-1}(x)\\
& = f_{k-2}(x) + \alpha_{k-1} G_{k-1}(x)
\end{align}
\]
经过\(k\)次迭代后,第\(k\)轮后强学习器为
\[
f_k(x) = \sum_{i=1}^k \alpha_i G_i(x) = f_{k-1}(x) + \alpha_kG_k(x)
\]
得到第\(k\)轮强学习器后,我们知道AdaBoost的目标函数是指数函数,因此我们的目标是使前向分步算法得到的\(\alpha_k\)和\(G_k(x)\)使\(f_k(x)\)在训练数据集上的指数损失最小,即AdaBoost的目标函数为
\[
\begin{align}
(\alpha_k,G_k(x)) & = \underbrace{\arg\,min}_{\alpha,G}\sum_{i=1}^m e^{-y_if_k(x)}\\
& = \underbrace{\arg\,min}_{\alpha,G}\sum_{i=1}^m e^{[{-y_i(f_{k-1}(x_i)+\alpha{G(x_i)}})]} \\
& = \underbrace{\arg\,min}_{\alpha,G}\sum_{i=1}^m e^{[{-y_i(f_{k-1}(x_i))}]} e^{[{-y_i(\alpha{G(x_i)}})]}
\end{align}
\]
由于\(e^{[{-y_i(f_{k-1}(x_i))}]}\)的值不依赖\(\alpha,G\),因此他与最小化无关,它仅仅依赖于随着每一轮迭代而变化的\(f_{k-1}(x)\),因此可以把\(e^{[{-y_i(f_{k-1}(x_i))}]}\)看做\(\overline{w}_{ki}\),即目标函数变为
\[
(\alpha_k,G_k(x)) = \underbrace{\arg\,min}_{\alpha,G}\sum_{i=1}^m \overline{w}_{ki} e^{[{-y_i(\alpha{G(x_i)}})]}
\]
现在的目标就是最优化AdaBoost的目标函数得到能使目标函数最小化的\(\alpha_k^*\)和\(G_k^*(x)\)。

首先,对于任意的\(\alpha>0\),\(G_k^*(x)\)表示第\(k\)轮能够使得加训练数据分类误差率最小的基本分类器,分类误差率为
\[
e_k = {\frac{\sum_{i=1}^m\overline{w}_{ki}I(y_i\neq{G_k(x_i)})}{\sum_{i=1}^m\overline{w}_{ki}}} = \sum_{i=1}^m\overline{w}_{ki}I(y_i\neq{G_k(x_i)}) = \sum_{{y_i}\neq{G_k(x_i)}}\overline{w}_{ki}
\]
\(G_k^*(x)\)为
\[
G_k^*(x) = \underbrace{arg\,\min}_{G}\sum_{i=1}^m \overline{w}_{ki} I(y_i\neq{G(x_i))}
\]
\(G_k^*(x)\)即为学习器的\(G_k(x)\),把\(G_k(x)\)代入目标函数对\(\alpha\)求导并使导数为0,可以把上述的目标函数优化成
\[
\begin{align}
(\alpha_k,G_k(x)) & = \underbrace{\arg\,min}_{\alpha,G}\sum_{i=1}^m \overline{w}_{ki} e^{[{-y_i(\alpha{G(x_i)}})]} \\
& = \underbrace{\arg\,min}_{\alpha,G}\sum_{y_i=G_k(x_i)}\overline{w}_{ki}e^{-\alpha}+\sum_{y_i\neq{G_k(x_i)}}\overline{w}_{ki}e^{\alpha} \\
& = \underbrace{\arg\,min}_{\alpha,G} (1-e_k)e^{-\alpha} + e_ke^{\alpha}
\end{align}
\]
既得最小的\(\alpha\)为
\[
\alpha_k^* = {\frac{1}{2}}\log{\frac{1-e_k}{e_k}}
\]
最后看样本的权重更新,利用\(f_k(x)=f_{k-1}(x)+\alpha_kG_k(x)\)和\(\overline{w}_{ki}=e^{[-y_if_{k-1}(x_i)]}\)可得
\[
\begin{align}
\overline{w}_{k+1,i} & = e^{[-y_if_{k}(x_i)]} \\
& = e^{[-y_i(f_{k-1}(x_i))-y_i(\alpha_kG_k(x_i))]} \\
& = \overline{w}_{ki}e^{[-y_i\alpha_kG_k(x)]}
\end{align}
\]
\(\overline{w}_{k+1,i}\)即接下来要讲到的AdaBoost算法的训练数据权重的更新公式。

三、AdaBoost算法流程

AdaBoost算法既可以解决分类问题,又可以解决回归问题。对于分类问题,此处我们讲述的AdaBoost算法流程主要是针对二分类问题,二分类问题和多分类问题的区别主要在于弱分类器的系数上,本文会介绍AdaBoost SAMME算法如何计算弱分类器的系数;对于回归问题,由于AdaBoost用来解决回归问题的变种有很多,本文只对AdaBoost R2算法做一个介绍。

3.1 输入

\(m\)个样本\(n\)个特征的训练数据集\(T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}\)。

针对二分类问题,\(y_i\in{Y=\{1,-1\}}\)。

3.2 输出

最终强学习器\(G(x)\)。

3.3 强分类器流程

  1. 初始化训练数据的权重
    \[
    D_1 = (w_{11},\cdots,w_{1i},\cdots,w_{1m}),\quad{w_{1i}={\frac{1}{m}},\quad{i=1,2,\cdots,m}}
    \]
  2. 生成弱分类器
    \[
    G_k(x),\quad{k=1,2,\cdots,K}
    \]
  3. 计算弱分类器\(G_k(x)\)在训练集上的分类误差率为
    \[
    \begin{align}
    e_k & = \sum_{i=1}^m P(G_k(x_i)\neq{y_i}) \\
    & = \sum_{i=1}^m w_{k_i} I(G_k(x_i)\neq{y_i})
    \end{align}
    \]
  4. 计算\(G_k(x)\)的权重系数
    \[
    \begin{align}
    & \alpha_k={\frac{1}{2}}\log{\frac{1-e_k}{e_k}}\quad\text{二分类问题} \\
    & \alpha_k={\frac{1}{2}}\log{\frac{1-e_k}{e_k}}+\log(R-1)\quad\text{多分类问题}
    \end{align}
    \]
    二分类问题的权重系数中,可以看出如果分类误差率\(e_k\)越大,则对应的弱分类器的权重系数\(\alpha_k\)越小,即误差率小的弱分类器权重系数越大。

多分类问题使用的是AdaBoost SAMME算法,其中\(R\)为类别数,如果\(R=2\),则该多元分类的权重系数将变成二元分类的权重系数。

  1. 更新训练数据的权重
    \[
    \begin{align}
    & D_{k+1} = (w_{k+1,1},\cdots,w_{k+1,i},\cdots,w_{k+1,m}) \\
    & w_{k+1,i} = {\frac{w_{ki}}{Z_k}}e^{-\alpha_ky_iG_k(x_i)},\quad{i=1,2,\cdots,m}\\
    \end{align}
    \]
    其中\(Z_k\)是规范因子
    \[
    Z_k=\sum_{i=1}^mw_{ki}e^{-\alpha_ky_iG_k(x_i)}
    \]
    从\(w_{k+1,i}\)的计算公式中可以看出,如果第\(i\)个样本分类错误,则\(y_iG_k(x_i)<0\),导致样本的权重在第\(k+1\)个弱分类器中变大,反之,则样本权重在第\(k+1\)个弱分类器中变小。
  2. 结合策略
    \[
    \begin{align}
    & f(x)=\sum_{k=1}^K\alpha_kG_k(X)\quad\text{线性模型} \\
    & G(x)=sign(\sum_{k=1}^K\alpha_kG_k(X))\quad\text{最终强分类器}G(x)
    \end{align}
    \]

3.4 强回归器流程

  1. 初始化训练数据的权重
    \[
    D_1 = (w_{11},\cdots,w_{1i},\cdots,w_{1m}),\quad{w_{1i}={\frac{1}{m}},\quad{i=1,2,\cdots,m}}
    \]
  2. 生成弱分类器
    \[
    G_k(x),\quad{k=1,2,\cdots,K}
    \]
  3. 计算弱回归器\(G_k(x)\)在训练集上的最大误差
    \[
    E_k = \max|y_i-G_k(x_i)|,\quad{i=1,2,\cdots,m}
    \]
  4. 计算每个样本之间的相对误差
    \[
    e_{ki}={\frac{|y_i-G_k(x_i)|}{E_k}}
    \]
    此处也可以使用均方误差,即\(e_{ki}={\frac{(y_i-G_k(x_i))^2}{E_k^2}}\)
  5. 计算第\(k\)弱回归器的误差率和权重系数
    \[
    \begin{align}
    & e_k = \sum_{i=1}^m w_{ki} e_{ki}\quad\text{误差率} \\
    & \alpha_k = {\frac{e_k}{1-e_k}}\quad\text{权重系数}
    \end{align}
    \]
  6. 更新训练数据的权重
    \[
    w_{k+1,i} = {\frac{w_{ki}}{Z_k}\alpha_k^{1-e_{ki}}}
    \]
    其中\(Z_k\)是规范因子
    \[
    Z_k = \sum_{i=1}^m w_{ki}\alpha_k^{1-e_{ki}}
    \]
  7. 结合策略
    \[
    G(x) = G_{k^*}(x)
    \]
    其中\(G_{k^*}(x)\)是所有\(\ln{\frac{1}{\alpha_k}},\quad{k=1,2,\cdots,K}\)的中位数对应序号\(k^*\)对应的弱回归器

四、AdaBoost算法优缺点

4.1 优点

  1. 不容易过拟合
  2. 分类精准度高
  3. 由于弱分类器既可以是分类器又可以是回归器,使用灵活

4.2 缺点

  1. 由于是对训练数据加权,有可能会赋予训练数据中的异常值较高的权重,影响模型的准确度

五、小结

AdaBoost算法并没有使用较深的数学知识,而是推导过程涉及较为复杂的逻辑。如果看完一遍还不是很理解,需要自己多多揣摩。

AdaBoost算法目前是一个比较流行的Boosting算法,他的弱学习器既可以是回归器,又可以是分类器,这也是AdaBoost较为强大的一点。虽然理论上任何学习器都可以作为AdaBoost的弱学习器,但是AdaBoost算法用的较多的弱学习器一般还是决策树和神经网络。

相信有了第一个集成算法AdaBoost的基础,对于接下来的第二个用的较为广泛的Boosting系列算法你也能很快熟悉他,即梯度提升树(gradient boosting decision tree,GBDT)

04-02 AdaBoost算法的更多相关文章

  1. 集成学习值Adaboost算法原理和代码小结(转载)

    在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类: 第一个是个体学习器之间存在强依赖关系: 另一类是个体学习器之间不存在强依赖关系. 前者的代表算法就是提升(bo ...

  2. 集成学习之Adaboost算法原理小结

    在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,另一类是个体学习器之间不存在强依赖关系.前者的代表算法就是是boostin ...

  3. Adaboost 算法

    一 Boosting 算法的起源 boost 算法系列的起源来自于PAC Learnability(PAC 可学习性).这套理论主要研究的是什么时候一个问题是可被学习的,当然也会探讨针对可学习的问题的 ...

  4. Adaboost 算法的原理与推导

    0 引言 一直想写Adaboost来着,但迟迟未能动笔.其算法思想虽然简单“听取多人意见,最后综合决策”,但一般书上对其算法的流程描述实在是过于晦涩.昨日11月1日下午,邹博在我组织的机器学习班第8次 ...

  5. 一个关于AdaBoost算法的简单证明

    下载本文PDF格式(Academia.edu) 本文给出了机器学习中AdaBoost算法的一个简单初等证明,需要使用的数学工具为微积分-1. Adaboost is a powerful algori ...

  6. Adaboost算法初识

    1.算法思想很简单: AdaBoost 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器,即弱分类器,然后把这些弱分类器集合起来,构造一个更强的最终分类器.(三个臭皮匠,顶个诸葛亮) 它的 ...

  7. 【AdaBoost算法】积分图代码实现

    一.积分图介绍 定义:图像左上方的像素点值的和: 在Adaboost算法中可用于加速计算Haar或MB-LBP特征值,如下图: 二.代码实现 #include <opencv/highgui.h ...

  8. Adaboost算法结合Haar-like特征

    Adaboost算法结合Haar-like特征 一.Haar-like特征 目前通常使用的Haar-like特征主要包括Paul Viola和Michal Jones在人脸检测中使用的由Papageo ...

  9. adaboost算法

    三 Adaboost 算法 AdaBoost 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器,即弱分类器,然后把这些弱分类器集合起来,构造一个更强的最终分类器.(很多博客里说的三个臭皮匠 ...

  10. AdaBoost 算法原理及推导

    AdaBoost(Adaptive Boosting):自适应提升方法. 1.AdaBoost算法介绍 AdaBoost是Boosting方法中最优代表性的提升算法.该方法通过在每轮降低分对样例的权重 ...

随机推荐

  1. 这一次,彻底弄懂 Promise 原理

    作者声明 本人将迁移至个人公众号「前端Q」及「掘金」平台写文章.博客园的文章将不再及时更新发布.欢迎大家关注公众号「前端Q」及我的掘金主页:https://juejin.im/user/5874526 ...

  2. Java 中初始化 List 集合的 7 种方式

    1.常规方式 List<String> languages = new ArrayList<>(); languages.add("Java"); lang ...

  3. Hbase 统计表行数的3种方式总结

    有些时候需要我们去统计某一个Hbase表的行数,由于hbase本身不支持SQL语言,只能通过其他方式实现.可以通过一下几种方式实现hbase表的行数统计工作: 1.count命令 最直接的方式是在hb ...

  4. 遇到XML-GB2312网页编码的处理方法

    报的错误:encoding error : input conversion failed due to input error, bytes  I/O error : encoder error 1 ...

  5. 新建web工程

    1.选择新建Dynamic  Web Project 2.选择服务器和版本(2.5) 3.WebContend目录下新建一个html文件 4.运行 工程的目录结构: WEB-INF目录时受保护的,不能 ...

  6. C#基础知识总结(三)--反射

    如何在C#.NET开发中使用反射. 首先,我新建一个普通的类库项目.在该项目的测试类中,定义好 属性.静态方法.实例方法.无参方法等... 代码如下: using System; using Syst ...

  7. C++基础之适配器

    什么是容器适配器? ”适配器是使一种事物的行为类似于另外一种事物行为的一种机制”,适配器对容器进行包装,使其表现出另外一种行为.例如,stack<int, vector<int> & ...

  8. Spring入门(十四):Spring MVC控制器的2种测试方法

    作为一名研发人员,不管你愿不愿意对自己的代码进行测试,都得承认测试对于研发质量保证的重要性,这也就是为什么每个公司的技术部都需要质量控制部的原因,因为越早的发现代码的bug,成本越低,比如说,Dev环 ...

  9. Centos修改yum源为国内阿里源

    以下为修改Centos6.5的yum源: 1. 备份原镜像文件,便于后期恢复 [root@keepmydream ~]# mv /etc/yum.repos.d/CentOS-Base.repo /e ...

  10. 浅谈HDFS(二)之NameNode与SecondaryNameNode

    NN与2NN工作机制 思考:NameNode中的元数据是存储在哪里的? 假设存储在NameNode节点的硬盘中,因为经常需要随机访问和响应客户请求,必然效率太低,所以是存储在内存中的 但是,如果存储在 ...