【機器學習】 前向分佈算法與GBDT算法梳理

1.前向分佈算法

 基本思想:每次只學習一個基函數及係數,逐步逼近最優解。

如下所示:

其中  爲基函數,\beta_m爲基函數係數,\gamma _{m}爲基函數的參數,這樣只需要給定訓練集D與損失函數L\left ( y,f\left ( x \right ) \right )

就可以利用最小化損失函數的原理進行學習,這樣每次新一輪的學習只需要學習一個基函數的參數\gamma _{m}與對應的係數\beta_m

一個栗子:小明有100個蘋果,小紅第一次猜1*50個,剩餘50個沒猜對(殘差),下一次小紅猜有1*50 + 2*10個,殘差30,如此反覆下去,小紅會逐漸向正確答案靠攏。其中第一二次中的1*50和2*10中的1,2就相當於係數\beta_m,50和10可以理解爲\gamma _{m}

2.負梯度擬合與迴歸

顧名思義,就是在損失函數梯度的負方向上進行學習,至於是怎麼在負梯度方向上學習的呢?下面搬運的是臺大Hsuan-Tien Lin教授所講的梯度提升視頻裏面的內容,我覺得相對容易理解一些。

這是上文所提到的最小化所示函數的過程。這裏先看基函數h\left ( x_n\right )的學習過程(以平方損失函數爲例):

這裏的s\left ( n \right )看做一個項,根據泰勒展開可得:

這裏的\sum_{n=1}^N err\left ( s_n,y_n \right )爲常數,那麼要求h\left ( x_n\right )的方向的話,只需要求上式子中\left ( s_n-y_n \right )負方向即可。到此,梯度方向的問題解決了,那麼h\left ( x_n\right )要怎麼求得呢?

我們知道,h\left ( x_n\right )的大小我們並不介意,因爲後面我們要給它一個係數也就是上式中的\eta去調整它。所以,我們希望它小一點,但是方向是對的就可以。所以可以在優化過程中添加一個損失項\left ( h\left ( x_n\right )\right )^{2},那麼上式就變成:

通過變換,可以發現我們最終只需要將h\left ( x_n\right )設置爲一個對殘差\left ( y_n-s_n \right )的迴歸即可。我理解爲,這是一種正則化的方式。接下來需要調整\eta,確定一個合適的步長。在找到合適的g_t=h\left ( x_n\right ),上面式子可以轉化成

可以看到,這個又是一個迴歸問題,只不過這個迴歸是單變量線性迴歸。以上就是負梯度擬合的過程

在GBDT中,這裏設置一個迴歸樹對殘差進行擬合,然後對該樹的各葉子節點區域分別給定一個最優的“局部殘差”,繼而更新強學習器。

3.正則化

GBDT正則化主要有三種方法。

(1)對樣本設置採樣比例,可以減小方差,但是採樣率太小回增大bias

(2)添加learning rate

(3)對子樹進行正則化剪枝

4.二分類、多分類問題

在參考【2】中有詳細介紹,後期會繼續學習、搬運過來

5.優缺點

優點:

  1. 精度高
  2. 能處理非線性數據
  3. 能處理多特徵類型
  4. 適合低維稠密數據

缺點:

  1. 不好並行處理(因爲上下兩顆樹有聯繫)
  2. 多分類的時候 複雜度很大

6.sklearn參數

              1) n_estimators: 也就是弱學習器的最大迭代次數,或者說最大的弱學習器的個數。

    2) learning_rate: 即每個弱學習器的權重縮減係數νν,也稱作步長,默認是1。

    3) subsample: 即我們在原理篇的正則化章節講到的子採樣,取值爲(0,1]。默認是1.0,即不使用子採樣。

    4) init: 即我們的初始化的時候的弱學習器,一般用在我們對數據有先驗知識,或者之前做過一些擬合的時候,如果沒有的話就不用管這個參數了。

    5) loss: 即我們GBDT算法中的損失函數。分類模型和迴歸模型的損失函數是不一樣的。

      對於分類模型,有對數似然損失函數"deviance"和指數損失函數"exponential"兩者輸入選擇。默認是對數似然損失函數"deviance"。在原理篇中對這些分類損失函數有詳細的介紹。一般來說,推薦使用默認的"deviance"。它對二元分離和多元分類各自都有比較好的優化。而指數損失函數等於把我們帶到了Adaboost算法。

      對於迴歸模型,有均方差"ls", 絕對損失"lad", Huber損失"huber"和分位數損失“quantile”。默認是均方差"ls"。一般來說,如果數據的噪音點不多,用默認的均方差"ls"比較好。如果是噪音點較多,則推薦用抗噪音的損失函數"huber"。而如果我們需要對訓練集進行分段預測的時候,則採用“quantile”。

    6) alpha:這個參數只有GradientBoostingRegressor有,當我們使用Huber損失"huber"和分位數損失“quantile”時,需要指定分位數的值。默認是0.9,如果噪音點較多,可以適當降低這個分位數的值。

調參實例:

https://github.com/zzzzzzhang/Datawhale_learn/blob/master/GBDT_cla.py

參考

【1】臺大機器學習視頻

【2】https://www.cnblogs.com/pinard/p/6140514.html

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