GBDT算法梳理

1、前向分佈算法

加法模型

加法模型公式:html

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

其中,b爲基函數,\gamma爲基函數參數,\beta爲基函數係數, 表示該項函數在加法模型中的重要性node

前向分步算法

在給定訓練數據和損失函數L(y,f(x))的條件下,學習加法模型成爲經驗風險極小化 (即損失函數極小化問題)  算法

即最小化每一步生成的基函數之和。 前向分步算法求解這一優化問題的想法是:因爲學習的是加法模型,若是能從前向後每一步只學習一個基函數及其係數,逐步逼近優化目標函數式。那麼能夠簡化算法複雜度,優化每一步的基分類器。 即每次只優化當前的基分類器,使其損失函數最小。
《統計學習方法》
《統計學習方法》
這樣,前向分佈算法將同時求解從m=1到M的全部參數的優化問題簡化爲逐次求解各個基分類器對應的參數問題。

負梯度擬合

大牛 Freidman 提出了用損失函數的負梯度來擬合本輪損失的近似值,進而擬合一個 CART 迴歸樹。第 t 輪的第 i 個樣本的損失函數的負梯度表示爲: dom

利用 (x_i,r_{ti})(i=1,2,..m) 咱們能夠擬合一顆 CART 迴歸樹,獲得了第 t 顆迴歸樹,其對應的葉節點區域 R_{tj},j=1,2,...,J. 其中 J 爲葉子節點的個數。   針對每個葉子節點裏的樣本,咱們求出使損失函數最小,也就是擬合葉子節點最好的的輸出值 c_{tj} 以下:
  這樣咱們就獲得了本輪的決策樹擬合函數以下:

h_t(x)=\sum\limits_{j=1}^{J}c_{tj}I(x \in R_{tj})

  從而本輪最終獲得的強學習器的表達式以下:機器學習

f_{t}(x)=f_{t-1}(x)+\sum\limits_{j=1}^{J}c_{tj}I(x\in R_{tj})

  經過損失函數的負梯度來擬合,咱們找到了一種通用的擬合損失偏差的辦法,這樣無輪是分類問題仍是迴歸問題,咱們經過其損失函數的負梯度的擬合,就能夠用 GBDT 來解決咱們的分類迴歸問題。區別僅僅在於損失函數不一樣致使的負梯度不一樣而已。函數

損失函數

不一樣問題對應的損失函數不一樣,這篇博客作了一個很好的總結。後續對應不一樣的問題會有不一樣的損失函數。 梯度提高樹 (GBDT) 原理小結學習

迴歸

二分類,多分類

二元 GBDT 分類算法

對於二元 GBDT,若是用相似於邏輯迴歸的對數似然損失函數,則損失函數爲:優化

L(y, f(x)) = log(1+ exp(-yf(x)))

其中 y \in{-1, +1}。則此時的負梯度偏差爲 spa

對於生成的決策樹,咱們各個葉子節點的最佳負梯度擬合值爲
因爲上式比較難優化,咱們通常使用近似值代替

c_{tj}=\sum\limits_{x_i \in R_{tj}}r_{ti}\bigg / \sum\limits_{x_i \in R_{tj}}|r_{ti}|(1-|r_{ti}|)

除了負梯度計算和葉子節點的最佳負梯度擬合的線性搜索,二元 GBDT 分類和 GBDT 迴歸算法過程相同。.net

多元 GBDT 分類算法

多元 GBDT 要比二元 GBDT 複雜一些,對應的是多元邏輯迴歸和二元邏輯迴歸的複雜度差異。假設類別數爲 K,則此時咱們的對數似然損失函數爲:

L(y, f(x)) = - \sum\limits_{k=1}^{K}y_klogp_k(x)

其中若是樣本輸出類別爲 k,則 y_k=1。第 k 類的機率 p_k(x) 的表達式爲:

p_k(x) = exp(f_k(x)) \bigg / \sum\limits_{l=1}^{K}exp(f_l(x))

集合上兩式,咱們能夠計算出第 t 輪的第 i 個樣本對應類別 l 的負梯度偏差爲

