1. 程式人生 > >集成學習值Adaboost算法原理小結(轉載)

集成學習值Adaboost算法原理小結(轉載)

依賴關系 www. 重復 pos 詳細說明 輸出 減少 info 的確

集成學習原理小結中,我們講到了集成學習按照個體學習器之間是否存在依賴關系可以分為兩類:

  • 第一個是個體學習器之間存在強依賴關系;
  • 另一類是個體學習器之間不存在強依賴關系。

前者的代表算法就是提升(boosting)系列算法。在boosting系列算法中, Adaboost是最著名的算法之一。Adaboost既可以用作分類,也可以用作回歸。本文就對Adaboost算法做一個總結。

一 回顧boosting算法的基本原理

在前面一節,我們已經講到了boosting算法系列的基本思想,如下圖:

技術分享圖片

從圖中可以看出,Boosting算法的工作機制是首先從訓練集用初始權重D(1)訓練出一個弱學習器1,根據弱學習的學習誤差率表現來更新訓練樣本的權重,使得之前弱學習器1學習誤差率高的訓練樣本點的權重變高,使得這些誤差率高的點在後面的弱學習器2中得到更多的重視。然後基於調整權重後的訓練集來訓練弱學習器2.,如此重復進行,直到弱學習器數達到事先指定的數目T,最終將這T個弱學習器通過集合策略進行整合,得到最終的強學習器。

不過有幾個具體的問題Boosting算法沒有詳細說明。

  • 如何計算分類誤差率e?
  • 如何得到弱學習器權重系數$\alpha$?
  • 如何更新訓練數據的樣本權重D?
  • 使用何種結合策略?

只要是boosting大家族的算法,都要解決這4個問題。那麽Adaboost是怎麽解決的呢?

二 Adaboost算法的基本思想

我們這裏講解Adaboost是如何解決上面4個問題的。

假設我們的訓練集樣本是:$$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$$

註意:在初始化第一個弱分類器輸出權重時,我們假設訓練集樣本具有均勻的權值分布,即每個訓練樣本在第一個弱分類器的學習中作用相同,這一假設保證可以在訓練集樣本上學習第一個弱分類器$G_1(x)$。

首先我們看看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) = \sum\limits_{k=1}^{K}(ln\frac{1}{\alpha_k})g(x)$$

其中,$g(x)$是所有$\alpha_kG_k(x), k=1,2,....K$的中位數。 

三 AdaBoost分類問題的損失函數優化

上面我們講到了分類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二元分類問題算法流程

這裏我們對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回歸算法變種很多,下面的算法為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) = \sum\limits_{k=1}^{K}(ln\frac{1}{\alpha_k})g(x)$$

其中,$g(x)$是所有$\alpha_kG_k(x), k=1,2,....K$的中位數。 

六 Adaboost算法的正則化

為了防止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弱學習器是決策樹和神經網絡。對於決策樹,Adaboost分類用了CART分類樹,而Adaboost回歸用了CART回歸樹。

這裏對Adaboost算法的優缺點做一個總結。

Adaboost的主要優點有:

  • Adaboost作為分類器時,分類精度很高
  • 在Adaboost的框架下,可以使用各種回歸分類模型來構建弱學習器,非常靈活。
  • 作為簡單的二元分類器時,構造簡單,結果可理解。
  • 不容易發生過擬合

Adaboost的主要缺點有:

  • 對異常樣本敏感,異常樣本在叠代中可能會獲得較高的權重,影響最終的強學習器的預測準確性。

參考文章:

集成學習之Adaboost算法原理小結

集成學習值Adaboost算法原理小結(轉載)