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)

相關文章
相關標籤/搜索