觀察上式能夠看出,其實這裏的偏差就是樣本 i 對應類別 l 的真實機率和 t-1 輪預測機率的差值。 對於生成的決策樹,咱們各個葉子節點的最佳負梯度擬合值爲
上式比較難優化,咱們可使用近似值代替

c_{tj} = \frac{K-1}{K} \quad \frac{\sum\limits_{x_i \in R_{tjl}}r_{til}}{\sum\limits_{x_i \in R_{til}}|r_{til}|(1-|r_{til}|)}

除了負梯度計算和葉子節點的最佳負梯度擬合的線性搜索,多元 GBDT 分類和二元 GBDT 分類以及 GBDT 迴歸算法過程相同。

正則化

和 Adaboost 同樣,咱們也須要對 GBDT 進行正則化,防止過擬合。GBDT 的正則化主要有三種方式。

• 第一種是和 Adaboost 相似的正則化項,即步長 (learning rate)。定義爲 \nu, 對於前面的弱學習器的迭代

f_{k}(x) = f_{k-1}(x) + h_k(x)

若是咱們加上了正則化項,則有

f_{k}(x) = f_{k-1}(x) + \nu h_k(x)

\nu 的取值範圍爲 0\le \nu \le 1。對於一樣的訓練集學習效果,較小的 \nu 意味着咱們須要更多的弱學習器的迭代次數。一般咱們用步長和迭代最大次數一塊兒來決定算法的擬合效果。

• 第二種正則化的方式是經過子採樣比例(subsample)。取值爲 (0,1]。注意這裏的子採樣和隨機森林不同,隨機森林使用的是放回抽樣,而這裏是不放回抽樣。若是取值爲 1,則所有樣本都使用,等於沒有使用子採樣。若是取值小於 1,則只有一部分樣本會去作 GBDT 的決策樹擬合。選擇小於 1 的比例能夠減小方差,即防止過擬合,可是會增長樣本擬合的誤差,所以取值不能過低。推薦在0.5, 0.8 之間。 使用了子採樣的 GBDT 有時也稱做隨機梯度提高樹(Stochastic Gradient Boosting Tree, SGBT)。因爲使用了子採樣,程序能夠經過採樣分發到不一樣的任務去作 boosting 的迭代過程,最後造成新樹,從而減小弱學習器難以並行學習的弱點。

• 第三種是對於弱學習器即 CART 迴歸樹進行正則化剪枝。

優缺點

優勢

  • 能夠靈活處理各類類型的數據,包括連續值和離散值。
  • 在相對少的調參時間狀況下,預測的準確率也能夠比較高。這個是相對 SVM 來講的。
  • 使用一些健壯的損失函數,對異常值的魯棒性很是強。好比 Huber 損失函數和 Quantile 損失函數。

缺點

  • 因爲弱學習器之間存在依賴關係,難以並行訓練數據。不過能夠經過自採樣的 SGBT 來達到部分並行。

sklearn參數

class sklearn.ensemble.GradientBoostingClassifier(loss='deviance', learning_rate=0.1, n_estimators=100, subsample=1.0, criterion='friedman_mse', min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_depth=3, min_impurity_decrease=0.0, min_impurity_split=None, init=None, random_state=None, max_features=None, verbose=0, max_leaf_nodes=None, warm_start=False, presort='auto', validation_fraction=0.1, n_iter_no_change=None, tol=0.0001)[source]¶
複製代碼

幾個主要參數:

  • loss : {‘deviance’, ‘exponential’}, optional (default=’deviance’) loss function to be optimized. ‘deviance’ refers to deviance (= logistic regression) for classification with probabilistic outputs. For loss ‘exponential’ gradient boosting recovers the AdaBoost algorithm. 損失函數
  • learning_rate: 學習率
  • n_estimators: int (default=100)弱學習器的個數

應用場景

因爲缺少這方面的經驗,故此部分不做贅述。 查到了一篇文章: GBDT 入門教程之原理、所解決的問題、應用場景講解


參考

  1.  【機器學習】集成學習 (三)---- 前向分步算法、提高樹與 GBDT
  2. GBDT 算法詳解
相關文章
相關標籤/搜索