1. 程式人生 > >機器學習回顧篇(13):整合學習之AdaBoost

機器學習回顧篇(13):整合學習之AdaBoost

 

在上一篇部落格中,我們總結了整合學習的原理,並展開介紹了整合學習中Bagging和隨機森林這一分枝演算法,在本篇部落格中,我們繼續介紹另一個分枝——Boosting,並對Boosting系列中的經典演算法Adaboost展開分析。

 

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演算法展開介紹。

 

2 AdaBoost¶

2.1 演算法原理¶

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

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}})$$

$${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)$$

 

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}}}$

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

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

然後計算誤差率$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$序列中的中位數。

 

3 總結¶

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

<