Boosting提升演算法之AdaBoost
Boosting提升演算法
Boosting演算法是將“弱學習演算法“提升為“強學習演算法”的過程,主要思想是“三個臭皮匠頂個諸葛亮”。一般來說,找到弱學習演算法要相對容易一些,然後通過反覆學習得到一系列弱分類器,組合這些弱分類器得到一個強分類器。Boosting演算法要涉及到兩個部分,加法模型和前向分步演算法。
-
加法模型就是說強分類器由一系列弱分類器線性相加而成。一般組合形式如下:
F M ( x ; P ) = ∑ m = 1 n β m h ( x ; a m ) F _ { M } ( x ; P ) = \sum _ { m = 1 } ^ { n } \beta _ { m } h ( x ; a _ { m } ) FM(x;P)=m=1∑nβmh(x;am)
其中, h ( z ; a m ) h(z;a_m) h(z;am)就是一個個的弱分類器, a m a_m am是弱分類器學習到的最優引數, β m \beta_m βm就是弱學習在強分類器中所佔比重, P P P是所有 a m a_m am和 β m \beta_m βm的組合。這些弱分類器線性相加組成強分類器。 -
前向分步就是說在訓練過程中,下一輪迭代產生的分類器是在上一輪的基礎上訓練得來的。也就是可以寫成這樣的形式:
F m ( x ) = F m − 1 ( x ) + β m h m ( x ; a m ) F _ { m } ( x ) = F _ { m - 1 } ( x ) + \beta _ { m } h _ { m } ( x ; a _ { m } ) Fm(x)=Fm−1(x)+βmhm(x;am)
由於採用的損失函式不同,Boosting演算法也因此有了不同的型別,AdaBoost就是損失函式為指數損失的Boosting演算法。
從圖中可以看出,Boosting演算法的工作機制是首先從訓練集用初始權重訓練出一個弱學習器1,根據弱學習的學習誤差率表現來更新訓練樣本的權重,使得之前弱學習器1學習誤差率高的訓練樣本點的權重變高,使得這些誤差率高的點在後面的弱學習器2中得到更多的重視。然後基於調整權重後的訓練集來訓練弱學習器2.,如此重複進行,直到弱學習器數達到事先指定的數目T,最終將這T個弱學習器通過集合策略進行整合,得到最終的強學習器。
不過有幾個具體的問題Boosting演算法沒有詳細說明。
1)如何計算學習誤差率e?
2) 如何得到弱學習器權重係數α?
3)如何更新樣本權重D?
4) 使用何種結合策略?
只要是boosting大家族的演算法,都要解決這4個問題。那麼Adaboost是怎麼解決的呢?
1 Adaboost
1.1 原理理解
全稱adaptive boosting,大多數的提升方法都是改變訓練資料的概率分佈(訓練資料的權值分佈),針對不同的訓練資料分佈呼叫弱學習演算法學習一系列弱分類器。這樣,會產生兩個問題:
- 1、在每一輪中如何改變訓練資料的權值或概率分佈
Adaboost將關注點放在被錯誤分類的樣本上,減小上一輪被正確分類的樣本權值,提高那些被錯誤分類的樣本權值。然後,再根據所採用的一些基本機器學習演算法進行學習,這樣那些沒有得到正確分類的資料由於其權值的加大而受到後面一輪的弱分類器的更大關注。 - 2、如何將弱分類器組合成一個強分類器
AdaBoost採用加權多數表決的方法,加大分類誤差率小的弱分類器的權重,減小分類誤差率大的弱分類器的權重。這個很好理解,正確率高分得好的弱分類器在強分類器中當然應該有較大的發言權。
AdaBoost的訓練誤差是以指數速率下降的,即AdaBoost演算法隨著迭代次數的增加,訓練誤差不斷減小,即模型偏差顯著降低 。
1.2 Adaboost演算法的基本思路
這一部分看一下Adaboost是如何解決開頭提出的4個問題的。總結一下,得到AdaBoost的演算法流程:
- 輸入: 訓練資料集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x N , y N ) } , T=\left\{\left(x_{1}, y_{1}\right),\left(x_{2}, y_{2}\right),\left(x_{N}, y_{N}\right)\right\}, T={(x1,y1),(x2,y2),(xN,yN)}, 其中, x i ∈ X ⊆ R n , y i ∈ Y = − 1 , 1 , x_{i} \in X \subseteq R^{n}, y_{i} \in Y=-1,1, xi∈X⊆Rn,yi∈Y=−1,1, 迭代次數 M M M
- 1.初始化訓練樣本的權值分佈
D 1 = ( w 1 , 1 , w 1 , 2 , … , w 1 , i ) , w 1 , i = 1 N , i = 1 , 2 , … , N D_{1}=\left(w_{1,1}, w_{1,2}, \ldots, w_{1, i}\right), w_{1, i}=\frac{1}{N}, i=1,2, \ldots, N D1=(w1,1,w1,2,…,w1,i),w1,i=N1,i=1,2,…,N - 2.對於
m
=
1
,
2
,
…
,
M
m=1,2, \ldots, M
m=1,2,…,M
( a ) 使用具有權值分佈 D m D_{m} Dm 的訓練資料集進行學習,得到弱分類器 G m ( x ) G_{m}(x) Gm(x)
( b ) 計算 G m ( x ) G_{m}(x) Gm(x) 在訓練資料集上的分類誤差率:
e m = ∑ i = 1 N w m , i I ( G m ( x i ) ≠ y i ) e_{m}=\sum_{i=1}^{N} w_{m, i} I\left(G_{m}\left(x_{i}\right) \neq y_{i}\right) em=i=1∑Nwm,iI(Gm(xi)=yi)
( c ) 計算 G m ( x ) G_{m}(x) Gm(x) 在強分類器中所佔的權重: :
α m = 1 2 log 1 − e m e m \alpha_{m}=\frac{1}{2} \log \frac{1-e_{m}}{e_{m}} αm=21logem1−em
為什麼這樣計算弱學習器權重係數?從上式可以看出,如果分類誤差率 e m e_m em越大,則對應的弱分類器權重係數 α k α_k αk越小。也就是說,誤差率小的弱分類器權重係數越大。具體為什麼採用這個權重係數公式,我們在講Adaboost的損失函式優化時再講。
( d ) 更新訓練資料集的權值分佈(這裡, z m z_{m} zm 是歸一化因子,為了使樣本的概率分佈和
為1):
w m + 1 , i = w m , i z m exp ( − α m y i G m ( x i ) ) , i = 1 , 2 , … , 10 z m = ∑ i = 1 N w m , i exp ( − α m y i G m ( x i ) ) \begin{array}{c} w_{m+1, i}=\frac{w_{m, i}}{z_{m}} \exp \left(-\alpha_{m} y_{i} G_{m}\left(x_{i}\right)\right), i=1,2, \ldots, 10 \\ \\ z_{m}=\sum_{i=1}^{N} w_{m, i} \exp \left(-\alpha_{m} y_{i} G_{m}\left(x_{i}\right)\right) \end{array} wm+1,i=zmwm,iexp(−αmyiGm(xi)),i=1,2,…,10zm=∑i=1Nwm,iexp(−αmyiGm(xi))
從 w k + 1 , i w_{k+1,i} wk+1,i計算公式可以看出, 如果第 i 個 i個 i個樣本分類錯誤, 則 y i G m ( x i ) < 0 y_{i} G_{m}\left(x_{i}\right)<0 yiGm(xi)<0, 導致樣本的權重在第 k + 1 k+1 k+1個弱分類器中增大,如果分類正確,則權重在第 k + 1 k+1 k+1個弱分類器中減少具體為什麼採用樣本權重更新公式,我們在講Adaboost的損失函式優化時再講。 - 3.得到最終的分類器:
F ( x ) = sign ( ∑ i = 1 N α m G m ( x ) ) F ( x ) = \operatorname { sign } ( \sum _ { i = 1 } ^ { N } \alpha _ { m } G _ { m } ( x ) ) F(x)=sign(i=1∑NαmGm(x))
1.3 AdaBoost分類問題的損失函式優化
剛才上一節我們講到了分類Adaboost的弱學習器權重係數公式和樣本權重更新公式。但是沒有解釋選擇這個公式的原因,讓人覺得是魔法公式一樣。其實它可以從Adaboost的損失函式推匯出來。
從另一個角度講,Adaboost是模型為加法模型,學習演算法為前向分步學習演算法,損失函式為指數函式的分類問題。
- 模型為加法模型好理解,我們的最終的強分類器是若干個弱分類器加權平均而得到的。
- 前向分步學習演算法也好理解,我們的演算法是通過一輪輪的弱學習器學習,利用前一個強學習器的結果和當前弱學習器來更新當前的強學習器的模型。
也就是說,第k-1輪的強學習器為
f k − 1 ( x ) = ∑ i = 1 k − 1 α i G i ( x ) f _ { k - 1 } ( x ) = \sum _ { i = 1 } ^ { k - 1 } \alpha _ { i } G _ { i } ( x ) fk−1(x)=i=1∑k−1αiGi(x)
而第k輪的強學習器為
f k ( x ) = ∑ i = 1 k α i G i ( x ) f _ { k } ( x ) = \sum _ { i = 1 } ^ { k } \alpha _ { i } G _ { i } ( x ) fk(x)=i=1∑kαiGi(x)
上面兩式一比較可以得到
f k ( x ) = f k − 1 ( x ) + α k G k ( x ) f _ { k } ( x ) = f _ { k - 1 } ( x ) + \alpha _ { k } G _ { k } ( x ) fk(x)=fk−1(x)+αkGk(x)
- Adaboost損失函式為指數函式,即定義損失函式為
1.4 Adaboost演算法的正則化
1.5 Adaboost小結
Boosting方法可以以多種模型作為基本模型,其中以分類決策樹或迴歸決策樹為基模型的話被稱為提升樹(Boosting Tree)。
Boosting演算法的工作機制:首先從訓練集用初始權重訓練出一個弱學習器1,根據弱學習的學習誤差率表現來更新訓練樣本的權重,使得之前弱學習器1學習誤差率高的訓練樣本點的權重變高,使得這些誤差率高的點在後面的弱學習器2中得到更多的重視。然後基於調整權重後的訓練集來訓練弱學習器2.,如此重複進行,直到弱學習器數達到事先指定的數目T,最終將這T個弱學習器通過集合策略進行整合,得到最終的強學習器。
不過有幾個具體的問題Boosting演算法沒有詳細說明。
1)如何計算學習誤差率e?
2) 如何得到弱學習器權重係數α?
3)如何更新樣本權重D?
4) 使用何種結合策略?
只要是boosting大家族的演算法,都要解決這4個問題。
上述4個問題可以被總結為:
- 每一輪如何改變訓練資料的權值和概率分佈
- 如何將弱分類器組合成一個強分類器
Adaboost核心思路:對第一個問題,提升被前一輪弱分類器錯誤分類的樣本的權值,降低被正確分類樣本的權值;對於第2個問題,AdaBoost採取加權多數表決的方法,加大分類誤差率小的弱分類器的權值,減少分類誤差率大的弱分類器的權值。
到這裡Adaboost就寫完了,前面有一個沒有提到,就是弱學習器的型別。理論上任何學習器都可以用於Adaboost.但一般來說,使用最廣泛的Adaboost弱學習器是決策樹和神經網路。對於決策樹,Adaboost分類用了CART分類樹,而Adaboost迴歸用了CART迴歸樹。因此,Adaboost’既可以分類也可以迴歸。
這裡對Adaboost演算法的優缺點做一個總結。
- 主要優點有:
1)Adaboost作為分類器時,分類精度很高
2)在Adaboost的框架下,可以使用各種迴歸分類模型來構建弱學習器,非常靈活。
3)作為簡單的二元分類器時,構造簡單,結果可理解。
4)不容易發生過擬合 - 主要缺點有:
1)對異常樣本敏感,異常樣本在迭代中可能會獲得較高的權重,影響最終的強學習器的預測準確性。
2)此外,Adaboost依賴於弱分類器,而弱分類器的訓練時間往往很長。
相關文章
- 03整合學習-Boosting-AdaBoost演算法原理演算法
- 08_提升方法_AdaBoost演算法演算法
- 演算法金 | 決策樹、隨機森林、bagging、boosting、Adaboost、GBDT、XGBoost 演算法大全演算法隨機森林
- 機器學習——提升方法AdaBoost演算法,推導過程機器學習演算法
- ML《整合學習(四)Boosting之迴歸樹、提升樹和GBDT》
- 機器學習演算法:AdaBoost機器學習演算法
- 《機器學習Python實現_10_02_整合學習_boosting_adaboost分類器實現》機器學習Python
- ML《整合學習(二)Boosting之Adaboosting》
- 機器學習 — AdaBoost演算法(手稿+程式碼)機器學習演算法
- AdaBoost 演算法-分析波士頓房價資料集演算法
- 最常用的決策樹演算法!Random Forest、Adaboost、GBDT 演算法演算法randomREST
- 一文搞懂:Adaboost及手推演算法案例演算法
- Adaboost Algorithm StepGo
- AdaBoost演算法解密:從基礎到應用的全面解析演算法解密
- [C++ & AdaBoost] 傻陳帶你用C++實現AdaBoostC++
- 機器學習演算法系列(十九)-自適應增強演算法(Adaptive Boosting Algorithm)機器學習演算法APTGo
- Tree – AdaBoost with sklearn source code
- Xgboost - A scalable tree boosting system Chiang
- JavaScript之宣告提升JavaScript
- javascript之變數提升與函式提升JavaScript變數函式
- 05整合學習-Boosting-GBDT初探
- Elasticsearch複合查詢——boosting查詢Elasticsearch
- 統計學習方法——實現AdaBoost
- Bagging和Boosting的介紹及對比
- Bagging(Bootstrap aggregating)、隨機森林(random forests)、AdaBoostboot隨機森林randomREST
- 對演算法思維提升的思考演算法
- 演算法基提升礎學習2演算法
- 演算法基礎提升學習3演算法
- 演算法基礎提升學習1演算法
- python小白之路:第十九章 Boosting模型(二)Python模型
- 常用的模型整合方法介紹:bagging、boosting 、stacking模型
- 演算法信仰的力量:改進演算法能提升多少效能?演算法
- 【機器學習】--Adaboost從初始到應用機器學習
- webpack編譯速度提升之DllPluginWeb編譯Plugin
- Vue效能提升之Object.freeze()VueObject
- MySQL 8.0 | CATS排程演算法的效能提升MySql演算法
- 演算法之KMP演算法KMP
- 常用演算法之貪心演算法演算法