2 提高樹¶
關於提高樹,咱們能夠從字面上進行理解,能夠認爲提高樹就是一種以決策樹做爲基學習算法的一種提高學習算法,能夠用來解決分類問題,也能夠用於解決迴歸問題。當用於分類問題時,提高樹算法只需將AdaBoost算法中的基本學習器限制爲二類分類樹便可,能夠說這時的提高樹算法是AdaBoost算法的特殊狀況,本文再也不細述,且本文主要介紹的GBDT算法不管是在分類問題中仍是迴歸問題彙總,都是從迴歸提高樹的優化而來,因此下面敘述內容主要以迴歸提高樹爲主。
提高樹模型能夠看作是使用加法模型對決策樹的線性組合: $${f_M}(x) = \sum\limits_{m = 1}^M {T(x;{\Theta _m})} \tag {1}$$ 式中,${f_M}(x)$是提高樹的數學模型,$M$表示決策樹的數量,${T(x;{\Theta _m})}$表示第$m$棵決策樹,${{\Theta _m}}$表示決策樹的參數。對於參數${{\Theta _m}}$的集合$\Theta = \{ {\Theta _1},{\Theta _2}, \cdots ,{\Theta _M}\} $,咱們選取的準則是對於集合$D = \{ ({x_1},{y_1}),({x_2},{y_2}), \cdots ,({x_N},{y_N})\} $使得損失函數$\sum {L\left( {{y_i},{f_M}({x_i})} \right)} $最小化,即: $$\arg \mathop {\min }\limits_\Theta \sum\limits_{i = 1}^N {L\left( {{y_i},{f_M}({x_i})} \right)} = \arg \mathop {\min }\limits_\Theta \sum\limits_{i = 1}^N {L\left( {{y_i},\sum\limits_{m = 1}^M {T(x_i;{\Theta _m})} } \right)} \tag {2}$$ 在前面介紹Adaboost算法博文中,咱們說過,提高學習系列算法採用前向分步算法來迭代訓練個體學習器,提高樹固然也不例外,因此提高樹的迭代訓練過程能夠表示爲: $${f_m}(x) = {f_{m - 1}}(x) + T(x;{\Theta _m}),m = 1,2, \cdots ,M \tag {3}$$ 在這個迭代訓練過程當中,每一次迭代都訓練完成一顆新的決策樹${T(x;{\Theta _m})}$,在這一過程當中,也必須知足整體損失函數最小化,也就是說,對於第$m$次迭代所肯定的決策樹${T(x;{\Theta _m})}$的參數${{\Theta _m}}$有: $${{\hat \Theta }_m} = \arg \mathop {\min }\limits_\Theta \sum\limits_{i = 1}^N {L\left( {{y_i},{f_m}({x_i})} \right)} \tag {4}$$ 將式(3)代入式(4)中,有: $${{\hat \Theta }_m} = \arg \mathop {\min }\limits_\Theta \sum\limits_{i = 1}^N {L\left( {{y_i},{f_{m - 1}}({x_i}) + T({x_i};{\Theta _m})} \right)} \tag {5}$$css
在提高樹算法中,通常採用平方損失函數,因而: $$L\left( {{y_i},{f_{m - 1}}({x_i}) + T({x_i};{\Theta _m})} \right) = {\left[ {{y_i} - {f_{m - 1}}({x_i}) - T({x_i};{\Theta _m})} \right]^2} \tag {6}$$ 式(6)中,${{y_i} - {f_{m - 1}}({x_i})}$是上一輪迭代中預測值與真實值之間的誤差,這個誤差在提高樹中稱爲殘差,用${{r_{m,i}}}$表示,因而式(6)能夠表示爲: $$L\left( {{y_i},{f_{m - 1}}({x_i}) + T({x_i};{\Theta _m})} \right) = {\left[ {{r_{m,i}} - T({x_i};{\Theta _m})} \right]^2} \tag {7}$$ 這就是第$m$次迭代訓練第$m$棵決策樹時的損失函數。能夠看出,第$m$次迭代實際上是對上一次迭代的殘差進行擬合,而不是相似Adaboost算法中利用上一輪迭代中的偏差率來更新樣本權重,這就是提高樹算法與Adaboost算法的根本性區別。所以,每一次迭代結束後,提高樹算法使用訓練樣本$x_i$與當前的殘差${{r_{m,i}}}$組成新的訓練樣本集${\{ (xi,{r_{m,i}})\} _{i = 1,2, \cdots ,N}}$來做爲下一輪決策樹的訓練樣本集。
用一個例子來加深理解,假如要預測人的年齡,假設真實年齡爲30歲,第一棵決策樹預測結果爲20歲,那麼有10歲的殘差;第二棵樹對10歲的殘差進行擬合,輸出結果爲6歲,有4歲的殘差;第3棵樹繼續對4歲的殘差進行擬合……重複這個過程,知道最終的殘差在可接受範圍,最終的輸出結果是每一棵樹的預測結果之和。
總結一下提高樹的流程:
輸入:數據集$D = \{ ({x_1},{y_1}),({x_2},{y_2}), \cdots ,({x_N},{y_N})\} $
(1)初始化個體學習器${f_0}(x) = 0$;
(2)進行$M$次迭代,其中第$m$次迭代的具體過程以下:
(a)針對數據集$D$中每個樣本$(x_i,y_i)$計算殘差${r_{m,i}} = {y_i} - {f_{m - 1}}({x_i})$;
(b)利用${\{ (xi,{r_{m,i}})\} _{i = 1,2, \cdots ,N}}$來訓練一棵新的決策樹${T(x;{\Theta _m})}$;
(c)更新組合:${f_m}(x) = {f_{m - 1}}(x) + T(x;{\Theta _m})$;
(3)對$M$次迭代得到的$M$棵決策樹進行集成,獲得最終的提高樹模型:${f_M}(x) = \sum\limits_{m = 1}^M {T(x;{\Theta _m})} $。html
上述過程當中,咱們使用的是平方偏差做爲損失函數,這時候對殘差的計算會比較簡單,可是在不少狀況下,咱們可能會使用其餘的損失函數,這時候對殘差的計算就變得複雜起來。爲了更好地解決這一問題這一問題,也就有了梯度提高樹。html5