04-02 AdaBoost算法

更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:http://www.javashuo.com/article/p-vozphyqp-cm.htmlpython

AdaBoost算法

集成学习中弱学习器之间有强依赖关系的,称之为Boosting系列算法,而AdaBoost则是Boosting系列算法中最著名的算法之一。算法

AdaBoost算法强大之处在于既能够解决分类问题,又能够解决回归问题。网络

1、AdaBoost算法学习目标

  1. AdaBoost算法目标函数优化
  2. 强分类器和强回归器流程
  3. AdaBoost算法优缺点

2、AdaBoost算法详解

2.1 Boosting算法回顾

Boosting算法的流程是:首先训练处一个弱学习器,根据弱学习器的偏差率更新训练样本的权重,而后基于调整权重后的训练集训练第二个弱学习器,直到弱学习器达到事先指定的数目T,中止算法。数据结构

对于Boosting算法的流程,能够看到若是咱们解决如下4个问题,既能够获得完整的Boosting算法机器学习

  1. 弱学习器的偏差率
  2. 训练样本的权重\(w\)更新方法
  3. 更新样本权重的方法
  4. 结合策略

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算法的训练数据权重的更新公式。

3、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 强分类器流程

  1. 初始化训练数据的权重
    \[ D_1 = (w_{11},\cdots,w_{1i},\cdots,w_{1m}),\quad{w_{1i}={\frac{1}{m}},\quad{i=1,2,\cdots,m}} \]
  2. 生成弱分类器
    \[ G_k(x),\quad{k=1,2,\cdots,K} \]
  3. 计算弱分类器\(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} \]
  4. 计算\(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\),则该多元分类的权重系数将变成二元分类的权重系数。

  1. 更新训练数据的权重
    \[ \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\)个弱分类器中变小。
  2. 结合策略
    \[ \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 强回归器流程

  1. 初始化训练数据的权重
    \[ D_1 = (w_{11},\cdots,w_{1i},\cdots,w_{1m}),\quad{w_{1i}={\frac{1}{m}},\quad{i=1,2,\cdots,m}} \]
  2. 生成弱分类器
    \[ G_k(x),\quad{k=1,2,\cdots,K} \]
  3. 计算弱回归器\(G_k(x)\)在训练集上的最大偏差
    \[ E_k = \max|y_i-G_k(x_i)|,\quad{i=1,2,\cdots,m} \]
  4. 计算每一个样本之间的相对偏差
    \[ e_{ki}={\frac{|y_i-G_k(x_i)|}{E_k}} \]
    此处也可使用均方偏差,即\(e_{ki}={\frac{(y_i-G_k(x_i))^2}{E_k^2}}\)
  5. 计算第\(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} \]
  6. 更新训练数据的权重
    \[ 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}} \]
  7. 结合策略
    \[ G(x) = G_{k^*}(x) \]
    其中\(G_{k^*}(x)\)是全部\(\ln{\frac{1}{\alpha_k}},\quad{k=1,2,\cdots,K}\)的中位数对应序号\(k^*\)对应的弱回归器

4、AdaBoost算法优缺点

4.1 优势

  1. 不容易过拟合
  2. 分类精准度高
  3. 因为弱分类器既能够是分类器又能够是回归器,使用灵活

4.2 缺点

  1. 因为是对训练数据加权,有可能会赋予训练数据中的异常值较高的权重,影响模型的准确度

5、小结

AdaBoost算法并无使用较深的数学知识,而是推导过程涉及较为复杂的逻辑。若是看完一遍还不是很理解,须要本身多多揣摩。

AdaBoost算法目前是一个比较流行的Boosting算法,他的弱学习器既能够是回归器,又能够是分类器,这也是AdaBoost较为强大的一点。虽然理论上任何学习器均可以做为AdaBoost的弱学习器,可是AdaBoost算法用的较多的弱学习器通常仍是决策树和神经网络。

相信有了第一个集成算法AdaBoost的基础,对于接下来的第二个用的较为普遍的Boosting系列算法你也能很快熟悉他,即梯度提高树(gradient boosting decision tree,GBDT)

相关文章
相关标签/搜索