04-02 AdaBoost算法
目录
更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/
AdaBoost算法
集成学习中弱学习器之间有强依赖关系的,称之为Boosting系列算法,而AdaBoost则是Boosting系列算法中最著名的算法之一。
AdaBoost算法强大之处在于既可以解决分类问题,又可以解决回归问题。
一、AdaBoost算法学习目标
- AdaBoost算法目标函数优化
- 强分类器和强回归器流程
- AdaBoost算法优缺点
二、AdaBoost算法详解
2.1 Boosting算法回顾
Boosting算法的流程是:首先训练处一个弱学习器,根据弱学习器的误差率更新训练样本的权重,然后基于调整权重后的训练集训练第二个弱学习器,直到弱学习器达到事先指定的数目T,停止算法。
对于Boosting算法的流程,可以看到如果我们解决以下4个问题,既可以得到完整的Boosting算法
- 弱学习器的误差率
- 训练样本的权重\(w\)更新方法
- 更新样本权重的方法
- 结合策略
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 强分类器流程
- 初始化训练数据的权重
\[
D_1 = (w_{11},\cdots,w_{1i},\cdots,w_{1m}),\quad{w_{1i}={\frac{1}{m}},\quad{i=1,2,\cdots,m}}
\] - 生成弱分类器
\[
G_k(x),\quad{k=1,2,\cdots,K}
\] - 计算弱分类器\(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}
\] - 计算\(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\),则该多元分类的权重系数将变成二元分类的权重系数。
- 更新训练数据的权重
\[
\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\)个弱分类器中变小。 - 结合策略
\[
\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 强回归器流程
- 初始化训练数据的权重
\[
D_1 = (w_{11},\cdots,w_{1i},\cdots,w_{1m}),\quad{w_{1i}={\frac{1}{m}},\quad{i=1,2,\cdots,m}}
\] - 生成弱分类器
\[
G_k(x),\quad{k=1,2,\cdots,K}
\] - 计算弱回归器\(G_k(x)\)在训练集上的最大误差
\[
E_k = \max|y_i-G_k(x_i)|,\quad{i=1,2,\cdots,m}
\] - 计算每个样本之间的相对误差
\[
e_{ki}={\frac{|y_i-G_k(x_i)|}{E_k}}
\]
此处也可以使用均方误差,即\(e_{ki}={\frac{(y_i-G_k(x_i))^2}{E_k^2}}\) - 计算第\(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}
\] - 更新训练数据的权重
\[
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}}
\] - 结合策略
\[
G(x) = G_{k^*}(x)
\]
其中\(G_{k^*}(x)\)是所有\(\ln{\frac{1}{\alpha_k}},\quad{k=1,2,\cdots,K}\)的中位数对应序号\(k^*\)对应的弱回归器
四、AdaBoost算法优缺点
4.1 优点
- 不容易过拟合
- 分类精准度高
- 由于弱分类器既可以是分类器又可以是回归器,使用灵活
4.2 缺点
- 由于是对训练数据加权,有可能会赋予训练数据中的异常值较高的权重,影响模型的准确度
五、小结
AdaBoost算法并没有使用较深的数学知识,而是推导过程涉及较为复杂的逻辑。如果看完一遍还不是很理解,需要自己多多揣摩。
AdaBoost算法目前是一个比较流行的Boosting算法,他的弱学习器既可以是回归器,又可以是分类器,这也是AdaBoost较为强大的一点。虽然理论上任何学习器都可以作为AdaBoost的弱学习器,但是AdaBoost算法用的较多的弱学习器一般还是决策树和神经网络。
相信有了第一个集成算法AdaBoost的基础,对于接下来的第二个用的较为广泛的Boosting系列算法你也能很快熟悉他,即梯度提升树(gradient boosting decision tree,GBDT)
04-02 AdaBoost算法的更多相关文章
- 集成学习值Adaboost算法原理和代码小结(转载)
在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类: 第一个是个体学习器之间存在强依赖关系: 另一类是个体学习器之间不存在强依赖关系. 前者的代表算法就是提升(bo ...
- 集成学习之Adaboost算法原理小结
在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,另一类是个体学习器之间不存在强依赖关系.前者的代表算法就是是boostin ...
- Adaboost 算法
一 Boosting 算法的起源 boost 算法系列的起源来自于PAC Learnability(PAC 可学习性).这套理论主要研究的是什么时候一个问题是可被学习的,当然也会探讨针对可学习的问题的 ...
- Adaboost 算法的原理与推导
0 引言 一直想写Adaboost来着,但迟迟未能动笔.其算法思想虽然简单“听取多人意见,最后综合决策”,但一般书上对其算法的流程描述实在是过于晦涩.昨日11月1日下午,邹博在我组织的机器学习班第8次 ...
- 一个关于AdaBoost算法的简单证明
下载本文PDF格式(Academia.edu) 本文给出了机器学习中AdaBoost算法的一个简单初等证明,需要使用的数学工具为微积分-1. Adaboost is a powerful algori ...
- Adaboost算法初识
1.算法思想很简单: AdaBoost 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器,即弱分类器,然后把这些弱分类器集合起来,构造一个更强的最终分类器.(三个臭皮匠,顶个诸葛亮) 它的 ...
- 【AdaBoost算法】积分图代码实现
一.积分图介绍 定义:图像左上方的像素点值的和: 在Adaboost算法中可用于加速计算Haar或MB-LBP特征值,如下图: 二.代码实现 #include <opencv/highgui.h ...
- Adaboost算法结合Haar-like特征
Adaboost算法结合Haar-like特征 一.Haar-like特征 目前通常使用的Haar-like特征主要包括Paul Viola和Michal Jones在人脸检测中使用的由Papageo ...
- adaboost算法
三 Adaboost 算法 AdaBoost 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器,即弱分类器,然后把这些弱分类器集合起来,构造一个更强的最终分类器.(很多博客里说的三个臭皮匠 ...
- AdaBoost 算法原理及推导
AdaBoost(Adaptive Boosting):自适应提升方法. 1.AdaBoost算法介绍 AdaBoost是Boosting方法中最优代表性的提升算法.该方法通过在每轮降低分对样例的权重 ...
随机推荐
- Spring@Autowired java.lang.NullPointerException 空指针
在使用@Autowired注解注入出现的空指针 java.lang.NullPointerException 可能存在的错误原因: 1.注解的扫描有问题 在xml配置了这个标签后,spring可以 ...
- Python作业本——第4章 列表
课后习题: 1.[]是一个空列表 2. spam.insert(3, 'hello') 错,应为:spam[2] = 'hello' 3.['d'] 'd' 4.['d'] 'd' 5.[ ...
- MYSQL之B+TREE索引原理
1.什么是索引? 索引:加速查询的数据结构. 2.索引常见数据结构 顺序查找: 最基本的查询算法-复杂度O(n),大数据量此算法效率糟糕. 二叉树查找:(binary tree search): O( ...
- CF979C Kuro and Walking Route(简单的dfs/树形dp)
题意:给出一个$n$个点,$n-1$条边的无向连通图,给出两个点$x,y$,经过$x$后的路径上就不能经过$y$,问可以走的路径$(u,v)$有多少条,($(u,v)$和$(v,u)$考虑为两条不同的 ...
- 微软发布.Net Core 3.0 RC1,最终版本定于9月23日
2019.9.17 微软 宣布推出.NET Core 3.0 Release Candidate 1.就像Preview 9一样,主要专注于为 .NET Core 3.0 发布最终版本 .现在变得非常 ...
- TabHost创建的2种方式
一.如果是自定义TabHost步骤如下 1.必须给tabHost跟标签设置一个android:id="@android:id/tabhost"> 2.必须创建TabWidge ...
- .Net基础篇_学习笔记_第三天_Convert类型转换
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- java读取Excel —— XSSFWorkbook 找不到该类
- HABSE表结构理解
也分为行列,行是索引,锁定数据,查找数据只能通过行 列:建表时必须知道列族,真实列(列簇)在插入数据时候可以指定 查找指定列,必须带列族,列族1:name
- Mysql数据处理/行转列/列转行/分割/拼接/数据复制汇总
mysql数据处理记录(使用的 Workbench) 生成随机数 逗号或分号拼接的字符串分割成多行 多行数据转化成用逗号拼接的字符串 将A表的数据添加到B表 一.生成随机数 生成18位:(19位就加颗 ...