GBDT淺談以及程式碼實現
GBDT作為近年很熱門的模型,其效能非常突出,用途也是涵蓋了從特徵選擇到分類、迴歸,被廣大從業者和愛好者所使用。
網上關於gbdt的原理和數學推導已經有很多,我就談談我個人的淺見,如有錯誤還望指正。同時還附上我自己實現的簡單的python程式碼,功能比較簡單,並且效能也不高,只作為自己對模型的理解,歡迎拍磚。
從大的框架來說,主要可以分解成兩個部分:構建樹和梯度提升。GBDT中的樹一般都是CART,即分類迴歸樹,這是GBDT強大的第一個原因。分類迴歸樹能同時處理分類和迴歸問題,根據不同的問題型別,採用不同的屬性分裂準則。在實現的時候,個人覺得,如何高效地分裂屬性是需要好好考慮的。參考xgboost的實現方式,其對列進行了取樣,不僅提升了效能,也防止了過擬合。第二個強大的原因就是梯度提升,在前一顆樹的殘差基礎上進行擬合,不得不感嘆是一個非常好的思路。讓我想到了孔子的“吾日三省吾身”,也就是每次訓練完之後,就看看自己和聖人的差距有多少,然後在下一次訓練的時候儘量去彌補這個差距。當然了,前提是聖人不會再提升了,否則自己永遠也趕不上了。在具體實現的時候,如何體現“梯度提升”,如何對函式求導也是一個難點。好在在friedman的論文中,已經提供了一個比較簡便的方法,推導也在論文中給出,因此我的程式碼就參考了論文中演算法6的步驟,即對類似softmax的輸出求殘差,實現起來比較容易。
我實現的GBDT模型很簡單,都沒有加入正則化,而且分類的效能好像也不高,跑起來又費時費力,所以歡迎提出改進建議和意見。
後期有時間的話,比較想做的事是閱讀xgboost的原始碼,希望有志的人可以一起加入。
2014年kaggle的criteiro比賽第一名是幾個臺灣牛人,他們自己擼了一個gbdt,效果不錯。我們如果寫不出那麼牛逼的程式碼,那看看總行吧?把程式碼讀懂,理解了總行吧?這裡是我對他們造的gbdt程式碼解讀,寫的略微簡單了點,有些細節也沒搞的很明白,僅供參考。
對於xgboost的原始碼,網上早已有大牛解讀了,同樣也一起看下,以加深理解。