目录
更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/
集成学习中弱学习器之间有强依赖关系的,称之为Boosting系列算法,而AdaBoost则是Boosting系列算法中最著名的算法之一。
AdaBoost算法强大之处在于既可以解决分类问题,又可以解决回归问题。
Boosting算法的流程是:首先训练处一个弱学习器,根据弱学习器的误差率更新训练样本的权重,然后基于调整权重后的训练集训练第二个弱学习器,直到弱学习器达到事先指定的数目T,停止算法。
对于Boosting算法的流程,可以看到如果我们解决以下4个问题,既可以得到完整的Boosting算法
上面讲到了Boosting算法需要解决的4个问题,因为AdaBoost算法隶属于Boosting算法,那么AdaBoost算法也需要解决这4个问题,其实也可以说成只要是Boosting系列的算法,都需要解决这4个问题。
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 SAMME算法如何计算弱分类器的系数;对于回归问题,由于AdaBoost用来解决回归问题的变种有很多,本文只对AdaBoost R2算法做一个介绍。
\(m\)个样本\(n\)个特征的训练数据集\(T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}\)。
针对二分类问题,\(y_i\in{Y=\{1,-1\}}\)。
最终强学习器\(G(x)\)。
多分类问题使用的是AdaBoost SAMME算法,其中\(R\)为类别数,如果\(R=2\),则该多元分类的权重系数将变成二元分类的权重系数。
AdaBoost算法并没有使用较深的数学知识,而是推导过程涉及较为复杂的逻辑。如果看完一遍还不是很理解,需要自己多多揣摩。
AdaBoost算法目前是一个比较流行的Boosting算法,他的弱学习器既可以是回归器,又可以是分类器,这也是AdaBoost较为强大的一点。虽然理论上任何学习器都可以作为AdaBoost的弱学习器,但是AdaBoost算法用的较多的弱学习器一般还是决策树和神经网络。
相信有了第一个集成算法AdaBoost的基础,对于接下来的第二个用的较为广泛的Boosting系列算法你也能很快熟悉他,即梯度提升树(gradient boosting decision tree,GBDT)
原文:https://www.cnblogs.com/nickchen121/p/11686792.html