在集成學習方法之Bagging,Boosting,Stacking篇章中,我們談論boosting框架的原理,在boosting系列算法中,AdaBoost是著名的算法之一。AdaBoost是英文"Adaptive Boosting"(自適應增強)的縮寫,由Yoav Freund和Robert Schapire在1995年提出。
今天我們就來探討下AdaBoost分類算法的原理,本篇我們先介紹AdaBoost算法;然後通過誤差分析探討AdaBoost爲什麼能提升模型的學習精度;並且從前向分步加法模型角度解釋AdaBoost;最後對AdaBoost的算法優缺點進行一個總結。
1)從boosting到AdaBoost算法
集成原理中,我們提到的boosting框架的思想是選擇同質的基分類器,讓基分類器之間按照順序進行訓練,並讓每個基分類器都嘗試去修正前面的分類。既然這樣,怎樣才能讓同質的基分類器能夠修正前面的分類?或者說怎樣才能讓同質的基分類器之間保持“互助”呢?
AdaBoost的做法是,讓前一個基分類器ft−1(x)在當前基分類器ft(x)的訓練集上的效果很差(和我們隨機瞎猜一樣),這樣ft(x)就能修正ft−1(x)的分類誤差,ft(x)和ft−1(x)之間也就產生了“互助”。
AdaBoost的具體做法是,通過提高被前一輪基分類器ft−1(x)分類錯誤的樣本的權值,降低被正確分類樣本的權值,使得上一個基分類器ft−1(x)在更新權值後的訓練集上的錯誤率ϵt−1增大到0.5。(再在更新權值後的訓練集上訓練基分類器ft(x),那ft(x)必能和ft−1(x)產生互助。)
2)AdaBoost算法
下面我們在二分類問題上介紹AdaBoost算法。假如給定訓練數據集T={(xi,yi)}i=1n,xi∈Rd,yi∈{−1,1}
樣本權值爲win,誤差率ϵi。在訓練數據集T上訓練第一個基分類器f1(x),其錯誤率爲ϵ1,ϵ1<0.5(起碼比瞎猜要好一些)
ϵ1=Z1∑nw1nδ((f1(xn)=y^n)Z1=n∑w1n
更新樣本的權值(權值爲w2n)後的訓練集爲T′,使得f1(x)在T′分類效果等同於隨機瞎猜(ϵ=0.5)。用數學語言表示即爲
Z2∑nw2nδ((f1(xn)=y^n)=0.5Z2=n∑w2n
那麼樣本權重如何更新呢?AdaBoost具體做法是,減小f1(x)分類正確的樣本的權值,權值除以一個常數d,即d1w1n;增大f1(x)分類錯誤的樣本的權值,權值乘以一個常數d,即w1nd1。用數學語言表示即爲
{w2n=w1nd1if f1(xn)=y^n)w2n=d1w1nif f1(xn)=y^n)
下面我們再回到下式中來,
Z2∑nw2nδ((f1(xn)=y^n)=0.5
其中,Z2=∑f1(xn)=y^nw1nd1+∑f1(xn)=y^nd1w1n;當f1(xn)=y^n時,w2n=w1nd1。
將上面兩式帶入得:
∑f1(xn)=y^nw1nd1+∑f1(xn)=y^nd1w1n∑f1(xn)=y^nw1nd1=0.5
f1(xn)=y^n∑d1w1n=f1(xn)=y^n∑w1nd1
又因爲ϵ1=Z1∑f1(xn)=y^nw1n⇒ϵ1Z1=f1(xn)=y^n∑w1n
1−ϵ1=Z1∑f1(xn)=y^nw1n⇒(1−ϵ1)Z1=f1(xn)=y^n∑w1n
因此,
f1(xn)=y^n∑d1w1n=f1(xn)=y^n∑w1nd1
d11f1(xn)=y^n∑w1n=d1f1(xn)=y^n∑w1n
d11(1−ϵ1)Z1=d1ϵ1Z1
d1=ϵ11−ϵ1
其中d1>1(因爲ϵ1<0.5)。
因此AdaBoost每次更新權值表達式爲:
⎩⎪⎨⎪⎧wt+1n=wtnϵt1−ϵt=wtnexp(Ln(ϵt1−ϵt))if ft(xn)=y^n)wt+1n=ϵt1−ϵtwtn=wtnexp(−Ln(ϵt1−ϵt))if ft(xn)=y^n)
令αt=Ln(ϵt1−ϵt),αt即爲基分類器ft(x)的權重係數。當ϵt=0.1時,αt=1.1,當ϵt=0.4時,αt=0.2。這表明,當基分類器分類誤差率越小時,基分類器的權重越大,在最終表決時起的作用也越大;當基分類器分類誤差率越大時,基分類器的權重越小,在最終表決時起的作用也越小。將αt帶入上式,樣本權值更新表達式變成:
⎩⎨⎧wt+1n=wtnϵt1−ϵt=wtnexp(αt)if ft(xn)=y^n)wt+1n=ϵt1−ϵtwtn=wtnexp(−αt)if ft(xn)=y^n)
爲了方便表示,將上式兩項合併成一項得,權值更新的表達式爲:
wt+1n=wtnexp(−y^nft(xn)αt)
當ft(xn)=y^n時,y^nft(xn)爲+1,當 ft(xn)=y^n時,y^nft(xn)爲-1,以上兩式爲等價變換。
以上就是AdaBoost算法如何做樣本權值更新的整個推導過程。
下面對二元分類AdaBoost算法流程進行總結:
輸入:訓練數據集T={(xi,yi)}i=1N,xi∈Rd,yi∈{−1,1}
輸出:最終的分類器H(x)
①初始化訓練數據的權值(權值相等)
w1n=1
②for t=1...T:
-
在權值爲{wt1,wt2...wtN}的訓練機上訓練基分類器ft(x)
-
計算ft(x)在訓練數據集上的分類誤差率ϵt ϵt=P(ft(xn=y^n))=n∑wtnδ(ft(xn=y^n))
-
計算ft(x)的權值係數
αt=Ln(ϵt1−ϵt)
-
for n=1,2....N:
if xn被ft(x)分類錯誤:
wt+1n=wtnϵt1−ϵt=wtnexp(αt)
else xn 被ft(x)分類正確:
wt+1n=ϵt1−ϵtwtn=wtnexp(−αt)
③構建基分類器線性組合
g(x)=T∑αtft(x)
得到最終的分類器H(x)
H(x)=sign(T∑αtft(x))
3)AdaBoost的訓練誤差分析
AdaBoost最基本的性質是它能在學習的過程中不斷減少訓練誤差,且訓練誤差以指數速率下降,且無限逼近於0。具體的數學表達式爲:
ErrorRate=N1∑δ(y^ng(x)<0)≤N1n∑exp(−y^ng(x))=N1ZT+1
N1ZT+1=t=1∏T2ϵt(1−ϵt)=t=1∏T(1−4γt2)≤exp(−2t=1∑Tγt2)
其中,γt=21−ϵt。
下面我們就AdaBoost做二元分類的情況,對這一結論分步進行證明。證明過程會涉及較多的數學公式的推導,對證明不感興趣的小夥伴可以直接跳到第5部分AdaBoost算法總結。
首先我們證明:
ErrorRate=N1∑δ(y^ng(x)<0)≤N1exp(−y^ng(x))
從上一部分內容可知,訓練數據集T={(xi,yi)}i=1n,xi∈Rd,yi∈{−1,1},最終的分類器H(x),αt的表達式爲
H(x)=sign(t=1∑Tαtft(x))αt=Ln(ϵt1−ϵt)
分類器H(x)的分類誤差率爲ErrorRate等於分類錯誤的樣本所佔總樣本的比例,用數學語言表達即爲,
ErrorRate=N1∑δ(H(xn)=(y^)n)
其中,H(xn)=(y^)n表示模型的預測值和真實值異號,因此,
ErrorRate=N1∑δ(y^nt=1∑Tαtft(x)<0)
令g(x)=∑t=1Tαtft(x),因此,
ErrorRate=N1∑δ(y^ng(x)<0)
下面我們開始證明:
ErrorRate=N1∑δ(y^ng(x)<0)≤N1exp(−y^ng(x))
其中δ(y^ng(x)<0)爲01損失函數,exp(−y^ng(x))爲指數損失函數。畫出函數圖像很容易發現上式不等式成立:![在這裏插入圖片描述]()
下面我們證明
ErrorRate≤N1n∑exp(−y^ng(x))=N1ZT+1
已知g(x)=∑t=1Tαtft(x)(上面我們定義的等式)。且Zt+1爲基分類器ft+1(x)所有訓練樣本的權重之和,用數學語言表示,
Zt+1=∑nwT+1n
=∑nwTnexp(−y^nft(xn)αt)(權值更新公式)
=∑n∏t=1Texp(−y^nft(xn)αt)
=∑nexp(−y^n∑t=1Tft(xn)αt)(連乘符號∏,放到指數exp中變成求和∑)
=∑nexp(−y^ng(xn))
因此,ErrorRate≤N1n∑exp(−y^ng(x))=N1ZT+1
已知αt=Ln(ϵt1−ϵt),下面我們證明
ErrorRate≤N1ZT+1=t=1∏T2ϵt(1−ϵt)
Zt+1爲基分類器ft+1(x)所有訓練樣本的權重之和,它是由上一輪權值Zt更新而來的,被分類錯誤的樣本權值增大,被分類正確的樣本權值減小。
且Z1=N,因此,
ZT+1=Ztϵtexp(αt)+Zt(1−ϵt)exp(−αt)
=Ztϵtϵt1−ϵt+Zt(1−ϵt)1−ϵtϵt
=2Ztϵt(1−ϵt)
=N∏t=1T2ϵt(1−ϵt)
因此,
ErrorRate≤N1ZT+1=t=1∏T2ϵt(1−ϵt)
由於ϵt<0.5,因此2ϵt(1−ϵt)≤1,所以AdaBoost的分類誤差率是不斷的再減小的。
下面我們證明
t=1∏T2ϵt(1−ϵt)=t=1∏T(1−4γt2)≤exp(−2t=1∑Tγt2)
∏t=1T2ϵt(1−ϵt)
=∏t=1T2(21−(21−ϵt))(21+21−ϵt)
令γt=21−ϵt,γt>0得,
∏t=1T2ϵt(1−ϵt)
=∏t=1T2(21−(21−ϵt))(21+21−ϵt)
=∏t=1T241−γt2
=∏t=1T1−4γt2
最後我們證明,
t=1∏T(1−4γt2)≤exp(−2t=1∑Tγt2)
首先我們構造一個函數f(x)=e−x+x−1,由於f′′(x)=e−x>0,因此f(x)爲凸函數,且minf(x)=f(0)=0,所以f(x)≥0。下面我們進入正式證明:
f(x)=e−x+x−1≥0
⇒e−x≥1−x,令x=4γ2,得
⇒e−4γ2≥1−4γ2
⇒e−2γ2≥1−4γ2
因此對於t=1,2...T,都有⎩⎪⎪⎪⎨⎪⎪⎪⎧e−2γ12≥1−4γ12e−2γ22≥1−4γ22...e−2γt2≥1−4γt2
將上式連乘得:
⇒t=1∏Texp(−2γt2)≥t=1∏T1−4γt2
⇒t=1∏T1−4γt2≤t=1∏Texp(−2γt2)
⇒t=1∏T1−4γt2≤exp(−2t=1∑Tγt2)
因此,證明得到下式成立:
ErrorRate=N1∑δ(y^ng(x)<0)≤exp(−2t=1∑Tγt2)
上不等式表明,AdaBoost的訓練誤差是以指數速率下降且無限逼近於0。(γ>0,−2∑t=1Tγt2<0,小於0的數求指數小於1,小於1的數無限連乘,將無限逼近與0)
4)前向分步加法模型解釋AdaBoost
AdaBoost的另外一種解釋,認爲AdaBoost是加法模型、損失函數爲指數函數、學習算法爲前向分步算法的分類學習算法。
加法模型比較好理解,最終的分類器是有若干個基分類器加權平均得到。即
H(x)=T∑αtft(x)
其中,ft(x)爲基分類器,αt爲基分類器的權值。
前向分步學習算法,即利用前一個基分類器的結果更新後一個基分類器的訓練權重。
假定第t−1輪後分類器爲:
gt−1(x)=t=1∑t−1αtft(x)
而第t輪後分類器爲爲:
gt(x)=t=1∑tαtft(x)
有上兩式可以得:
gt(x)=gt−1(x)+αtft(x)
因此,最終的分類器是通過前向學習算法得到的。
AdaBoost的損失函數爲,
α,fargminn∑exp(−y^ngt(x))
利用前向分步學習算法可以得到損失函數爲:
(αt,ft(x))=α,fargminn∑exp(−y^n(gt−1(x)+αtft(x))
令wt′n=exp(−y^ngt−1(x)),它的值不依賴αt,ft(x),因此與最小化無關,僅僅依賴於gt−1(x),隨着每一輪迭代而改變。將上式子代入損失函數,得
(αt,ft(x))=α,fargminn∑wt′nexp(−y^αtft(x))
我們先求ft∗(x),對於任意的αt>0,使得上式最小的ft(x)由下式得到:
ft∗(x)=fargminwt′nδ(y^n=ft(xn))
其中,wt′n=exp(−y^ngt−1(x))。
基分類器ft∗(x)即爲AdaBoost算法的基分類器ft(x),因爲它是讓第t輪加權訓練數據分類誤差率最小的基分類器。將ft∗(x)帶入損失函數,對αt求導,使其等於0,得
αt=21Lnϵt1−ϵt
其中ϵt爲分類誤差率:
ϵt=∑nwt′n∑nwt′nδ(y^n=ft(xn))=n∑wtnδ(y^n=ft(xn))
這與我們在第二部分討論的一致(見下式)。上式的wtn爲權值率,下式中的wtn爲權值,除以Z1等價於權值率。
ϵ1=Z1∑nw1nδ((f1(xn)=y^n)Z1=n∑w1n
αt=Ln(ϵt1−ϵt)
最後我們來看下每一輪權值的更新,利用以下兩式
gt(x)=gt−1(x)+αtft(x)
wt′n=exp(−y^ngt−1(x))
可得到權值更新公式爲:
wt+1n=wtnexp(−y^nft(xn)αt)
這與我們在第一部分討論的權值更新公式也一致。因此,AdaBoost也可以從加法模型、指數損失函數、前向分步學習算法角度來解釋。
需要注意的是,是先有了AdaBoost算法之後,人們才發現,通過加法模型、指數損失函數、前向分步學習算法的方式可以解釋AdaBoost算法的過程。
5)AdaBoost算法總結
下面我們對AdaBoost算法的優缺點進行總結。
優點:
- 既可以處理分類任務,又可以處理迴歸任務;
- 不易過擬合;
- AdaBoost訓練的分類器,分類精度高;
- 支持各種分類器做基分類器,如邏輯迴歸,SVM;
缺點:
- 對異常值敏感,異常值的權重在模型訓練的過程中可能會越來越大,最終影響整個模型的性能;
終於寫完了,這篇寫的有點長,涉及的數學推導比較多,我也儘量往詳細寫了,大家需要一些耐心慢慢看。如果看到數學推導就頭暈的小夥伴,可以只看第二部分AdaBoost算法原理部分。本篇涉及的數學公式較多,我也多檢查了兩遍,儘量減少數學上的表述錯誤。如果小夥伴發現還有錯誤,還望指正!
下篇我們探討Scikit learn中的AdaBoost算法庫類,並進行實踐。
(歡迎大家在評論區探討交流,也歡迎大家轉載,轉載請註明出處!)
上篇:Scikit-learn隨機森林算法庫總結與調參實踐
下篇:Scikit-learn AdaBoost算法庫總結與實踐