目录html
更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython
集成学习中弱学习器之间有强依赖关系的,称之为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)