【機器學習】Boosting與AdaBoost分類與迴歸原理詳解與公式推導

1.Boosting

Boosting族算法的工作機制爲:先從初始訓練集中訓練出一個基學習器,再根據基學習器的表現對訓練樣本分佈進行調整,然後基於調整後的樣本分佈來訓練下一個基學習器;重複進行,直到基學習器數目達到事先指定的值;最終將所有基學習器根據結合策略結合,得到最終的強學習器。

Boosting中的基學習器是弱學習器,即僅僅比隨機猜測好一點的模型,比如一個簡單的決策樹。使用弱學習器而不是強學習器的原因是,發現一個弱學習器通常要比發現強學習器容易得多,且Boosting方法就是從弱學習器出發,反覆學習,組合構成一個強學習器。

Boosting族算法主要關注降低偏差,最着名的算法是AdaBoost和提升樹(Boosting tree)。這篇博客主要介紹AdaBoost的原理和算法描述,提升樹的相關內容將在下一篇博客中介紹。

2. AdaBoost原理

作爲Boosting家族的一員,AdaBoost首先要回答兩個問題:

1.如何改變訓練樣本分佈?

2.採用什麼樣的結合策略來將基學習器結合成一個強學習器。

AdaBoost的做法是:

1.提高那些被前一輪基學習器錯誤分類的樣本的權值,降低那些被正確分類的樣本的權值;

2.對所有基學習器採用加權結合,增大分類誤差小的基學習器的權值,減少分類誤差率大的基學習器的權值。

理論上的AdaBoost可以使用任何算法作爲基學習器,但一般來說,使用最廣泛的AdaBoost的弱學習器是決策樹和神經網絡。

3. AdaBoost分類算法描述

輸入:訓練集D = \left\{ \left( x _ { i } , y _ { i } \right) \right\} _ { i = 1 } ^ { m },其中x _ { i } \in \chi \subseteq R ^ { n }{y_i} \in {\cal Y} = \left\{ { + 1, - 1} \right\};基學習算法\mathfrak {L};基學習器個數Ť

