梯度提升決策樹(Gradient Boosting Decision Tree),用於分類或回歸。


今天學習了梯度提升決策樹(Gradient Boosting Decision Tree, GBDT),准備寫點東西作為記錄。后續,我會用python 實現GBDT, 發布到我的Github上,敬請Star。

梯度提升算法是一種通用的學習算法,除了決策樹,還可以使用其它模型作為基學習器。梯度提升算法的思想是通過調整模型,讓損失函數的值不斷減小, 然后將各個模型加起來作為最終的預測模型。而梯度提升決策樹則是以決策樹為基學習器。通常,我們認為決策樹是沒有參數的模型,可以用if-else規則來表達。因此,在理解梯度提升決策樹的一個關鍵點和難點便是梯度!梯度提升體現在哪?決策樹不是沒有參數嗎,如何求梯度?這是我在學習過程中遇到的兩個問題。下面會一一解答。

首先,我們來回顧一下機器學習的基礎知識。

機器學習算法一個基礎知識是損失函數(loss function),損失函數用於指導模型的訓練。

其中的\(f\)就是我們的模型,梯度提升算法就是根據損失函數對模型的一階導數(梯度)來對模型進行更新。什么,可以對模型求導數???,等等,別急,沒有想像的那么難。

對於回歸問題,通常采用least square error (最小二乘誤差)作為損失函數。

 \(L\left(f\right) = \sum\frac{1}{2}\left(y_i - f\left(x_i\right)\right)^2\)

對函數\(f\)求導數為:

\(-\frac{\delta L\left(f\right)}{\delta f} = \sum\left(y_i - f\left(x_i\right)\right)\)

於是,當函數\(f\)的值往梯度方向改變一定的值時,損失函數就會減小的最快,是不是很酷?

the elements of statistic learning 一書中,在361頁的Algorithm 10.3中,步長可以算出來。不過,在實際的代碼中,我們通常會設置一個學習率,這個學習率就是步長。假設我們設置的學習率為\(lr\),那么:

\(f\left(x_{i+1}\right) = f\left(x_i\right) + lr * \left(y_i - f\left(x_i\right)\right)\)

一個比較騷的操作時,不用上面的方式來更新函數值。而是先用一顆決策樹來擬合上面的梯度,然后用決策樹的預測值來替代上面的梯度,進行函數值的更新。

\(f\left(x_{i+1}\right) = f\left(x_i\right) + lr * tree\left(x_i\right)\)

為什么不直接使用計算出來的梯度值呢? 為了防止過擬合, 提高模型的范化能力。

算法的整體流程圖如下(摘自《the elements of statistic learning》):

需要注意的是,在代碼實現的時候,並沒有執行步驟(c), 取而代之的是設置的常量學習率。

好了,GBDT部分暫時就到這里了。如果有不懂的地方,歡迎留言提問。

結合前面提到的那本書看,另外還有我放到Github上面的代碼看,學習效果會比較好。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM