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


1. 回顧boosting算法的基本原理

    在集成學習原理小結中,我們已經講到了boosting算法系列的基本思想,如下圖:

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

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

    1)如何計算學習誤差率e?

    2) 如何得到弱學習器權重系數αα?

    3)如何更新樣本權重D?

    4) 使用何種結合策略?

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

2. Adaboost算法的基本思路

    我們這里講解Adaboost是如何解決上一節這4個問題的。

    假設我們的訓練集樣本是

T={(x,y1),(x2,y2),...(xm,ym)}T={(x,y1),(x2,y2),...(xm,ym)}

 

    訓練集的在第k個弱學習器的輸出權重為

D(k)=(wk1,wk2,...wkm);w1i=1m;i=1,2...mD(k)=(wk1,wk2,...wkm);w1i=1m;i=1,2...m

 

 

    首先我們看看Adaboost的分類問題。

    分類問題的誤差率很好理解和計算。由於多元分類是二元分類的推廣,這里假設我們是二元分類問題,輸出為{-1,1},則第k個弱分類器Gk(x)Gk(x)在訓練集上的加權誤差率為

ek=P(Gk(xi)yi)=i=1mwkiI(Gk(xi)yi)ek=P(Gk(xi)≠yi)=∑i=1mwkiI(Gk(xi)≠yi)

 

    接着我們看弱學習器權重系數,對於二元分類問題,第k個弱分類器Gk(x)Gk(x)的權重系數為

αk=12log1ekekαk=12log1−ekek

 

    為什么這樣計算弱學習器權重系數?從上式可以看出,如果分類誤差率ekek越大,則對應的弱分類器權重系數αkαk越小。也就是說,誤差率小的弱分類器權重系數越大。具體為什么采用這個權重系數公式,我們在講Adaboost的損失函數優化時再講。

    第三個問題,更新更新樣本權重D。假設第k個弱分類器的樣本集權重系數為D(k)=(wk1,wk2,...wkm)D(k)=(wk1,wk2,...wkm),則對應的第k+1個弱分類器的樣本集權重系數為

wk+1,i=wkiZKexp(αkyiGk(xi))wk+1,i=wkiZKexp(−αkyiGk(xi))

 

    這里ZkZk是規范化因子

Zk=i=1mwkiexp(αkyiGk(xi))Zk=∑i=1mwkiexp(−αkyiGk(xi))

 

    從wk+1,iwk+1,i計算公式可以看出,如果第i個樣本分類錯誤,則yiGk(xi)<0yiGk(xi)<0,導致樣本的權重在第k+1個弱分類器中增大,如果分類正確,則權重在第k+1個弱分類器中減少.具體為什么采用樣本權重更新公式,我們在講Adaboost的損失函數優化時再講。

    最后一個問題是集合策略。Adaboost分類采用的是加權平均法,最終的強分類器為

f(x)=sign(k=1KαkGk(x))f(x)=sign(∑k=1KαkGk(x))

 

    

    接着我們看看Adaboost的回歸問題。由於Adaboost的回歸問題有很多變種,這里我們以Adaboost R2算法為准。

    我們先看看回歸問題的誤差率的問題,對於第k個弱學習器,計算他在訓練集上的最大誤差

Ek=max|yiGk(xi)|i=1,2...mEk=max|yi−Gk(xi)|i=1,2...m

 

    然后計算每個樣本的相對誤差

eki=|yiGk(xi)|Ekeki=|yi−Gk(xi)|Ek

 

    這里是誤差損失為線性時的情況,如果我們用平方誤差,則eki=(yiGk(xi))2E2keki=(yi−Gk(xi))2Ek2,如果我們用的是指數誤差,則eki=1expyi+Gk(xi))Ekeki=1−exp(−yi+Gk(xi))Ek)

    最終得到第k個弱學習器的 誤差率

ek=i=1mwkiekiek=∑i=1mwkieki

 

    我們再來看看如何得到弱學習器權重系數αα。這里有:

αk=ek1ekαk=ek1−ek

 

    對於更新更新樣本權重D,第k+1個弱學習器的樣本集權重系數為

wk+1,i=wkiZkα1ekikwk+1,i=wkiZkαk1−eki

 

    這里ZkZk是規范化因子

Zk=i=1mwkiα1ekikZk=∑i=1mwkiαk1−eki

 

    最后是結合策略,和分類問題一樣,采用的也是加權平均法,最終的強回歸器為

f(x)=k=1K(ln1αk)Gk(x)f(x)=∑k=1K(ln1αk)Gk(x)

 

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

    剛才上一節我們講到了分類Adaboost的弱學習器權重系數公式和樣本權重更新公式。但是沒有解釋選擇這個公式的原因,讓人覺得是魔法公式一樣。其實它可以從Adaboost的損失函數推導出來。

    從另一個角度講, Adaboost是模型為加法模型,學習算法為前向分步學習算法,損失函數為指數函數的分類問題。

    模型為加法模型好理解,我們的最終的強分類器是若干個弱分類器加權平均而得到的。

    前向分步學習算法也好理解,我們的算法是通過一輪輪的弱學習器學習,利用前一個弱學習器的結果來更新后一個弱學習器的訓練集權重。也就是說,第k-1輪的強學習器為

fk1(x)=i=1k1αiGi(x)fk−1(x)=∑i=1k−1αiGi(x)

 

    而第k輪的強學習器為

fk(x)=i=1kαiGi(x)fk(x)=∑i=1kαiGi(x)

 

    上兩式一比較可以得到

fk(x)=fk1(x)+αkGk(x)fk(x)=fk−1(x)+αkGk(x)

 

    可見強學習器的確是通過前向分步學習算法一步步而得到的。

    Adaboost損失函數為指數函數,即定義損失函數為

argminα,Gi=1mexp(yifk(x))argmin⏟α,G∑i=1mexp(−yifk(x))

 

    利用前向分步學習算法的關系可以得到損失函數為

(αk,Gk(x))=argminα,Gi=1mexp[(yi)(fk1(x)+αG(x))](αk,Gk(x))=argmin⏟α,G∑i=1mexp[(−yi)(fk−1(x)+αG(x))]

 

    令wki=exp(yifk1(x))wki′=exp(−yifk−1(x)), 它的值不依賴於α,Gα,G,因此與最小化無關,僅僅依賴於fk1(x)fk−1(x),隨着每一輪迭代而改變。

    將這個式子帶入損失函數,損失函數轉化為

(αk,Gk(x))=argminα,Gi=1mwkiexp[yiαG(x)](αk,Gk(x))=argmin⏟α,G∑i=1mwki′exp[−yiαG(x)]

    

 

    首先,我們求Gk(x)Gk(x).,可以得到

Gk(x)=argminGi=1mwkiI(yiG(xi))Gk(x)=argmin⏟G∑i=1mwki′I(yi≠G(xi))

 

    將Gk(x)Gk(x)帶入損失函數,並對αα求導,使其等於0,則就得到了

αk=12log1ekekαk=12log1−ekek

 

    其中,ekek即為我們前面的分類誤差率。

ek=i=1mwkiI(yiG(xi))i=1mwki=i=1mwkiI(yiG(xi))ek=∑i=1mwki′I(yi≠G(xi))∑i=1mwki′=∑i=1mwkiI(yi≠G(xi))

 

    最后看樣本權重的更新。利用fk(x)=fk1(x)+αkGk(x)fk(x)=fk−1(x)+αkGk(x)和wki=exp(yifk1(x))wki′=exp(−yifk−1(x)),即可得:

wk+1,i=wkiexp[yiαkGk(x)]wk+1,i′=wki′exp[−yiαkGk(x)]

 

    這樣就得到了我們第二節的樣本權重更新公式。

4. AdaBoost二元分類問題算法流程

    這里我們對AdaBoost二元分類問題算法流程做一個總結。

    輸入為樣本集T={(x,y1),(x2,y2),...(xm,ym)}T={(x,y1),(x2,y2),...(xm,ym)},輸出為{-1, +1},弱分類器算法, 弱分類器迭代次數K。

    輸出為最終的強分類器f(x)f(x)

    1) 初始化樣本集權重為

D(1)=(w11,w12,...w1m);w1i=1m;i=1,2...mD(1)=(w11,w12,...w1m);w1i=1m;i=1,2...m

 

    2) 對於k=1,2,...K:

      a) 使用具有權重DkDk的樣本集來訓練數據,得到弱分類器Gk(x)Gk(x)

      b)計算Gk(x)Gk(x)的分類誤差率

ek=P(Gk(xi)yi)=i=1mwkiI(Gk(xi)yi)ek=P(Gk(xi)≠yi)=∑i=1mwkiI(Gk(xi)≠yi)

 

      c) 計算弱分類器的系數

αk=12log1ekekαk=12log1−ekek

 

      d) 更新樣本集的權重分布

wk+1,i=wkiZKexp(αkyiGk(xi))i=1,2,...mwk+1,i=wkiZKexp(−αkyiGk(xi))i=1,2,...m

 

        這里ZkZk是規范化因子

Zk=i=1mwkiexp(αkyiGk(xi))Zk=∑i=1mwkiexp(−αkyiGk(xi))

 

    3) 構建最終分類器為:

f(x)=sign(k=1KαkGk(x))f(x)=sign(∑k=1KαkGk(x))

    

 

 

    對於Adaboost多元分類算法,其實原理和二元分類類似,最主要區別在弱分類器的系數上。比如Adaboost SAMME算法,它的弱分類器的系數

αk=12log1ekek+log(R1)αk=12log1−ekek+log(R−1)

 

    其中R為類別數。從上式可以看出,如果是二元分類,R=2,則上式和我們的二元分類算法中的弱分類器的系數一致。

5. Adaboost回歸問題的算法流程

    這里我們對AdaBoost回歸問題算法流程做一個總結。AdaBoost回歸算法變種很多,下面的算法為Adaboost R2回歸算法過程。

    輸入為樣本集T={(x,y1),(x2,y2),...(xm,ym)}T={(x,y1),(x2,y2),...(xm,ym)},,弱學習器算法, 弱學習器迭代次數K。

    輸出為最終的強學習器f(x)f(x)

    1) 初始化樣本集權重為

D(1)=(w11,w12,...w1m);w1i=1m;i=1,2...mD(1)=(w11,w12,...w1m);w1i=1m;i=1,2...m

 

    2) 對於k=1,2,...K:

      a) 使用具有權重DkDk的樣本集來訓練數據,得到弱學習器Gk(x)Gk(x)

      b) 計算訓練集上的最大誤差

Ek=max|yiGk(xi)|i=1,2...mEk=max|yi−Gk(xi)|i=1,2...m

 

      c) 計算每個樣本的相對誤差:

        如果是線性誤差,則eki=|yiGk(xi)|Ekeki=|yi−Gk(xi)|Ek;

        如果是平方誤差,則eki=(yiGk(xi))2E2keki=(yi−Gk(xi))2Ek2

        如果是指數誤差,則eki=1expyi+Gk(xi))Ekeki=1−exp(−yi+Gk(xi))Ek)        

      d) 計算回歸誤差率

ek=i=1mwkiekiek=∑i=1mwkieki

 

      c) 計算弱學習器的系數

αk=ek1ekαk=ek1−ek

 

      d) 更新樣本集的權重分布為

wk+1,i=wkiZkα1ekikwk+1,i=wkiZkαk1−eki

 

        這里ZkZk是規范化因子

Zk=i=1mwkiα1ekikZk=∑i=1mwkiαk1−eki

 

    3) 構建最終強學習器為:

f(x)=k=1K(ln1αk)Gk(x)f(x)=∑k=1K(ln1αk)Gk(x)

    

 

6. Adaboost算法的正則化

    為了防止Adaboost過擬合,我們通常也會加入正則化項,這個正則化項我們通常稱為步長(learning rate)。定義為νν,對於前面的弱學習器的迭代

fk(x)=fk1(x)+αkGk(x)fk(x)=fk−1(x)+αkGk(x)

 

    如果我們加上了正則化項,則有

fk(x)=fk1(x)+ναkGk(x)fk(x)=fk−1(x)+ναkGk(x)

 

    νν的取值范圍為0<ν10<ν≤1。對於同樣的訓練集學習效果,較小的νν意味着我們需要更多的弱學習器的迭代次數。通常我們用步長和迭代最大次數一起來決定算法的擬合效果。

7. Adaboost小結

    到這里Adaboost就寫完了,前面有一個沒有提到,就是弱學習器的類型。理論上任何學習器都可以用於Adaboost.但一般來說,使用最廣泛的Adaboost弱學習器是決策樹和神經網絡。對於決策樹,Adaboost分類用了CART分類樹,而Adaboost回歸用了CART回歸樹。

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

    Adaboost的主要優點有:

    1)Adaboost作為分類器時,分類精度很高

    2)在Adaboost的框架下,可以使用各種回歸分類模型來構建弱學習器,非常靈活。

    3)作為簡單的二元分類器時,構造簡單,結果可理解。

    4)不容易發生過擬合

    Adaboost的主要缺點有:

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM