機器學習回顧篇(13):集成學習之AdaBoost

 

在上一篇博客中,咱們總結了集成學習的原理,並展開介紹了集成學習中Bagging和隨機森林這一分枝算法,在本篇博客中,咱們繼續介紹另外一個分枝——Boosting,並對Boosting系列中的經典算法Adaboost展開分析。javascript

 

1 Boosting

 

Boosting系列算法又稱爲提高學習算法,算法目標就是將弱分類器提高爲強分類器。這裏的弱分類器和強分類器是根據準確率對學習器進行的一種劃分,弱分類器準確率較低(高於50%便可),強分類器則須要有一個有使人滿意準確率。很明顯,強分類器是機器學習的最終目標,但在不少場景下,直接訓練獲取一個強分類器有時候是很是困難的,相比之下,但弱分類器一般經過簡單訓練便可得到,經過反覆學習得到大量弱分類器進行組合也能夠得到一個性能優異的強分類器。若是隻是這樣的話,那麼Boosting與Bagging列些的集成算法也就沒什麼太大區別,在上一篇博客中,咱們說過集成學習的全部基本分類器知足符合如下兩個條件:
(1)基本分類器之間應該有差別性。若是基本分類器將沒有差別,那麼集成起來的結果是沒有變化的。
(2)每一個基本分類器的精度必須大於0.5。
用一句話說就是全部的基本分類器必須「好而不一樣」,爲了達到這一目的,Boosting使用了加法模型和前向分步算法。
加法模型是指強學習器是由一個個弱分類器累加組合而來: $${H_M}(x) = \sum\limits_{m = 1}^M {{\alpha _m}{h_m}(x)} $$ 其中,${{h_m}(x)}$是指第$m$個弱分類器,${\alpha _m}$是${{h_m}(x)}$在$M$個分類器中的權重。
前向分步算法是指在算法迭代過程當中,每個分類器是又上一次迭代產生的分類器基礎上進行訓練得到。數學表示以下:
$${H_m}(x) = {H_{m - 1}}(x) + {\alpha _m}{h_m}(x)$$ Boosting正是在集成思想上結合加法模型和前向分步算法的一種集成學習方法:首先從初始訓練集中訓練一個初始基本分類器,在根據初始分類器的表現對訓練樣本分佈進行調整,使得訓練下一個分類器時對上一個學習器誤分類樣本更加關注,經過此種方式不一樣循環訓練一系列分類器,直到分類器達到指定數量亦或者累加後的強分類器達到指定精度。
前向分步算法決定了在Boosting系列算法中,全部分類器間只能是一種串行的結構,每個分類器只能在上一個的學習器基礎上進行學習,這是與Bagging系列算法分類器間的並行結構最大的不一樣。
創建在這一思想的基礎上,不少Boosting系列算法相繼提出,AdaBoost算法就是其中之一。本文接下來內容對AdaBoost算法展開介紹。css

 

2 AdaBoost

2.1 算法原理

AdaBoost,是英文Adaptive Boosting的縮寫,可直接翻譯爲自適應提高算法,由Yoav Freund和Robert Schapire在1995年提出。AdaBoost算法在每一次迭代中根據訓練集之中每一個樣本的分類正確與否,以及上次的整體分類的準確率,來爲每一個樣本設置一個權值,經過增長在上一個弱分類器中被誤分類的樣本的權值使得該樣本在下一次迭代訓練弱分類器時獲得更多的重視,經過這種方式,每一次迭代都前面弱分類器分類結果基礎上訓練新的分類器,最終將弱分類器融合起來,做爲強分類器進行決策使用,以下圖所示。細緻一點來講,AdaBoost就能夠分爲如下三個步驟:
(1)爲訓練集中每個樣本初始化一個權值,例若有$N$個樣本,那麼每一個樣本權值都爲$\frac{1}{N}$。
(2)經過循環迭代的方式訓練大量的弱分類器,每一次迭代的操做以下:結合樣本現有的權值和本次訓練中分類的正確與否更新樣本的權值,正確分類樣本權值將下降,錯誤分類樣本權值增長,將更新後的權值傳遞到下一次迭代中,是的在訓練下一個弱分類器時以前被誤分類的樣本獲得更多的關注。
(3)根據準確率爲每一個弱分類器設置一個權值(注意,這裏的權值是弱分類器的權值,跟第二步中的樣本權值是不同的),使準確率高的分類器在有更高的「決策權」,而後經過加權求和的方式對全部弱分類器進行組合得到一個最終的強分類器。
那麼,樣本權值在每一次迭代過程當中具體怎樣更新和傳遞,又是如何影響下一輪的迭代中學習器對樣本的重視程度?學習器的權重怎麼計算?帶着這些問題,咱們結合數學計算來詳細敘述AdaBoost算法的各個步驟。先來講說分類問題。
imagehtml

2.2 分類問題

給定一個二分類數據集$D = \{ ({x_1},{y_1}),({x_2},{y_2}), \cdots ,({x_N},{y_N})\} $,其中樣本的特徵向量${x_i} \in X \subseteq {R^n}$,樣本標籤 ${y_i} \in Y = \{ - 1, + 1\} $。經過AdaBoost算法對$D$進行分類,步驟以下:
(1)初始化$D$中全部樣本的權值分佈。在算法初始化時,還沒有對數據集進行擬合,也沒有任何其餘先驗假設,因此對全部樣本「平等視之」,即全部樣本相等:
$$W = ({w_{11}}, \cdots ,{w_{1i}}, \cdots ,{w_{iN}}),{w_{1i}} = \frac{1}{N},i = 1,2, \cdots ,N \tag{1}$$ (2)進行$M$次迭代,其中第$m$次迭代的具體過程以下:
       (a)使用設定好的學習算法對訓練集$D$進行學習,構建弱分類器${h_m}(x):X \to \{ - 1, + 1\} $。若樣本$x_i$被誤分類,則有${y_i} \ne {h_m}({x_i})$,因此結合各樣本權值,偏差率能夠按以下公式計算: $$e_m = \sum\limits_{{y_i} \ne {h_m}({x_i})} {{w_{mi}}} $$ 從偏差率的計算公式中能夠看出,所謂偏差率就是全部誤分類樣本權值之和。
       (b)計算${h_m}(x)$的係數: $${\alpha _m} = \frac{1}{2}\ln \frac{{1 - {e_m}}}{{1 + {e_m}}} \tag{2}$$ 這個${\alpha _m}$的做用是在衡量分類器$h_m(x)$的「話語權」,$h_m(x)$偏差率越高,${\alpha _m}$值越小,對集成後強分類器結果的影響就越小。
       (c)根據在(a)中計算好的偏差率,更新數據集$D$中各樣本的權值分佈: $$W = ({w_{m + 1,1}}, \cdots ,{w_{m + 1,i}}, \cdots ,{w_{m + 1,N}})$$html5

$${w_{m + 1,i}} = \frac{{{w_{m,i}}}}{{{Z_m}}}\exp \left( { - {\alpha _m}{y_i}{h_m}({x_i})} \right) \tag{3}$$$${Z_m} = \sum\limits_{i = 1}^N {{w_{m,i}}\exp \left( { - {\alpha _m}{y_i}{h_m}({x_i})} \right)} $$

咱們來分析一下這個式(3)。$Z_m$是歸一化因子,權值計算時除以$Z_m$是爲了讓全部樣本權值之和爲1。接着分析指數部分的${ - {\alpha _m}{y_i}{h_m}({x_i})}$,這纔是重點,當樣本被正確分類時,${{h_m}({x_i})}=y_i$,因此${{h_m}({x_i})}$與$y_i$必定同爲正或同爲負,${\alpha _m}$是正數,因而${ - {\alpha _m}{y_i}{h_m}({x_i})}$就小於0,指數運算後的值就小於1,因此權值相乘後結果減少,這就達到了下降正確分類樣本在下一次迭代中的權值的目的。反之,對於誤分類樣本,指數運算後的值就大於1,與權值相乘後就結果增大,達到增長誤分類樣本在下一次迭代中的權值目的。
(3)組合在第二步中訓練好的全部弱分類器: $$H'(x) = \sum\limits_{m = 1}^M {{\alpha _m}{h_m}(x)} $$ 那麼,最終的強分類器能夠表示爲: $$H(x) = sign\left( {H'(x)} \right) = sign\left( {\sum\limits_{m = 1}^M {{\alpha _m}{h_m}(x)} } \right)$$java

 

2.3 迴歸問題

AdaBoost算法在解決迴歸問題時的求解步驟和原理與2.2節中分類問題是很相似的。
(1)初始化$D$中全部樣本的權值分佈。 $$W = ({w_{11}}, \cdots ,{w_{1i}}, \cdots ,{w_{iN}}),{w_{1i}} = \frac{1}{N},i = 1,2, \cdots ,N$$ (2)進行$M$次迭代,其中第$m$次迭代的具體過程以下:
       (a)使用設定好的學習算法對訓練集$D$進行學習,計算${h_m}$的偏差率。不過,在計算偏差率前,須要計算最大偏差${E_m}$和相對偏差${e_{m,i}}$:
$${E_m} = \max \left| {{y_i} - {h_m}({x_i})} \right|,i = 1,2, \cdots ,N$$ 相對偏差可使用線性偏差、平方偏差或者指數偏差。
線性偏差:${e_{m,i}} = \frac{{\left| {{y_i} - {h_m}({x_i})} \right|}}{{{E_m}}}$node

平方偏差:${e_{m,i}} = \frac{{{{({y_i} - {h_m}({x_i}))}^2}}}{{E_m^2}}$python

指數偏差:${e_{m,i}} = 1 - \exp \left( { - \frac{{\left| {{y_i} - {h_m}({x_i})} \right|}}{{{E_m}}}} \right)$jquery

而後計算偏差率$e_m$: $${e_m} = \sum\limits_{i = 1}^N {{w_{m,i}}{e_{m,i}}} $$        (b)計算${h_m}(x)$的係數: $${\alpha _m} = \frac{{{e_m}}}{{1 - {e_m}}}$$        (c)更新全部樣本的權重分佈: $$W = ({w_{m + 1,1}}, \cdots ,{w_{m + 1,i}}, \cdots ,{w_{m + 1,N}})$$ $${w_{m + 1,i}} = \frac{{{w_{m,i}}}}{{{Z_m}}}{\alpha _m}^{1 - {e_{m,i}}}$$ $${Z_m} = \sum\limits_{i = 1}^N {{w_{m,i}}{\alpha _m}^{1 - {e_{m,i}}}} $$ (3)在迴歸問題中,組合策略也與分類問題有所區別,採用的是對加權後的弱學習器取中位數的方法,最終的強迴歸器爲: $$H(x) = \left( {\sum\limits_{m = 1}^M {\ln (\frac{1}{{{\alpha _m}}})} } \right) \cdot g(x)$$ 式中,$g(x)$表示${\alpha _m}{h_m}(x),m = 1,2, \cdots ,M$序列中的中位數。linux

 

3 總結

最後對AdaBoost算法進行一下總結。AdaBoost主要有以下特性:
(1)簡單易用,須要進行調節的參數不多;
(2)原始的AdaBoost算法只適用於二分類任務;
(3)對於噪聲數據較爲敏感,這是由於AdaBoost算法傾向於對噪聲數據進行擬合,容易形成過擬合;
(4)弱學習器可使用任何算法進行構建,例如可以使用邏輯迴歸、決策樹、線性迴歸等;
(5)能夠用來作特徵選擇,例如進行人羣信用風險評估時,特徵屬性寶庫年齡、居住地址、收入、有無不動產等等,用AdaBoost算法金信諾迭代時,每一次迭代須要用一個弱分類器劃分數據樣本,假設用的是決策樹算法,咱們只能選擇一個特徵屬性進行劃分數據樣本,在建模完成後,看看弱分類器都是使用那些特徵屬性進行決策就能夠知道哪些特徵屬性重要,方便作出特徵選擇。android

相關文章
相關標籤/搜索