Boosting之Adaboost原理
1 Boosting框架
Boosting可以看成多個不同的基分類器的線性加權和的形式,那麼自然需要知道每個基分類器及其對應的權重,具體的算法邏輯見下圖。
![Picture1](http://static.javashuo.com/static/loading.gif)
如上圖所示,在boosting算法中每一個基分類器都依賴於前面已經生成的基分類器,所以Boosting是一種迭代的算法。根據基分類器迭代方式和權重的不同,Boosting可以分爲Adaboost、GBDT、XGBoost三種方式。本文就Adaboost做原理部分的介紹,主要側重於直觀上的理解,比如權重計算的合理性等等。
Boosting算法需要解決下面兩個問題:
1. 樣本權重或概率分佈
D
的計算
2. 基分類器權重
α
的計算
2 Adaboost算法邏輯
以二分類爲例,介紹Adaboost算法
2.1 符號標記
- 訓練集樣本:
T={(x1,y1),(x2,y2),...,(xn,yn)}
- 第
m
個分類器or第
m
次迭代:
Gm
- 迭代次數or基分類器個數:
M
- 第
m
次迭代第i個樣本的權值,即抽樣概率:
wmi
- 第
m
次迭代樣本的權值分佈:
Dm
,即爲
wm1,wm2,...,wmn
,且
∑i=1nwmi=1
- 第
m
個分類器的權重:
αm
- 最終的分類器:
G(x)
2.2 算法流程
輸入:訓練數據集
T={(x1,y1),(x2,y2),...,(xn,yn)}
,弱學習算法;
輸出:最終分類器
G(x)
1. 初始化訓練樣本的權值分佈
Dm=w11,w12,...,w1n
,且
w1i=1n
即第一次迭代時,所有樣本的權值相同
2. 對
m=1,2,...,M
即每一輪的迭代
(a)使用具有權值分佈
Dm
的訓練數據集學習,得到基本分類器
Gm(x):X→{−1,+1}
樣本權重怎麼具體影響基分類器,稍後再提。
(b)計算
Gm(x)
在訓練集上的分類誤差率
em=P(Gm(xi)≠yi)=∑i=1nwmiI(Gm(xi)≠yi)
這個誤差率相當於對錯誤樣本的加權求和,符合我們的直覺。
(c)計算
Gm(x)
的係數,即基分類器的權重
αm=12log(1−emem)
(d)更新訓練樣本的權值分佈
Dm+1=(wm+1,1,wm+1,2,...,wm+1,n)
wm+1,i=wmiZmexp(−αmyiGm(xi))
其中
Zm
是規範化因子,使得更新後的權值的和爲1
Zm=∑i=1nwmiexp(−αmyiGm(xi))
(b)(c)(d)三個公式稍後給出直觀上面的解釋
3. 構建基本分類器的線性組合
f(x)=∑m=1MαmGm(x)
G(x)=sign(f(x))=sign(∑m=1MαmGm(x))
(1)樣本權重更新的在分類器中的應用
之前提到每一次迭代都要更新樣本權重,那麼樣本權重怎麼影響基分類器呢?有兩種方式:
1. 通過修改基本分類器源碼,對於樹模型修改信息增益或者基尼係數的公式引入權值,這裏有點像代價敏感學習
2. 對訓練樣本進行bootstrao抽樣,抽樣概率等於樣本權值
上述解釋來自知乎高票答主蕭瑟的回答
在Sklearn中是通過resample實現的,源碼[見此]1010行(https://github.com/scikit-learn/scikit-learn/blob/a24c8b46/sklearn/ensemble/weight_boosting.py#L297)
(2)樣本權重更新的計算邏輯
只看
wm+1,i=wmiZmexp(−αmyiGm(xi))
,如果第
i
個樣本,在第
m
次的迭代中判斷錯誤,那麼
wmiZmexp(αm)
,即該樣本的權重會增大;反之,在第
m
次的迭代中判斷正確,那麼
wmiZmexp(−αm)
,即該樣本的權重會減小。
基分類器誤差率
em
越小,該分類器
Gm
的投票權重越大。在實際操作中,如果誤差率
em>0.5
,迭代會從等權重重新開始。
具體流程如下(符號有些許不同)
![Picture2](http://static.javashuo.com/static/loading.gif)
3 Adaboost算法的解釋
都說Boosting更關注偏差,前面Adaboost的流程只能從直觀上講,怎麼從損失函數的角度思考這一問題呢?
Adaboost算法可以看成加法模型,損失函數爲指數函數、學習算法爲前向分佈算法。下面圍繞這三個方面談一談。
3.1 加法模型
給出加法模型的形式定義:
f(x)=∑m=1Mβmb(x;γm)
其中,
b(x;γm)
是基函數,
γm
爲基函數的參數,
βm
是基函數的係數
顯然Adaboost模型是一個加法模型,基函數—基分類器,基函數的參數—基分類器的參數,基函數的係數—基分類器的權重
3.2 損失函數
在給定訓練樣本和損失函數
L(y,f(x))
的條件下,學習加法模型
f(x)
的需要解決的問題變爲損失函數極小化問題:
minβm,γm∑i=1nL(yi,f(xi))
求解最優化問題需要明確兩點:
1. 損失函數怎麼定義
在Adaboost算法中,可以把損失函數理解爲指數損失函數。後面再談
2. 如何求解
上面的優化問題比較複雜,一般採用前向分步算法,該算法的邏輯爲:從前向後每一步只學習一個基函數及其係數,逐步優化目標函數
3.3 前向分步算法
輸入:訓練樣本
T={(x1,y1),(x2,y2),...,(xn,yn)}
;損失函數
L(y,f(x))
;基函數集
{b(x;γ)}
輸出:加法模型
f(x)
(1)初始化
f0(x)=0
(2)對
m=1,2,...,M
(a)極小化損失函數
(βm,γm)=argminβ,γ∑i=1nL(yi,fm−1(xi)+βb(x;γ))
得到參數
βm,γm
(b)更新
fm(x)=fm−1(x)+βmb(x;γm)
(3)得到加法模型
f(x)=fM(x)=∑m=1Mβmb(x;γm)
這樣,前向分步算法將同時求解從
m=1
到
M
所有參數
βm,γm
的優化問題簡化爲逐次求解各個
βm,γm
的優化問題。
從(a)步可以看出,每一輪迭代的新分類器,都是在找一個使得損失函數最低的分類器。所以,Adaboost算法的關注點是逐步降低偏差。那麼Adaboost的邏輯和前向分步算法有什麼關係呢?
3.4 前向分步算法和Adaboost
前向分步算法和Adaboost是否是一致的,那麼關注點顯然是每一次迭代時,Adaboost中的表達式
αm,Gm
,是不是損失函數最小化的參數
βm,γm
。
下面證明當損失函數爲指數損失函數,基函數爲基分類器時,Adaboost是加法模型的前向分步算法的特例。
加法模型
Adaboost最終的分類器
f(x)=∑m=1MαmGm(x)
形式和加法模型一致,那麼需證迭代方式與前向分步算法一致
損失函數
損失函數採用指數損失函數:
L(y,f(x))=exp[−yf(x)]
損失函數定義有多種,在邏輯上要能講的通,對於二分類問題而言,預測準確,且
|f(x)|
越大(參照SVM的幾何間隔,說明預測的更好),指數部分爲負,所以
L
越小。反之,預測錯誤,且
|f(x)|
越大(預測錯誤更加離譜),指數部分爲正,所以
L
越大。至此,可以從直觀上體現指數損失函數的合理性。
如果基分類器or基函數返回的結果是
{−1,+1}
,那麼損失函數爲:
L={ef(x)≠y1ef(x)=y(1)
Why指數損失函數
1. 方便計算,指數損失函數有比較好的數學性質,連續可微
2. 使得樣本權重的更新更加簡潔
3. 此時目標函數最小化等價於後驗概率最大化(貝葉斯分類器)
迭代方式
這裏是關鍵的地方,即證明Adaboost中的表達式
αm,Gm
和前向分步算法迭代時損失函數最小化的參數
βm,γm
的一致性。
假設經過
m−1
次迭代前向分步算法已經得到
fm−1(x)
:
fm−1(x)=fm−2(x)+αm−1Gm−1(x)=α1G1(x)+⋯+αm−1Gm−1(x)
在第
m
次迭代時,得到
αm,Gm(x),fm(x)
fm(x)=fm−1(x)+αmGm(x)
按照前向分步算法的邏輯,求解
αm,Gm(x)
即求下面目標函數最小化時的參數值:
(αm,Gm)=argminα,G∑i=1nL(yi,f(x))=argminα,G∑i=1nexp[−yif(x)]=argminα,G∑i=1nexp[−yi(fm−1(xi)+αG(x))]=argminα,G∑i=1nexp[−yifm−1(xi)]∗exp[−yiαG(x)]=argminα,G∑i=1nw¯mi∗exp[−yiαG(x)]
其中
w¯mi=exp[−yifm−1(xi)]
,注意這裏下標出現了點變化。
w¯mi
只和
fm−1(x),y
有關,且
fm−1(x)
每一輪迭代之後都產生變化。但是與
α,G
無關,所以不影響最小化求解。換言之,如果目標函數除以
∑i=1nw¯mi
也不影響最終求解,爲什麼要插一句,後面見分曉。
下面證明最小化求解的參數就是Adaboost中所得到的
αm,Gm(x)
。
求解可以分兩步:
1. 求
G∗m(x)
對於任意
α>0
(實際算法流程中可以設置如果分類器誤差率大於0.5,會初始化再迭代,也就是說保證
α>0
),最小化可以由下式得到:
G∗m(x)=argminG∑i=1nw¯miI(yi≠G(xi))
這裏有兩點需要明確:
(1)極小化指數損失函數爲什麼等價於最小化加權分類誤差
如果基函數or基分類器返回的是
{−1,+1}
,那麼損失函數爲式(1),原始最小化公式可以化簡爲:
Loss=∑i=1nw¯miexp[−yiαGm(x)]=∑yi=G(xi)e−αw¯mi+∑yi≠G(xi)eαw¯mi=∑yi=G(xi)e−αw¯mi+∑yi≠G(xi)(eα−e−α+e−α)w¯mi=∑yi=G(xi)e−αw¯mi+∑yi≠G(xi)e−αw¯mi+∑yi≠G(xi)(eα−e−α)w¯mi=∑i=1ne−αw¯mi+∑yi≠G(xi)(eα−e−α)w¯mi=∑i=1ne−αw¯mi+(eα−e−α)∑i=1nw¯miI(yi≠Gm(xi))
就本次優化問題而言,
α,w¯mi
都是固定不變的,化簡的時候可以去掉,因此由上面的推導就可以得到指數損失函數等價於最小化加權分類誤差。
(2)樣本權重怎麼影響目標函數
後面會講到
w¯mi
和Adaboost中的
wmi
只相差一個規範化因子
Zm
,所以其本身不影響損失函數的最小化,那麼樣本權重是可以直接影響到最小化的求解過程,至於具體的求解,李航書裏的例子只用一層的決策樹樁,所以相當於是直接求解,至於更復雜的分類器可能就是上面提到的改變基分類器損失函數和進行重抽樣來實現的[這裏需要再確認下]。
2. 求
α∗m
G∗m(x)=argminG∑i=1nw¯miexp[−yiαG(x)]=argminG∑yi=G(xi)e−αw¯mi+∑yi≠G(xi)eαw¯mi=argminG∑yi=G(xi)e−αw¯mi+∑yi≠G(xi)(eα−e−α+e−α)w¯mi=argminG∑yi=G(xi)e−αw¯mi+∑yi≠G(xi)e−αw¯mi+∑yi≠G(xi)(eα−e−α)w¯mi=argminG∑i=1ne−αw¯mi+∑yi≠G(xi)(eα−e−α)w¯mi=argminG∑i=1ne−αw¯mi+(eα−e−α)∑yi≠G(xi)w¯miI(yi≠G(xi))
將已求得的
G∗m(x)
代入上式,並對
α
求導,令其爲0,即可得
α∗m
:
對loss做化簡:
Loss=∑i=1nw¯miexp[−yiαGm(x)]=∑yi=G(xi)e−αw¯mi+∑yi≠G(xi)eαw¯mi=∑yi=G(xi)e−αw¯mi+∑yi≠G(xi)(eα−e−α+e−α)w¯mi=∑yi=G(xi)e−αw¯mi+∑yi≠G(xi)e−αw¯mi+∑yi≠G(xi)(eα−e−α)w¯mi=∑i=1ne−αw¯mi+∑yi≠G(xi)(eα−e−α)w¯mi=∑i=1ne−αw¯mi+(eα−e−α)∑i=1nw¯miI(yi≠Gm(xi))
對
α
求導:
∂Loss∂α=−∑i=1ne−αw¯mi+(eα+e−α)∑i=1nw¯miI(yi≠Gm(xi))=0e−α∑i=1nw¯mi=(eα+e−α)∑i=1nw¯miI(yi≠Gm(xi))e−αeα+e−α=∑i=1nw¯miI(yi≠Gm(xi))∑i=1nw¯misetem=∑i=1nw¯miI(yi≠Gm(xi))∑i=1nw¯misoeα+e−αe−α=1eme2α+1=1emlog(e2α)=log(1em−1)α∗m=12log(1−emem)
觀察每一輪樣本權值的更新。由
{fm(x)=fm−1(x)+αmGm(xi)w¯mi=exp[−yifm−1(xi)]∴w¯m+1,i=exp[−yifm(xi)]=exp[−yi(fm−1(x)+αmGm(xi))]=exp[−yifm−1(x)]∗exp[−yiαmGm(xi)]=w¯mi∗exp[−yiαmGm(xi)]
這與Adaboost算法第2(d)步的權值更新,只差規範因子,因而等價。等價的原因是:對於前面第
m
輪最小化求解問題,
w¯mi
是固定的,所以目標函數同時除以
∑i=1nw¯mi
並不影響求解,我們可以在前面修改目標函數的表達式,從而形式上和Adaboost保持一致。
前面還有一個遺留問題:
α∗m
與Ada中形式上一致,那麼
em
是否一致呢?
在Adaboost中:
em=P(Gm(xi)≠yi)=∑i=1nwmiI(Gm(xi)≠yi)
在前向分步算法中:
em=∑i=1nw¯miI(yi≠Gm(xi))∑i=1nw¯mi
若兩者等價,則需證明
w¯mi∑i=1nw¯mi=wmi
從前面樣本權重的迭代公式可以看出,前向分步算法和Adaboost的樣本權重迭代是一致的,也就是說,只要去相同的初始值
w0
,後面迭代的結果也是一致的。
w¯mi∑i=1nw¯mi=w¯m−1,i∗exp[−yiαm−1Gm−1(xi)]∑i=