模式识别笔记4-集成学习之AdaBoost
目前集成学习(Ensemble Learning) 分为两类:
- 个体学习器间存在强依赖关系、必须串行化生成的序列化方法:Boosting
- 个体学习器间不存在强依赖关系,可同时生成的并行化方法:Bagging 和 随机森林
这里先来讲下代表Boosting家族的AdaBoost。
Boosting 是一族可以将弱学习器提升为强学习器的算法。
算法机制:
从初始训练集训练一个基学习器(Base Learner) ,根据基学习器的表现对训练样本分布进行调整,对做错的样本赋予更大的权重,基于调整后的样本分布训练下一个基学习器,直到基学习器的数目达到指定的值 \(T\),,同时进行学习器权重调整。
1. AdaBoost分类算法流程
假设我们有:
训练集 \(D=\{(x_1, y_1), (x_2, y_2), \cdots, (x_m, y_m)\}\)
训练轮数(学习器数目): \(T\)
基学习器 \(h_t(x), t=\{1,2,3,\cdots,T\}\) ,对应于学习算法
基学习器权重 \(\alpha_t\)
样本分布 \(\mathcal D\), 训练集在第 \(t\) 个分类器上的样本权重为:
\[
\notag
\mathcal{D}_t= (w_{t1},w_{t2},\cdots, w_{tm})
\]
针对以上条件,AdaBoost的算法流程如下:
\[
\begin{align}
&\mathcal D_1 =1/m\\
&\text{for }t = 1,2, \cdots,T \text{ do}\notag \\
&\ \ \ \ e_t = P(h_t(x_i)\neq y_i) = \sum_{i=1}^mw_{ti}I(h_t(x_i)\neq y_i)\\
&\ \ \ \ \alpha_t = \frac{1}{2}\ln(\frac{1-e_t}{e_t})\\
&\ \ \ \ \text{update distribution }D_{t+1}: \notag \\
&\ \ \ \ \ \ \ \ w_{t+1,i} = \frac{w_{t,i}}{Z_t}\times\exp(-\alpha_ty_ih_t(x_i)) \text{ for } i=1,2,\cdots,m\\
&\text{end for} \notag
\end{align}
\]
根据这个算法,我们一步步讲AdaBoost的流程。
(1) 初始化权重
对于每个样本,我们令其的初始化权重均为 \(\frac{1}{m}\) 。
对于指定的基学习器数目 \(T\),我们知道Boosting 是串行化训练,每一个基学习器都是基于上一个已训练的基学习器继续训练得到的,所以接下来要做 \(T\) 个循环
(2) 获得集合分类误差
以二分类 \(\{+1,-1\}\)为例(多分类是二分类的推广),第 \(t\) 个基学习器在训练集上的加权误差即如公式(2)所示。
(3) 基学习器获得权重系数
由公式(3)可以得到当前基学习器的权重系数。
由公式可以知道,误差率越高,则当前基学习器的权重系数越小。至于为什么使用这个系数公式,我们放到Adaboost的损失函数优化的时候再讲。
(4) 更新样本权重
单独把公式(4)拿出来讲:
\[
\begin{align}
w_{t+1,i} = \frac{w_{t,i}}{Z_t}\times\exp(-\alpha_ty_ih_t(x_i))
\end{align}
\]
其中 \(Z_t\) 是归一化因子:
\[
\begin{align}
Z_t = \sum_{i=1}^mw_{t,i}\times \exp(-\alpha_ty_ih_t(x_i))
\end{align}
\]
可以看到,如果第 \(i\) 个样本分类错误,则 有:
\[
\begin{align}
y_ih_t(x_i)<0 & \Rightarrow \exp(-\alpha_i y_ih_t(x_i))>1\\
&\Rightarrow w_{t+1,i}>w_{t,i}
\end{align}
\]
则错误分类的样本会在下一个基学习器的训练中,在数据中占有更高的比重。具体为什么用这个权重更新公式,还是放到损失函数优化的时候讲。
(5) 最终的分类策略
最终的强分类器采用了加权平均:
\[
\begin{align}
H(x)=\text{sign}(\sum_{t=1}^T\alpha_th_t(x))
\end{align}
\]
2. AdaBoost损失函数
AdaBoost使用指数损失函数:
\[
\begin{align}
\ell _{\exp}(H|\mathcal D)=\sum_{i=1}^m\exp (-y_iH_T(x))
\end{align}
\]
通过最小化这个损失函数,我们可以推导出基学习器的权重系数更新策略和样本权重更新策略。至于为什么最小化指数函数误差就可以最小化分类误差,将在最后推导。
基学习器权重更新策略推导
我们知道,\(t\) 轮训练获得的基学习器是由上一个轮的学习器所得,即有:
\[
\begin{align}
H_t(x)=H_{t-1}(x)+\alpha_th_t(x)
\end{align}
\]
最小化 \(t\) 轮学习后得到的强分类器损失:
\[
\begin{align}
(\alpha_t, h_t(x) )=\arg\min\limits_{\alpha, h}\sum_{i=1}^m\exp(-y_i(H_{t-1}(x)+\alpha_th_t(x)))
\end{align}
\]
我们令 \(w_{ti}’=\exp(-y_iH_{t-1}(x))\),显然,它的值不依赖于 $\alpha_t $ 和 \(h_t(x)\), 仅仅依赖于 \(H_{t-1}(x)\), 随着迭代改变。
带回式子(12),得
\[
\begin{align}
(\alpha_t, h_t(x) )=\arg\min\limits_{\alpha, h}\sum_{i=1}^mw_{ti}'\exp(-y_i\alpha_th_t(x))
\end{align}
\]
为了极小化这个损失函数,我们需要极小化第 \(t\) 个分类器误差。即:
\[
\begin{align}
h_t(x)=\arg\min \limits_{h}\sum_{i=1}^mw_{ti}'I(y_i\neq h(x_i))
\end{align}
\]
将(14)带入损失函数:
\[
\begin{align}
\notag \sum_{i=1}^mw_{ti}'\exp(-y_i\alpha_th_t(x))&=\sum_{y_i=h_t(x_i)}w_{ti}'e^{-\alpha}+\sum_{y_i\neq h_t(x_i)}w_{ti}'e^\alpha\\
&=\sum_{i=1}^mw_{ti}'e^{-\alpha}-\sum_{y_i\neq h_t(x_i)}w_{ti}'e^{-\alpha}+\sum_{y_i\neq h_t(x_i)}w_{ti}'e^\alpha\\
\notag &=(e^\alpha-e^{-\alpha})\sum_{y_i\neq h_t(x_i)}w_{ti}'+e^{-\alpha}\sum_{i=1}^m w_{ti}'
\end{align}
\]
对于(15)求偏导,令其为0,得:
\[
\begin{align}
(e^\alpha+e^{-\alpha})\sum_{y_i\neq h_t(x_i)}w_{ti}'-e^{-\alpha}\sum_{i=1}^m w_{ti}'=0
\end{align}
\]
在基学习器的迭代中,每轮的分类误差为:
\[
\begin{align}
e_t = \sum_i^m w_{ti}I(y_i\neq h_t(x_i))=\sum_{y_i\neq h_t(x_i)}w_{ij}
\end{align}
\]
注意到 :
\[
\begin{align}
e_t = \frac{ \sum_i^m w_{ti}I(y_i\neq h_t(x_i))}{\sum_{i=1}^m w_{ti}'}
\end{align}
\]
则,式(16)变为:
\[
\begin{align}
(e^{\alpha_t}+e^{-\alpha_t})e_t - e^{-\alpha_t}=0
\end{align}
\]
解得:
\[
\begin{align}
\alpha_t = \frac{1}{2}\ln \left( \frac{1-e_t}{e_t}\right)
\end{align}
\]
样本权重更新策略推导
根据上一节自定义的 \(w_{ti}'\),我们知道它与 权重参数只差一个归一化因子 \(Z_t\)。有:
\[
\begin{align}
w_{t+1,i}'&=\exp (-y_iH_t(x))\\
&=\exp(-y_i(H_{t-1}(x)+\alpha_th_t(x)))\\
&=\exp(-y_iH_{t-1}(x)·\exp(-y_i\alpha_th_t(x))\\
&=w_{t,i}'·\exp(-y_i\alpha_th_t(x))
\end{align}
\]
最小化指数函数误差=最小化分类误差?
最后讲下为什么最小化指数函数误差=最小化分类误差。
回顾一下指数函数误差。
\[
\begin{align}
\ell _{\exp}(H|\mathcal D)=\sum_{i=1}^m\exp (-y_iH_T(x))
\end{align}
\]
为了最小化误差,我们对 \(H(x)\)求偏导:
\[
\nabla H(x)=e^{H(x)}P(y=-1|x)-e^{-H(x)}P(y=+1|x)
\]
令 \(\nabla H(x)=0\), 解得:
\[
\begin{align}
H(x)&=\frac{1}{2}\ln\frac{P(y=+1|x)}{P(y=-1|x)}
\end{align}
\]
则最终强分类器:
\[
\begin{align}
\text{sign}(H(x))&=\text{sign}\left(\frac{1}{2}\ln\frac{P(y=+1|x)}{P(y=-1|x)} \right)\\
&=\mathop{\text{arg max}} \limits_{y\in\{+1,-1\}}P(y|x)
\end{align}
\]
这意味着最终强分类器达到了贝叶斯最优错误率。换言之,若指数函数最小化,则分类错误率也最小化。
参考资料
- 集成学习之Adaboost算法原理小结
- 《机器学习》.周志华
模式识别笔记4-集成学习之AdaBoost的更多相关文章
- 集成学习值Adaboost算法原理和代码小结(转载)
在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类: 第一个是个体学习器之间存在强依赖关系: 另一类是个体学习器之间不存在强依赖关系. 前者的代表算法就是提升(bo ...
- 集成学习之Adaboost算法原理小结
在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,另一类是个体学习器之间不存在强依赖关系.前者的代表算法就是是boostin ...
- 集成学习之AdaBoost
AdaBoost 当做出重要决定时,大家可能会考虑吸取多个专家而不只是一个人的意见,机器学习也是如此,这就是集成学习的基本思想.使用集成方法时有多种形式:可以是不同算法的集成,也可以是同一算法在不同设 ...
- 集成学习之Adaboost算法原理
在boosting系列算法中,Adaboost是最著名的算法之一.Adaboost既可以用作分类,也可以用作回归. 1. boosting算法基本原理 集成学习原理中,boosting系列算法的思想:
- 谈谈模型融合之一 —— 集成学习与 AdaBoost
前言 前面的文章中介绍了决策树以及其它一些算法,但是,会发现,有时候使用使用这些算法并不能达到特别好的效果.于是乎就有了集成学习(Ensemble Learning),通过构建多个学习器一起结合来完成 ...
- 机器学习回顾篇(13):集成学习之AdaBoost
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- 【笔记】集成学习入门之soft voting classifier和hard voting classifier
集成学习入门之soft voting classifier和hard voting classifier 集成学习 通过构建并结合多个学习器来完成学习任务,一般是先产生一组"个体学习器&qu ...
- 集成学习算法——adaboost
adaboost是boosting类集成学习方法中的一种算法,全称是adaptive boost,表示其是一种具有自适应性的算法,这个自适应性体现在何处,下面来详细说明. 1.adaboost算法原理 ...
- 机器学习—集成学习(Adaboost)
一.原理部分: 二.sklearn实现: from sklearn.ensemble import AdaBoostClassifier from sklearn.datasets import lo ...
随机推荐
- 自动化运维工具sshd,expect,pssh,rsync详解
ssh secure shell,安全的远程登录:openssh和dropbear都是它的开源实现,ssh协议有v1和v2俩个版本,现在使用的都是v2版,v1已经不安全了:ssh基于DH算法做密钥交换 ...
- Day1 《机器学习》第一章学习笔记
<机器学习>这本书算是很好的一本了解机器学习知识的一本入门书籍吧,是南京大学周志华老师所著的鸿篇大作,很早就听闻周老师大名了,算是国内机器学习领域少数的大牛了吧,刚好研究生做这个方向相关的 ...
- GMT与Etc/GMT地区信息的时区转换
GMT 地区信息的时区 在将来的版本中可能不再支持以下左面一列中的地区信息的时区.可能从 /usr/share/lib/zoneinfo 删除这些文件.左列中的地区信息的时区用右列中对等的时区来替换. ...
- map用法
描述: map()会根据提供的参数对指定序列做映射. 语法: map(function,iterable) function:函数以参数列表中的每一个元素调用function函数,返回包含每次func ...
- Linux运行firefox出错
虚拟机自带的firefox版本太旧了,于是在官网上下载了最新的安装包,运行后提示: $ firefox XPCOMGlueLoad error for file /home/parallels/fir ...
- MySQL 开发实践 8 问,你能 hold 住几个?
最近研发的项目对DB依赖比较重,梳理了这段时间使用MySQL遇到的8个比较具有代表性的问题,答案也比较偏自己的开发实践,没有DBA专业和深入,有出入的请使劲拍砖!- MySQL读写性能是多少,有哪些性 ...
- Django 项目搭建(ubuntu系统)
1 环境搭建 sudo apt-get install python3-pip 安装pip3 sudo pip3 install virtualenv 安装虚拟环境,这里展示virtualenv vi ...
- CMake入门实战
本文用来记录基本的Cmake用法,以一个实例,讲解如何通过cmake构建一个一个基本的工程,文件的目录如下: 说明: bin文件夹下的debug和release分别存放编译输出的文件和相关依赖的动态库 ...
- linux命令----查看磁盘空间
今天用“web发布平台”发布测试的服务,两个节点中发现有一个节点没有发布成功,压测TPS始终上不去,排查后发现只有一个节点在打日志,另一个节点的服务进程都没有在运行,由此断定应该是没有发布成功,有点坑 ...
- 数据库分片(Database Sharding)详解
本文由云+社区发表 作者:腾讯云数据库 Introduction 导言 任何看到显著增长的应用程序或网站,最终都需要进行扩展,以适应流量的增加.以确保数据安全性和完整性的方式进行扩展,对于数据驱动的应 ...