集成学习(三):adaboost算法推导
- adaboost概念(Adaptive Boosting)
- adaboost算法分析与推导
- 前向分步算法与adaboost
- adaboost算法总结
- 参考与推荐
adaboost概念(Adaptive Boosting)
AdaBoost的中文叫做自适应增强,由Yoav Freund和Robert Schapire在1995年提出。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。adaboost算法是模型为加法模型、损失函数为指数函数、学习算法为前向分布算法时的二类分类学习方法。具体算法如下(摘自统计学习方法):
初始化训练数据的权值分布
D1=(w11,...,w1i,...,w1N),w1i=1N,i=1,2,...,ND_1 = (w_{11},...,w_{1i},...,w_{1N}),\quad w_{1i}=\frac{1}{N}, \quad i=1,2,...,ND1=(w11,...,w1i,...,w1N),w1i=N1,i=1,2,...,N对m=1,2,…,M
(a):使用具有权值分布DMD_{M}DM的数据集进行学习,得到基本分类器Gm(x):X→{−1,+1}G_m(x):\mathcal{X} \to \{-1,+1\}Gm(x):X→{−1,+1}
(b):计算Gm(x)G_m(x)Gm(x)在训练数据集上的分类误差率:
em=P(Gm(xi)≠yi)=∑i=1NwmiI(Gm(xi)≠yi)=∑Gm(xi)≠yiwwie_m = P(G_m(x_i)\ne y_i)=\sum_{i=1}^Nw_{mi}I(G_m(x_i)\ne y_i) = \sum_{G_m(x_i)\ne y_i}w_{wi}em=P(Gm(xi)̸=yi)=i=1∑NwmiI(Gm(xi)̸=yi)=Gm(xi)̸=yi∑wwi(c ):计算Gm(x)G_m(x)Gm(x)的系数
αm=12ln1−emem\alpha_m = \frac{1}{2}ln\frac{1-e_m}{e_m}αm=21lnem1−em(d):更新数据集的权值分布
Dm+1=(wm+1,1,...,wm+1,i,...,wm+1,N)D_{m+1}=(w_{m+1,1},...,w_{m+1,i},...,w_{m+1,N})Dm+1=(wm+1,1,...,wm+1,i,...,wm+1,N)
wm+1,i=wmiZmexp(−αmyiGm(xi)),i=1,2,...,Nw_{m+1,i} = \frac{w_{mi}}{Z_m}exp(-\alpha_my_iG_m(x_i)),\quad i=1,2,...,Nwm+1,i=Zmwmiexp(−αmyiGm(xi)),i=1,2,...,N
其中ZMZ_{M}ZM是规范化因子,它使Dm+1D_{m+1}Dm+1成为一个概率分布。
Zm=∑i=1Nwmiexp(−αmyiGm(xi))Z_m = \sum_{i=1}^Nw_{mi}exp(-\alpha_my_iG_m(x_i))Zm=i=1∑Nwmiexp(−αmyiGm(xi))
- 构建基本分类器的线性组合
f(x)=∑m=1MαmGm(x)f(x) = \sum_{m=1}^M\alpha_mG_m(x)f(x)=m=1∑MαmGm(x)
得到最终分类器为:
G(x)=sign(f(x))=sign(∑m=1MαmGm(x))G(x) = sign(f(x))=sign(\sum_{m=1}^M\alpha_mG_m(x))G(x)=sign(f(x))=sign(m=1∑MαmGm(x))
另外AdaBoost算法最终分类器的训练误差界为:
1N∑i=1NI(G(xi)≠yi)⩽1N∑iexp(−yif(xi))=∏mZm\frac{1}{N}\sum_{i=1}^N I(G(x_i)\ne y_i) \leqslant \frac{1}{N}\sum_{i} exp(-y_if(x_i)) = \prod_{m}Z_mN1i=1∑NI(G(xi)̸=yi)⩽N1i∑exp(−yif(xi))=m∏Zm
而二类分类问题adaboost的训练误差界为:
∏m=1MZm=∏m=1M[2em(1−em)]=∏m=1M(1−4γm2)⩽exp(−2∑m=1Mγm2),rm=12−em\prod_{m=1}^MZ_m = \prod_{m=1}^M [2\sqrt{e_m(1-e_m)}] = \prod_{m=1}^M\sqrt{(1-4\gamma_m^2)}\leqslant exp(-2\sum_{m=1}^M\gamma_m^2),r_{m}=\frac{1}{2}-e_{m}m=1∏MZm=m=1∏M[2em(1−em)]=m=1∏M(1−4γm2)⩽exp(−2m=1∑Mγm2),rm=21−em
adaboost算法分析与推导
针对第一步,首先初始化训练样本的权值,总共有n个样本,那么就可以得到n个权值,记做wnw_{n}wn,因为是第一次,所以加上标记1,为w1nw_{1n}w1n,另外我们并不知道权值分布情况,可以认为每个权值都是相同的,即权值w1n=1Nw_{1n}=\frac{1}{N}w1n=N1
针对第二步,进行M轮学习,得到基本分类器Gm(x)G_m(x)Gm(x)以及分类器预测错误的时候此时分类误差的概率eme_mem ,而后面的那个符号“I”,我们可以认为是python里的boolean值的标记,相等为True,记做1;不相等为False,记做0,那么这里就表示为分类错误的情况下的权值之和。
然后计算出αm\alpha_mαm,它表示表示 Gm(x)G_{m}(x)Gm(x)在最终分类器中的重要性,并且作为一个二分类算法,分类正确的概率永远比错误要高,否则就没有算下去的必要了。所以em≤12e_{m}\leq\frac{1}{2}em≤21,1−emem>1\frac{1-e_m}{e_m}>1em1−em>1,则αm≥0\alpha_{m}\geq0αm≥0,αm\alpha_{m}αm随着em{e_m}em的减小而增大,即误差率越小的基本分类器在最终分类器中的作用越大。
那么有了系数,我们便可以对数据集进行规范化或者说归一化,而这里的权值分布公式我们可以调整为:
wm+1,i={wmiZme−αm,Gm(xi)=yiwmiZmeαm,Gm(xi)≠yiw_{m+1,i}=\left\{ \begin{array}{c}\frac{w_{mi}}{Z_{m}}e^{-\alpha_{m}},G_{m}(x_{i})=y_{i}\\\frac{w_{mi}}{Z_{m}}e^{\alpha_{m}},G_{m}(x_{i})\neq y_{i}\end{array}\right.wm+1,i={Zmwmie−αm,Gm(xi)=yiZmwmieαm,Gm(xi)̸=yi
其中ZmZ_{m}Zm就是我们的归一化因子,那么由此可知,当出现分类错误的时候,结果是大于1的,而被正确分类样本的权值却得以缩小,因此误分类样本在下一轮学习中起更大作用,这个在下面我们会给出证明。
首先我们证明关于ZmZ_{m}Zm,它的计算是通过错误样本数和正确样本数的加权和,推导过程如下(由于csdn好像不支持连等符号,所以只能通过latex或者axmath先运行出公式截图进来):
![](/assets/blank.gif)
推出了ZmZ_{m}Zm,下一步就是系数ama_{m}am,这里有一种简单的做法通过调整过后的权值公式,将分类错误的条件看成eme_{m}em,分类正确看成1−em1-e_{m}1−em,直接两者做除,即可得到:
e2a=12em1−em⇒am=12ln1−ememe^{2a}=\frac{1}{2}\frac{e_{m}}{1-e_{m}}\Rightarrow a_{m}=\frac{1}{2}ln\frac{1-e_{m}}{e_{m}}e2a=211−emem⇒am=21lnem1−em
![](/assets/blank.gif)
做出的图,横轴为分类器错误率,纵轴为分类器系数;
虽然上面的做法求是求出来了,但忽略了很多细节,这里我推荐一篇博文的做法,链接在后面,它相当于将已知条件全部带入然后展开了,如下:
针对第三步,我们通过线性组合得到了它的最终分类器,加上sign表示有正例与负例。
另外还有adaboost的误差上界,这个东西我没有去推导的,它最终得到的结果也是证明了adaboost存在边界,我们可以在每一轮选取适当的GmG_{m}Gm使得ZmZ_{m}Zm最小,从而使得训练误差下降最快,迭代次数最少。而下界不需要考虑,正如算法的名字,叫Adaptive Boosting,表示它可以适应弱分类器各自的训练误差率。
还有关于习题,这里我推荐上面那张图的作者的博客,习题描述得很好,大道至简,如果李航140-142面的题目没有看懂,可以看下面这篇:
Adaboost算法原理分析和实例+代码(简明易懂)
前向分步算法与adaboost
在概念中提到了一句话,也是李航书中的一句话:即可以认为adaboost算法是模型为加法模型,损失函数为指数函数,学习算法为前向分步算法时的二类分类学习方法。
加法模型我们知道是什么了,可以看我上一节对于提升算法的推导,有些地方殊途同归,而对于前向分步算法我们这里直接给出重要的两步:
- 极小化损失函数
(βm,γm)=argminβ,γ∑i=1NL(yi,fm−1(xi)+βb(xi;γ))(\beta_m,\gamma_m) = \arg\min_{\beta,\gamma} \sum_{i=1}^N L(y_i,f_{m-1}(x_i)+\beta b(x_i;\gamma))(βm,γm)=argβ,γmini=1∑NL(yi,fm−1(xi)+βb(xi;γ)) - 更新
fm(x)=fm−1(x)+βm⎵系数⋅b(x;γm)⎵基函数和参数f_m(x) = f_{m-1}(x) +\underbrace{\beta_m}_{\text{系数}}\cdot\underbrace{{b(x;\gamma_m)}}_{\text{基函数和参数}}fm(x)=fm−1(x)+系数βm⋅基函数和参数b(x;γm)
adaboost推导:
AdaBoost算法是前向分步加法算法的特例,模型是由基本分类器组成的加法模型,这里我们将βb(xi;γ)\beta b(x_i;\gamma)βb(xi;γ) = Gm(x)G_{m}(x)Gm(x),
f(x)=∑m=1MαmGm(x)f(x) = \sum_{m=1}^M\alpha_mG_m(x)f(x)=m=1∑MαmGm(x)
损失函数是指数函数:
L(y,f(x))=exp(−yf(x))L(y,f(x)) = exp(-y f(x))L(y,f(x))=exp(−yf(x))
因此,根据前向分步算法的步骤,我们需要求解的极小化损失函数变为了:
(αm,Gm)=argminα,G∑i=1Nexp[−yi(fm−1(xi)+αG(xi))](\alpha_m,G_m) = \arg\min_{\alpha,G} \sum_{i=1}^N exp[-y_i(f_{m-1}(x_i)+\alpha G_(x_i))](αm,Gm)=argα,Gmini=1∑Nexp[−yi(fm−1(xi)+αG(xi))]
令wi(m)=exp(−yifm−1(xi))w_i^{(m)} = exp(-y_i f_{m-1}(x_i))wi(m)=exp(−yifm−1(xi)),因为它没有依赖关系,可以将其提出,进行第一步化简,得:
(αm,Gm)=argminα,G∑i=1Nwi(m)exp(−βyiG(xi))(\alpha_m,G_m) = \arg\min_{\alpha,G} \sum_{i=1}^N w_i^{(m)} exp(-\beta y_i G(x_i))(αm,Gm)=argα,Gmini=1∑Nwi(m)exp(−βyiG(xi))
然后我们发现yi∈{−1,1}y_i \in \lbrace-1,1\rbraceyi∈{−1,1},那么就和上面推导ZmZ_{m}Zm一样,将其拆成两个权值相加,就是最后一步没有那么快得出来:
![](/assets/blank.gif)
而很显然,如果要使上式的最后一个式子最小,e−αe^{-\alpha }e−α都是常数,那么可以得到:
Gm=argminG∑i=1NwmiI(yi≠G(xi))G_m = \arg\min_G \sum_{i=1}^N w_{mi} I(y_i \ne G(x_i))Gm=argGmini=1∑NwmiI(yi̸=G(xi))
那么最终我们需要求得它最小。所以对GmG_{m}Gm求导:
∂L∂α=eα∑i=1NwmiI(yi≠G(xi))+e−α∑i=1NwmiI(yi≠G(xi))−e−α∑i=1Nwmi\frac {\partial_L} {\partial{\alpha}} = e^{\alpha} \sum_{i=1}^N w_{mi} I(y_i \ne G(x_i)) + e^{-\alpha} \sum_{i=1}^N w_{mi} I(y_i \ne G(x_i)) - e^{-\alpha} \sum_{i=1}^N w_{mi}∂α∂L=eαi=1∑NwmiI(yi̸=G(xi))+e−αi=1∑NwmiI(yi̸=G(xi))−e−αi=1∑Nwmi
然后另其为0,得到:
eα∑i=1NwmiI(yi≠G(xi))=[∑i=1Nwmi−∑i=1NwmiI(yi≠G(xi))]e−αe^{\alpha} \sum_{i=1}^N w_{mi} I(y_i \ne G(x_i)) = [\sum_{i=1}^N w_{mi} - \sum_{i=1}^N w_{mi} I(y_i \ne G(x_i))] e^{-\alpha}eαi=1∑NwmiI(yi̸=G(xi))=[i=1∑Nwmi−i=1∑NwmiI(yi̸=G(xi))]e−α
然后两边取对数ln,得到:
lneα=12ln∑i=1Nwmi−∑i=1NwmiI(yi≠G(xi))∑i=1NwmiI(yi≠G(xi))ln e^{\alpha} = \frac {1} {2} ln\frac {\sum_{i=1}^N w_{mi} - \sum_{i=1}^N w_{mi} I(y_i \ne G(x_i))} {\sum_{i=1}^N w_{mi} I(y_i \ne G(x_i))}lneα=21ln∑i=1NwmiI(yi̸=G(xi))∑i=1Nwmi−∑i=1NwmiI(yi̸=G(xi))
令em=∑i=1NwmiI(Gm(xi)≠yi)e_m =\sum_{i=1}^Nw_{mi}I(G_m(x_i)\ne y_i)em=∑i=1NwmiI(Gm(xi)̸=yi),则上式可以写为:
am=12ln1−emema_{m}=\frac{1}{2}ln\frac{1-e_{m}}{e_{m}}am=21lnem1−em
与前面的推导完全一致。
adaboost算法总结
关于adaboost,其实总结也很简单,根据我上面写的概念只有三步,所以搞懂一些推导过程还是有必要的。写这篇博文的中途,就在昨天,我去看了一下周志华老师的boost 25年,很多东西深受启发,关于adaboost的过拟合问题,我没想过这其中竟然有如此多有趣的事情,当然也是周的语言风趣幽默以及他对adaboost的贡献才更加让人对于adaboost思想的升华,这里强烈推荐观看。
另外插一些题外话,本来还想再通过程序以及相应的参数说明算法,但后来想想还是算了,编程技术不到家,后期也准备学习《机器学习实战》,然后再开一个系列回来温习推导。下面的参考与推荐里面也有我找到的一个很好的代码练习博文。
参考与推荐
[1]. 《统计学习方法 李航著》第8章;
[2]. wiki. https://en.wikipedia.org/wiki/AdaBoost
[3]. 周志华的boosting 25年视频:Boost 25年
[4]. Adaboost 算法的原理与推导
[5]. Adaboost算法原理分析和实例+代码(简明易懂)
[6]. 邹博的ppt,暂时没地址
[7]. 李航《统计学习方法》第八章——用Python+Cpp实现AdaBoost算法(MNIST数据集)
[8] 从前向分步算法推导出AdaBoost
集成学习(三):adaboost算法推导相关推荐
- 04 集成学习 - Boosting - AdaBoost算法构建
03 集成学习 - Boosting - AdaBoost算法原理 十.AdaBoost算法构建 上一章最后说明了每个基模型的权值α是如何求得的,于是我就可以对模型进行更新操作了. 构建过程一 1.假 ...
- EL之AdaBoost:集成学习之AdaBoost算法的简介、应用、经典案例之详细攻略
EL之AdaBoost:集成学习之AdaBoost算法的简介.应用.经典案例之详细攻略 目录 AdaBoost算法的简介 1.理解AdaBoost算法 1.1.从前向逐步递增角度来看理解AdaBoos ...
- 集成学习之Adaboost
集成学习之Adaboost 时间:2022/6/13 文章目录 集成学习之Adaboost 1.集成学习 1.1学习器 1.2集成学习算法 1.3学习器的选择 2.AdaBoost 2.1Boosti ...
- 集成学习、Bagging算法、Bagging+Pasting、随机森林、极端随机树集成(Extra-trees)、特征重要度、包外评估
集成学习.Bagging算法.Bagging+Pasting.随机森林.极端随机树集成(Extra-trees).特征重要度.包外评估 目录
- 监督学习 | 集成学习 之AdaBoost、梯度提升及Slearn实现
文章目录 Boosting 1. AdaBoost 1.1 AdaBoost 原理 1.2 Python 实现 1.3 Sklearn 实现 2. 梯度提升 2.1 梯度提升回归树(GBRT) 2.1 ...
- 机器学习的几种方法(knn,逻辑回归,SVM,决策树,随机森林,极限随机树,集成学习,Adaboost,GBDT)
一.判别模式与生成模型基础知识 举例:要确定一个瓜是好瓜还是坏瓜,用判别模型的方法是从历史数据中学习到模型,然后通过提取这个瓜的特征来预测出这只瓜是好瓜的概率,是坏瓜的概率. 举例:利用生成模型是根 ...
- 机器学习集成学习进阶LightGBM算法和案例
目录 1 lightGBM 1.1 lightGBM演进过程 1.2 AdaBoost算法 1.3 GBDT算法以及优缺点 1.4 启发 2 什么是lightGBM 3 lightGBM原理 3.1 ...
- 基于 Java 机器学习自学笔记 (第63-65天:集成学习之AdaBoost)
注意:本篇为50天后的Java自学笔记扩充,内容不再是基础数据结构内容而是机器学习中的各种经典算法.这部分博客更侧重于笔记以方便自己的理解,自我知识的输出明显减少,若有错误欢迎指正! 目录 一.关于集 ...
- 使用集成学习提升机器学习算法性能
译者注:这篇文章是对 PythonWeekly 推荐的一篇讲集成模型的文章的翻译,原文为 Ensemble Learning to Improve Machine Learning Results,由 ...
最新文章
- 公司--超级链接跳转和表单提交,删除的表单提交和删除失败的提示信息
- 牛客题霸 [数组中出现次数超过一半的数字] C++题解/答案
- JDK 7和JDK 8中大行读取速度较慢的原因
- CMakeLists.txt使用boost库
- 运行与windows命令(cmd)的说明与示例
- 递归打印目录层次(java版)
- Spring Cloud Data Flow 2.0.1 GA 发布
- 解析新浪微博表情包的一套js代码
- 【数字通信】Matlab实现16QAM调制与解调,判决,误码率计算
- C++借助Eigen库实现矩阵开方(开根号)运算
- win10输入法变成繁体字的快捷键
- python判断图片是不是火车票_12306验证码图像识别程序源码-Python识别12306验证码 - PS下...
- markdown 设置目录跳转的简单方法
- October CMS - 快速入门 1 安装 1
- 【ELMAN回归预测】基于matlab天牛须算法优化ELMAN回归预测【含Matlab源码 1375期】
- 厦大C语言上机 1394 抛硬币
- 基于matlab的BCH编译码算法原理介绍与仿真分析
- 十二 iOS之 折叠图片
- Storm Metric
- DevStream 概览——开源 DevOps 工具链管理工具
热门文章
- 你好!基于Arduino控制的串口屏
- Lua语言在线代码运行编译工具推荐
- 优动漫PAINT中手绘稿扫描件的杂点清理方法
- 【Linux】centos桌面版关闭锁屏、屏幕常亮
- 在服务器上备份文件的命令行,使用 Stsadm 命令行工具备份服务器场 (Search Server 2008)...
- 【线性代数】正交投影
- 一位IT从业人员的心路历程 (转并修版)
- 苹果IOS免签分发 绿标免签封装 ios不显示顶部网址跳转设置
- android读取运动数据权限_各种手机使用金管家平安Run健康行运动步数上传不计步读取时怎么解决?...
- 【报告分享】2021美伊白皮书-阿里妈妈CBE(附下载)