在集成學習原理小結中,咱們講到了集成學習按照個體學習器之間是否存在依賴關係能夠分爲兩類,第一個是個體學習器之間存在強依賴關係,另外一類是個體學習器之間不存在強依賴關係。前者的表明算法就是是boosting系列算法。在boosting系列算法中, Adaboost是最著名的算法之一。Adaboost既能夠用做分類,也能夠用做迴歸。本文就對Adaboost算法作一個總結。html
在集成學習原理小結中,咱們已經講到了boosting算法系列的基本思想,以下圖:算法
從圖中能夠看出,Boosting算法的工做機制是首先從訓練集用初始權重訓練出一個弱學習器1,根據弱學習的學習偏差率表現來更新訓練樣本的權重,使得以前弱學習器1學習偏差率高的訓練樣本點的權重變高,使得這些偏差率高的點在後面的弱學習器2中獲得更多的重視。而後基於調整權重後的訓練集來訓練弱學習器2.,如此重複進行,直到弱學習器數達到事先指定的數目T,最終將這T個弱學習器經過集合策略進行整合,獲得最終的強學習器。 微信
不過有幾個具體的問題Boosting算法沒有詳細說明。網絡
1)如何計算學習偏差率e?框架
2) 如何獲得弱學習器權重係數\(\alpha\)?函數
3)如何更新樣本權重D?post
4) 使用何種結合策略?學習
只要是boosting你們族的算法,都要解決這4個問題。那麼Adaboost是怎麼解決的呢?優化
咱們這裏講解Adaboost是如何解決上一節這4個問題的。spa
假設咱們的訓練集樣本是
\[ T=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\} \]
訓練集的在第k個弱學習器的輸出權重爲
\[ D(k) = (w_{k1}, w_{k2}, ...w_{km}) ;\;\; w_{1i}=\frac{1}{m};\;\; i =1,2...m \]
首先咱們看看Adaboost的分類問題。
分類問題的偏差率很好理解和計算。因爲多元分類是二元分類的推廣,這裏假設咱們是二元分類問題,輸出爲{-1,1},則第k個弱分類器\(G_k(x)\)在訓練集上的加權偏差率爲
\[ e_k = P(G_k(x_i) \neq y_i) = \sum\limits_{i=1}^{m}w_{ki}I(G_k(x_i) \neq y_i) \]
接着咱們看弱學習器權重係數,對於二元分類問題,第k個弱分類器\(G_k(x)\)的權重係數爲
\[ \alpha_k = \frac{1}{2}log\frac{1-e_k}{e_k} \]
爲何這樣計算弱學習器權重係數?從上式能夠看出,若是分類偏差率\(e_k\)越大,則對應的弱分類器權重係數\(\alpha_k\)越小。也就是說,偏差率小的弱分類器權重係數越大。具體爲何採用這個權重係數公式,咱們在講Adaboost的損失函數優化時再講。
第三個問題,更新更新樣本權重D。假設第k個弱分類器的樣本集權重係數爲\(D(k) = (w_{k1}, w_{k2}, ...w_{km})\),則對應的第k+1個弱分類器的樣本集權重係數爲
\[ w_{k+1,i} = \frac{w_{ki}}{Z_K}exp(-\alpha_ky_iG_k(x_i)) \]
這裏\(Z_k\)是規範化因子
\[ Z_k = \sum\limits_{i=1}^{m}w_{ki}exp(-\alpha_ky_iG_k(x_i)) \]
從\(w_{k+1,i}\)計算公式能夠看出,若是第i個樣本分類錯誤,則\(y_iG_k(x_i) <; 0\),致使樣本的權重在第k+1個弱分類器中增大,若是分類正確,則權重在第k+1個弱分類器中減小.具體爲何採用樣本權重更新公式,咱們在講Adaboost的損失函數優化時再講。
最後一個問題是集合策略。Adaboost分類採用的是加權表決法,最終的強分類器爲
\[ f(x) = sign(\sum\limits_{k=1}^{K}\alpha_kG_k(x)) \]
接着咱們看看Adaboost的迴歸問題。因爲Adaboost的迴歸問題有不少變種,這裏咱們以Adaboost R2算法爲準。
咱們先看看回歸問題的偏差率的問題,對於第k個弱學習器,計算他在訓練集上的最大偏差
\[ E_k= max|y_i - G_k(x_i)|\;i=1,2...m \]
而後計算每一個樣本的相對偏差
\[ e_{ki}= \frac{|y_i - G_k(x_i)|}{E_k} \]
這裏是偏差損失爲線性時的狀況,若是咱們用平方偏差,則\(e_{ki}= \frac{(y_i - G_k(x_i))^2}{E_k^2}\),若是咱們用的是指數偏差,則\(e_{ki}= 1 - exp(\frac{-y_i + G_k(x_i))}{E_k})\)
最終獲得第k個弱學習器的 偏差率
\[ e_k = \sum\limits_{i=1}^{m}w_{ki}e_{ki} \]
咱們再來看看如何獲得弱學習器權重係數\(\alpha\)。這裏有:
\[ \alpha_k =\frac{e_k}{1-e_k} \]
對於更新更新樣本權重D,第k+1個弱學習器的樣本集權重係數爲
\[ w_{k+1,i} = \frac{w_{ki}}{Z_k}\alpha_k^{1-e_{ki}} \]
這裏\(Z_k\)是規範化因子
\[ Z_k = \sum\limits_{i=1}^{m}w_{ki}\alpha_k^{1-e_{ki}} \]
最後是結合策略,和分類問題稍有不一樣,採用的是對加權的弱學習器取權重中位數對應的弱學習器做爲強學習器的方法,最終的強迴歸器爲
\[ f(x) =G_{k^*}(x) \]
其中,\(G_{k^*}(x)\)是全部\(ln\frac{1}{\alpha_k}, k=1,2,....K\)的中位數值對應序號\(k^*\)對應的弱學習器。
剛纔上一節咱們講到了分類Adaboost的弱學習器權重係數公式和樣本權重更新公式。可是沒有解釋選擇這個公式的緣由,讓人以爲是魔法公式同樣。其實它能夠從Adaboost的損失函數推導出來。
從另外一個角度講, Adaboost是模型爲加法模型,學習算法爲前向分步學習算法,損失函數爲指數函數的分類問題。
模型爲加法模型好理解,咱們的最終的強分類器是若干個弱分類器加權平均而獲得的。
前向分步學習算法也好理解,咱們的算法是經過一輪輪的弱學習器學習,利用前一個弱學習器的結果來更新後一個弱學習器的訓練集權重。也就是說,第k-1輪的強學習器爲
\[ f_{k-1}(x) = \sum\limits_{i=1}^{k-1}\alpha_iG_{i}(x) \]
而第k輪的強學習器爲
\[ f_{k}(x) = \sum\limits_{i=1}^{k}\alpha_iG_{i}(x) \]
上兩式一比較能夠獲得
\[ f_{k}(x) = f_{k-1}(x) + \alpha_kG_k(x) \]
可見強學習器的確是經過前向分步學習算法一步步而獲得的。
Adaboost損失函數爲指數函數,即定義損失函數爲
\[ \underbrace{arg\;min\;}_{\alpha, G} \sum\limits_{i=1}^{m}exp(-y_if_{k}(x)) \]
利用前向分步學習算法的關係能夠獲得損失函數爲
\[ (\alpha_k, G_k(x)) = \underbrace{arg\;min\;}_{\alpha, G}\sum\limits_{i=1}^{m}exp[(-y_i) (f_{k-1}(x) + \alpha G(x))] \]
令\(w_{ki}^{’} = exp(-y_if_{k-1}(x))\), 它的值不依賴於\(\alpha, G\),所以與最小化無關,僅僅依賴於\(f_{k-1}(x)\),隨着每一輪迭代而改變。
將這個式子帶入損失函數,損失函數轉化爲
\[ (\alpha_k, G_k(x)) = \underbrace{arg\;min\;}_{\alpha, G}\sum\limits_{i=1}^{m}w_{ki}^{’}exp[-y_i\alpha G(x)] \]
首先,咱們求\(G_k(x)\).,能夠獲得
\[ G_k(x) = \underbrace{arg\;min\;}_{G}\sum\limits_{i=1}^{m}w_{ki}^{’}I(y_i \neq G(x_i)) \]
將\(G_k(x)\)帶入損失函數,並對\(\alpha\)求導,使其等於0,則就獲得了
\[ \alpha_k = \frac{1}{2}log\frac{1-e_k}{e_k} \]
其中,\(e_k\)即爲咱們前面的分類偏差率。
\[ e_k = \frac{\sum\limits_{i=1}^{m}w_{ki}^{’}I(y_i \neq G(x_i))}{\sum\limits_{i=1}^{m}w_{ki}^{’}} = \sum\limits_{i=1}^{m}w_{ki}I(y_i \neq G(x_i)) \]
最後看樣本權重的更新。利用\(f_{k}(x) = f_{k-1}(x) + \alpha_kG_k(x) \)和\(w_{ki}^{’} = exp(-y_if_{k-1}(x))\),便可得:
\[ w_{k+1,i}^{’} = w_{ki}^{’}exp[-y_i\alpha_kG_k(x)] \]
這樣就獲得了咱們第二節的樣本權重更新公式。
這裏咱們對AdaBoost二元分類問題算法流程作一個總結。
輸入爲樣本集\(T=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\}\),輸出爲{-1, +1},弱分類器算法, 弱分類器迭代次數K。
輸出爲最終的強分類器\(f(x)\)
1) 初始化樣本集權重爲
\[ D(1) = (w_{11}, w_{12}, ...w_{1m}) ;\;\; w_{1i}=\frac{1}{m};\;\; i =1,2...m \]
2) 對於k=1,2,...K:
a) 使用具備權重\(D_k\)的樣本集來訓練數據,獲得弱分類器\(G_k(x)\)
b)計算\(G_k(x)\)的分類偏差率
\[ e_k = P(G_k(x_i) \neq y_i) = \sum\limits_{i=1}^{m}w_{ki}I(G_k(x_i) \neq y_i) \]
c) 計算弱分類器的係數
\[ \alpha_k = \frac{1}{2}log\frac{1-e_k}{e_k} \]
d) 更新樣本集的權重分佈
\[ w_{k+1,i} = \frac{w_{ki}}{Z_K}exp(-\alpha_ky_iG_k(x_i)) \;\; i =1,2,...m \]
這裏\(Z_k\)是規範化因子
\[ Z_k = \sum\limits_{i=1}^{m}w_{ki}exp(-\alpha_ky_iG_k(x_i)) \]
3) 構建最終分類器爲:
\[ f(x) = sign(\sum\limits_{k=1}^{K}\alpha_kG_k(x)) \]
對於Adaboost多元分類算法,其實原理和二元分類相似,最主要區別在弱分類器的係數上。好比Adaboost SAMME算法,它的弱分類器的係數
\[ \alpha_k = \frac{1}{2}log\frac{1-e_k}{e_k} + log(R-1) \]
其中R爲類別數。從上式能夠看出,若是是二元分類,R=2,則上式和咱們的二元分類算法中的弱分類器的係數一致。
這裏咱們對AdaBoost迴歸問題算法流程作一個總結。AdaBoost迴歸算法變種不少,下面的算法爲Adaboost R2迴歸算法過程。
輸入爲樣本集\(T=\{(x_,y_1),(x_2,y_2), ...(x_m,y_m)\}\),,弱學習器算法, 弱學習器迭代次數K。
輸出爲最終的強學習器\(f(x)\)
1) 初始化樣本集權重爲
\[ D(1) = (w_{11}, w_{12}, ...w_{1m}) ;\;\; w_{1i}=\frac{1}{m};\;\; i =1,2...m \]
2) 對於k=1,2,...K:
a) 使用具備權重\(D_k\)的樣本集來訓練數據,獲得弱學習器\(G_k(x)\)
b) 計算訓練集上的最大偏差
\[ E_k= max|y_i - G_k(x_i)|\;i=1,2...m \]
c) 計算每一個樣本的相對偏差:
若是是線性偏差,則\(e_{ki}= \frac{|y_i - G_k(x_i)|}{E_k}\);
若是是平方偏差,則\(e_{ki}= \frac{(y_i - G_k(x_i))^2}{E_k^2}\)
若是是指數偏差,則\(e_{ki}= 1 - exp(\frac{-|y_i -G_k(x_i)|}{E_k})\)
d) 計算迴歸偏差率
\[ e_k = \sum\limits_{i=1}^{m}w_{ki}e_{ki} \]
c) 計算弱學習器的係數
\[ \alpha_k =\frac{e_k}{1-e_k} \]
d) 更新樣本集的權重分佈爲
\[ w_{k+1,i} = \frac{w_{ki}}{Z_k}\alpha_k^{1-e_{ki}} \]
這裏\(Z_k\)是規範化因子
\[ Z_k = \sum\limits_{i=1}^{m}w_{ki}\alpha_k^{1-e_{ki}} \]
3) 構建最終強學習器爲:
\[ f(x) =G_{k^*}(x) \]
其中,\(G_{k^*}(x)\)是全部\(ln\frac{1}{\alpha_k}, k=1,2,....K\)的中位數值對應序號\(k^*\)對應的弱學習器。
爲了防止Adaboost過擬合,咱們一般也會加入正則化項,這個正則化項咱們一般稱爲步長(learning rate)。定義爲\(\nu\),對於前面的弱學習器的迭代
\[ f_{k}(x) = f_{k-1}(x) + \alpha_kG_k(x) \]
若是咱們加上了正則化項,則有
\[ f_{k}(x) = f_{k-1}(x) + \nu\alpha_kG_k(x) \]
\(\nu\)的取值範圍爲$0 <; \nu \leq 1 \(。對於一樣的訓練集學習效果,較小的\)\nu$意味着咱們須要更多的弱學習器的迭代次數。一般咱們用步長和迭代最大次數一塊兒來決定算法的擬合效果。
到這裏Adaboost就寫完了,前面有一個沒有提到,就是弱學習器的類型。理論上任何學習器均可以用於Adaboost.但通常來講,使用最普遍的Adaboost弱學習器是決策樹和神經網絡。對於決策樹,Adaboost分類用了CART分類樹,而Adaboost迴歸用了CART迴歸樹。
這裏對Adaboost算法的優缺點作一個總結。
Adaboost的主要優勢有:
1)Adaboost做爲分類器時,分類精度很高
2)在Adaboost的框架下,可使用各類迴歸分類模型來構建弱學習器,很是靈活。
3)做爲簡單的二元分類器時,構造簡單,結果可理解。
4)不容易發生過擬合
Adaboost的主要缺點有:
1)對異常樣本敏感,異常樣本在迭代中可能會得到較高的權重,影響最終的強學習器的預測準確性。
(歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121)