1. 程式人生 > >迴歸問題提升樹

迴歸問題提升樹

網上已經有很多介紹Boosting的資料了,這裡簡單概述一下Boosting

Boosting是一種ensemble的學習方法。通過反覆學習多個弱學習器,然後使用加法模型將弱學習器組合到一起形成一個強學習器。如果每次學習一個弱分類器都用同樣的資料,顯然是學習多少次都是沒有太大意義。所以,大多數Boosting每一輪訓練一個弱學習器時就會改變樣本的概率分佈,也就是每個樣本的權重。然後下一個弱學習器就會學到不同分佈的樣本。

接著我們來看一下什麼是加法模型:

加法模型為一系列模型的線性相加:

                                                             

f(x)=\sum_{m=1}^{M}\beta_nb(x;\gamma _m)

其中,b(x;\gamma_m)為基學習器,\gamma_m為基學習器的引數,\beta_m為基學習器的係數,也可以理解為每個基學習的權重。

所以在給定訓練資料及損失函式L(y,f(x))的情況下,學習一個加法模型f(x)就成為經驗風險極小化,即cost function極小化問題:

                                                        \min_{\beta_m,\gamma_m}\sum_{i=1}^{N}L(y_i,\sum_{m=1}^{M}\beta_mb(x_i;\gamma_m))

因為加法模型要同時優化所有的基學習器是一個很複雜的問題,為了make life easier,同時結合加法模型的特性(基學習器的線組合),我們可以採用前向分佈演算法,每次優化新加入的基學習器的引數, 因為前面已經變為常數了,逐步逼近優化上面的cost function。

前向分佈演算法

輸入:訓練資料集T=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\}x_i\in \chi \subseteq R^n, y_i\in Y=\{-1,1\}); 損失函式L(y,f(x));基函式集為b\{x;\gamma \};

輸出:加法模型f(x)

1) 初始化f_0(x)=0

2) 對m=1,2,3,...,M, 依次訓練第m個基學習器

      a) 極小化損失函式

                                  (\beta_m,\gamma_m)=arg\min_{\beta ,\gamma }\sum_{i=1}^{N}L(y_i,f_{m-1}(x_i)+\beta b(x_i;\gamma )))

          得到引數\beta_m,\gamma_m;
      b) 更新

                                                f_m(x)=f_{m-1}(x)+\beta _mb(x;\gamma _m)

 3) 得到加法模型

                                               f(x)=f_M=\sum _{m=1}^{M}\beta _mb(x;\gamma _m)

有了上面的鋪墊,我們可以開始迴歸問題提升樹

迴歸提升樹是採用CART迴歸樹作為基學習器的Boosting演算法。它會訓練多棵CART樹,然後每棵樹的預測結果的線性組合就是迴歸問題提升樹。

迴歸提升樹演算法

輸入:訓練資料集T=\{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\}x_i\in \chi \subseteq R^n, y_i\in Y=\{-1,1\});

           損失函式為平方誤差損失函式(MSE) : L(y,f(x))=(y-f(x))^2

輸出:提升樹f_M(x)

1) 初始化f_0(x)=0

2) 對m=1,2,3,...,M, 依次訓練第m個CART迴歸樹

     a) 計算殘差

                                          r_{mi}=y_i-f_{m-1}(x_i), i=1,2,...,N

     b) 擬合殘差r_{mi}學習一個迴歸樹,得到

                                             T(x;\Theta _m) = \sum_{j=1}^{J}c_jI(x\in R_j)

        R_j為迴歸樹在輸入空間劃分的J個區域j = 1,2,...,J,也就是葉子結點的個數。所以c_j就表示每個結點也就是區域輸出的常            量 。引數\Theta _m=\{(R_1,c_1),(R_2,c_2),...,(R_J,c_J)\},表示樹的區域劃分和各區域上的常數。

     c) 更新

                                                 f_m=f_{m-1}+T(x;\Theta _m)

 3) 得到迴歸問題提升樹

                                                f_M(x)=\sum _{m=1}^MT(x;\Theta _m)

在《統計學習演算法》書上p149頁給出了一個具體的迴歸問題提升樹的例項,大家可以去看一下。

接下來講一下為什麼下一棵樹擬合的是當前模型的殘差,不是應該擬合原始資料,然後最小化損失函式嗎?

因為迴歸問題提升樹是加法模型,在使用前向分佈演算法擬合數據時,我可以把前幾步具體寫出來:

                                                 f_0(x) =0

                                                 f_m(x)=f_{m-1}(x)+T(x;\Theta _m)

此時要最小化損失函式得到下一顆樹的引數\widehat{\Theta }

                                                 \widehat{\Theta }=arg\min_{\Theta _m}\sum _{i=1}^{N}L(y_i, f_{m-1}(x_i)+T(x _i;\Theta _m))

因為使用的是平方誤差損失函式,所以就有:

                                               L(y,f_{m-1}+T(x;\Theta ))=(y-f_{m-1}(x)-T(x;\Theta ))^2

y-f_{m-1}}(x)正是當前模型的殘差r, 就可以得到:

                                                     L(y,f_{m-1}+T(x;\Theta ))=(r-T(x;\Theta _m))^2

因為迴歸樹的損失函式也是MSE,所以(r-T(x;\Theta _m))^2  正好是迴歸樹的損失函式,只是說 r 就充當了原本 y 的位置,所以下一棵樹擬合的是當前模型的殘差。也就是擬合數據集T=\{(x_1,r_1),(x_2,r_2),...,(x_n,r_n)\}

迴歸問題提升樹和GBDT也有聯絡。首先,都用的是CART迴歸樹;其次,因為GBDT下一棵樹擬合的是損失函式在當前模型的負梯度,而回歸問題提升樹的損失函式為MSE,而該損失函式的梯度就是殘差。所以迴歸問題提升樹可以看做是損失函式為MSE的GBDT.

GBDT的解釋請看下一篇

參考書籍:李航《統計學習方法》