目錄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)