過程:

        (1)初始化訓練樣本的權值分佈

                                \mathcal { D } _ { 1 } = \left( w _ { 11 } , \ldots , w _ { 1 i } , \ldots , w _ { 1 m } \right) , w _ { 1 i } = \frac { 1 } { m } , i = 1,2 , \ldots , m

        (2)對迭代輪次{t = 1,2,\ ldots,T}

                (a)使用具有當前分佈{\mathcal D}_t的訓練數據集訓練基學習器{h_t} = \mathfrak{L}\left( {D,{{\mathcal D}_t}} \right);

                (b)基學習器h_t在訓練數據集上的分類誤差率:

                                {\ varepsilon _t} = P \ left({{h_t} \ left(x \ right)\ ne y} \ right)= \ sum \ limits_i ^ m {{w_ {ti}}我\左({{h_t} \ left({{x_i}} \ right)\ ne {y_i}} \ right)}

                (c)基學習器H T的權重係數{\ alpha _t}{\ alpha _t}表示H T在最終分類器中的重要性,當{\ varepsilon _t} \ le \ frac {1} {2}時,{\ alpha _t} \ ge 0,並且{\ alpha _t}{\ varepsilon _t}減少而增大。分類誤差率{\ varepsilon _t}越小的基學習器在最終強學習器中的權值越高):

                                {\ alpha _t} = \ frac {1} {2} \ cdot \ ln \ frac {{1  -  {\ varepsilon _t}}} {{{\ varepsilon _t}}}

                (d)更新訓練集的樣本分佈{{\ cal D} _ {t + 1}} = \ left({{w_ {t + 1,1}},\ ldots,{w_ {t + 1,i}},\ ldots,{w_ {t + 1,m}}} \ right)

                                w _ { t + 1 , i } = \frac { w _ { t i } } { Z _ { t } } \exp \left( - \alpha _ { t } y _ { i } h _ { t } \left( x _ { i } \right) \right) = \left\{ \begin{array} { l l } { \frac { w _ { t i } } { Z _ { t } } e ^ { - \alpha _ { t } } , } & { h _ { t } \left( x _ { i } \right) = y _ { i } } \\ { \frac { w _ { t i } } { Z _ { t } } e ^ { \alpha _ { t } } , } & { h _ { t } \left( x _ { i } \right) \neq y _ { i } } \end{array} \right.

                                {Z_t} = \ sum \ limits_ {i = 1} ^ m {{w_ {ti}} \ exp \ left({ -  {\ alpha _t} {y_i} {h_t} \ left({{x_i}} \ right )} \對}}

                        其中,{{Z_t}}是規範化因子,只是爲了保證{{w_{t + 1,i}}}相加爲1,{{\ cal D} _ {t + 1}}是一個概率分佈。

        (3)構建基學習器的線性組合\sum\limits_t^T {{\alpha _t}{h_t}\left( x \right)},得到最終的強分類器:

                                H( x ) = \operatorname { sign } \left( \sum _ { t = 1 } ^ { T } \alpha _ { t } h _ { t } ( x ) \right)

輸出:強分類器H \ left(x \ right)

4. AdaBoost公式推導

首先介紹一下前向分步算法(forward stagewise algorithm)的基本思想:對加法模型的複雜優化問題,前向分步算法對加法模型的每一步進行單獨優化求解。

AdaBoost的算法可以看成是模型爲加法模型,損失函數爲指數函數,學習算法爲前向分步算法時的一種學習方法。

1.爲什麼選定指數函數作爲損失函數?

這是因爲極小化指數損失函數等價於最小化分類誤差率,並且由於指數損失函數是連續可微的,具有更好的數學性質,因此用它來代替0/1損失函數作爲優化目標。證明如下:

AdaBoost的算法的最終模型是基學習器的線性組合:

                                H \ left(x \ right)= \ sum \ limits_t ^ T {{\ alpha _t} {h_t} \ left(x \ right)}                                (1)

指數損失函數是:

                                L \ left({y,H \ left(x \ right)} \ right)= \ exp \ left({ -  yH \ left(x \ right)} \ right)                                (2)

式(2)可化爲:

        L \ left({y,H \ left(x \ right)} \ right)= \ exp \ left({ -  H \ left(x \ right)} \ right)\ cdot P \ left({y = 1 \離開|  x \ right。} \ right)+ \ exp \ left({H \ left(x \ right)} \ right)\ cdot P \ left({y =  -  1 \ left |  x \ right。} \ right)        (3)

對式(3)求偏導得:

        \ frac {{\ partial L \ left({y,H \ left(x \ right)} \ right)}} {{\ partial H \ left(x \ right)}} =  -  \ exp \ left({ - H \ left(x \ right)} \ right)\ cdot P \ left({y = 1 \ left |  x \ right。} \ right)+ \ exp \ left({H \ left(x \ right)} \ right)\ cdot P \ left({y =  -  1 \ left |  x \ right。} \ right)        (4)

令偏導爲零,得到能最小化指數損失函數的{H \ left(x \ right)}

                                H \ left(x \ right)= \ frac {1} {2} \ ln \ frac {{P \ left({y = 1 \ left |  x \ right。} \ right)}} {{P \ left({y =  -  1 \ left |  x \ right。} \ right)}}                                (5)

因此,對分類任務而言,有

                                \operatorname { sign } ( H ( x ) ) = \operatorname { sign } \left( \frac { 1 } { 2 } \ln \frac { P ( y = 1 | x ) } { P ( y = - 1 | x ) } \right)\\ = \left\{ \begin{array} { c c } { 1 , } & { P ( y = 1 | x ) > P ( y = - 1 | x ) } \\ { - 1 , } & { P ( y = 1 | x ) < P ( y = - 1 | x ) } \end{array} \right.                                (6)

(6)式說明極小化指數損失函數等價於最小化分類誤差率,證明了指數損失函數是分類任務0/1損失函數的一致替代。

2.由於同時求解所有最優基學習器h_t ^ *及其權重係數\ alpha _t ^ *十分困難,AdaBoost的算法利用前向分步算法優化。爲什麼前向分步算法求解得到的基學習器及其權重係數,就是最終模型的最優基學習器及權重呢?

證明如下:

假設經過T-1輪迭代,前向分步算法已經得到{H_ {t  -  1}}

Ť輪迭代將要得到:

                                {H_t}\left( x \right) = {H_{t - 1}}\left( x \right) + {\alpha _t}{h_t}\left( x \right)                                (7)

那麼第Ť輪迭代的目標是得到能最小化{H_t} \ left(x \ right)的指數損失函數的{\ alpha _t}{h_t}\left( x \right),即:

                                \ begin {array} {l} \ begin {array} {* {20} {l}} {\ left({{\ alpha _t},{h_t}} \ right)= \ mathop {\ arg \ min} \限制_ {\ alpha,h} \ sum \ limits_ {i = 1} ^ m {\ exp \ left [{ -  {y_i} {H_t} \ left({{x_i}} \ right)} \ right]}} \ \ {= \ mathop {\ arg \ min} \ limits _ {\ alpha,h} \ sum \ limits_ {i = 1} ^ m {\ exp \ left [{ -  {y_i} \ left({{H_ {t  - 1}} \ left({{x_i}} \ right)+ {\ alpha _t} {h_t} \ left({{x_i}} \ right)} \ right)} \ right]}} \ end {array} \ \ = \ mathop {\ arg \ min} \ limits _ {\ alpha,h} \ sum \ limits_ {i = 1} ^ m {\ exp \ left [{ -  {y_i} {H_ {t  -  1}} \ left ({{x_i}} \ right)} \ right] \ exp \ left [{ -  {y_i} {\ alpha _t} {h_t} \ left({{x_i}} \ right)} \ right]} \ end {數組}                                (8)

{\overline w _{ti}} = \exp \left[ { - {y_i}{H_{t - 1}}\left( x \right)} \right],(8)式可化爲:

                                \left( {{\alpha _t},{h_t}} \right) = \mathop {\arg \min }\limits_{\alpha ,h} \sum\limits_{i = 1}^m {{{\overline w }_{ti}}\exp \left[ { - {y_i}{\alpha _t}{h_t}\left( x_i \right)} \right]}                                (9)

{{{\ overline w} _ {ti}}}不依賴於\αH,與最小化無關,只依賴於{H_{t - 1}}。也就是說,第Ť輪迭代得到的最優h_t ^ *\alpha _t^*就是最終模型的h_t ^ *\ alpha _t ^ *這就證明了由前向分步算法求解損失函數得到的結果與真實結果一致。

3. 基學習器權重公式和樣本分佈更新公式是怎麼來的?

首先,求h_t ^ *最優h_t ^ *由下式得到:

                                {h_t} = \mathop {\arg \min }\limits_h \sum\limits_{i = 1}^m {{{\overline w }_{ti}}exp\left( {{\alpha _t}} \right) \cdot \exp \left[ { - {y_i}{h_t}\left( x_i \right)} \right]}                                (10)

對任意給定的\alpha_t\exp \left( \alpha _ { t } \right)都是一個常數,不影響最優化結果。因此(11)式可以化爲式(12),得到最優h_t ^ *

                                \begin{array}{l} {h_t} = \mathop {\arg \min }\limits_h \sum\limits_{i = 1}^m {{{\overline w }_{ti}}\exp \left[ { - {y_i}{h_t}\left( x_i \right)} \right]} \\ = \mathop {\arg \min }\limits_h \sum\limits_{i = 1}^m {{{\overline w }_{ti}}I\left( {{h_t}\left( {{x_i}} \right) \ne {y_i}} \right)} \end{array}                                (11)

然後,求解\alpha _t^*最優\ alpha _t ^ *由下式得到:

                                {\alpha _t} = \mathop {\arg \min }\limits_\alpha \sum\limits_{i = 1}^m {{{\overline w }_{ti}}\exp \left[ { - {y_i}{\alpha _t}{h_t}\left( {{x_i}} \right)} \right]}                                (12)

將公式進行變換得到:

                                \begin{array}{l} \sum\limits_{i = 1}^m {{{\overline w }_{ti}}\exp \left[ { - {y_i}{\alpha _t}{h_t}\left( {{x_i}} \right)} \right]} \\ = {e^{ - \alpha }}\sum\limits_{i = 1}^m {{{\overline w }_{ti}}I\left( {{h_t}\left( {{x_i}} \right) = {y_i}} \right)} + {e^\alpha }\sum\limits_{i = 1}^m {{{\overline w }_{ti}}I\left( {{h_t}\left( {{x_i}} \right) \ne {y_i}} \right)} \end{array}                (13)

將式(11)得到的h_t代入上式,並對{\alpha _t}求偏導,使偏導爲0,得到最優\ alpha _t ^ *

                                {\alpha _t} = \frac{1}{2}\ln \frac{{\sum\limits_{i = 1}^m {{{\overline w }_{ti}}I\left( {{h_t}\left( {{x_i}} \right) = {y_i}} \right)} }}{{\sum\limits_{i = 1}^m {{{\overline w }_{ti}}I\left( {{h_t}\left( {{x_i}} \right) \ne {y_i}} \right)} }} = \frac{1}{2}\ln \frac{{1 - {\varepsilon _t}}}{{{\varepsilon _t}}}                (14)

由此,便得到了基學習器的權值公式——式(14)。

其中,{{\varepsilon _t}}是分類誤差率:

                                {\varepsilon _t} = \frac{{\sum\limits_{i = 1}^m {{{\overline w }_{ti}}I\left( {{h_t}\left( {{x_i}} \right) \ne {y_i}} \right)} }}{{\sum\limits_{i = 1}^m {{{\overline w }_{ti}}} }} = \sum\limits_{i = 1}^m {{w_{ti}}I\left( {{h_t}\left( {{x_i}} \right) \ne {y_i}} \right)}                (15)

最後來看每一輪樣本權值的更新,由{\ overline w _ {ti}} = \ exp \ left [{ -  {y_i} {H_ {t  -  1}} \ left(x \ right)} \ right]和式(7)可以得到:

                                {\overline w _{t + 1,i}} = {\overline w _{ti}}\exp \left[ { - {y_i}{\alpha _t}{h_t}\left( {{x_i}} \right)} \right]                     (16)

在右邊除以一個規範化因子,便可得到樣本分佈更新公式。            

5. AdaBoost迴歸算法描述

輸入:訓練集D = \left\{ \left( x _ { i } , y _ { i } \right) \right\} _ { i = 1 } ^ { m },其中x _ { i } \in \chi \subseteq R ^ { n }y _ { i } \in \mathcal { Y };基學習算法\mathfrak {L};基學習器個數Ť

過程:

        (1)初始化訓練樣本的權值分佈

                                {{\ cal D} _1} = \ left({{w_ {11}},\ ldots,{w_ {1i}},\ ldots,{w_ {1m}}} \ right),{w_ {1i}} = \ frac {1} {m},i = 1,2,\ ldots,m

        (2)對迭代輪次{t = 1,2,\ ldots,T}

                (a)使用具有當前分佈{\mathcal D}_t的訓練數據集訓練基學習器{h_t} = \mathfrak{L}\left( {D,{{\mathcal D}_t}} \right);

                (b)計算訓練集上的樣本最大誤差:

                                E _ { t} = \max \left| y _ { i } - h _ { t } \left( x _ { i } \right) \right|, i = 1,2 \ldots m

                (c)計算每個樣本的相對誤差:

                                如果是線性誤差,則e _ { t i } = \frac { \left| y _ { i } - h_t \left( x _ { i } \right) \right| } { E _ { t } }

                                如果是平方誤差,則e _ { t i } = \frac { \left( y _ { i } - h _ { t } \left( x _ { i } \right) \right) ^ { 2 } } { E _ { t } ^ { 2 } }

                                如果是指數誤差,則e _ { t i } = 1 - \exp \left( \frac { - \left| y _ { i } - h _ {t } \left( x _ { i } \right) \right| } { E _ { t} } \right)

                (d)基學習器H T在訓練數據集上的迴歸誤差率:

                                \varepsilon _ { t } = \sum _ { i = 1 } ^ { m } w _ { t i } e _ { t i }

                (e)基學習器H T的權重係數{\alpha _t}

                                {\alpha _t} = \frac{{{\varepsilon _t}}}{{1 - {\varepsilon _t}}}

                (f)更新訓練集的樣本分佈{{\mathcal D}_{t + 1}} = \left( {{w_{t + 1,1}}, \ldots ,{w_{t + 1,i}}, \ldots ,{w_{t + 1,m}}} \right)

                                w _ { t + 1 , i } = \frac { w _ { t i } } { Z _ {t } } \alpha _ { t } ^ { 1 - e_ {ti} }

                      其中,{{Z_t}}是規範化因子:

                                Z _ { t } = \sum _ { i = 1 } ^ { m } w _ { t i } \alpha _ { t } ^ { 1 - e_{ti} }

        (3)構建基學習器的線性組合\sum\limits_t^T {{\alpha _t}{h_t}\left( x \right)},得到最終的強學習器:

                                H( x ) = \sum _ { t = 1 } ^ { T } \left( \ln \frac { 1 } { \alpha _ { t } } \right) g ( x )

                其中,g(x)是所有{\alpha _t}{h_t}\left( x \right),t=1,2,...,T的中位數。

輸出:強學習器H \ left(x \ right)

6. AdaBoost優缺點

優點:

        1. AdaBoost分類精度很高;

        2. 可以使用各種迴歸分類模型構建弱學習器;

        3. 不易發生過擬合。

缺點:

        對異常樣本敏感,異常樣本在迭代中可能獲得較大權重,影響強學習器的預測準確性。

參考文獻:

1.《機器學習》第八章集成學習——周志華

2.《統計學習方法》第八章提升方法——李航

3. 集成學習之Adaboost算法原理小結

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章