作者:Prince Grover
編譯:ronghuaiyang
簡化複雜的算法
儘管大多數的Kaggle競賽的獲勝者使用了多個模型的集成,這些集成的模型中,有一個必定是各種變體的梯度提升算法。舉個例子,Kaggle競賽: Safe Driver Prediction:https://www.kaggle.com/c/porto-seguro-safe-driver-prediction/discussion/44629#250927,Michael Jahrer的方案,使用了表示學習,使用了6個模型的綜合。1個LightGBM和5個神經網絡。儘管他的成功歸功他使用了結構化的數據進行了半監督學習,梯度提升算法也實現了非常重要的部分。
儘管GBM使用的非常廣泛,許多使用者仍然把這個東西當做一個黑盒子算法,只是使用預編譯好的庫跑一跑。寫這篇文章的目的是簡化複雜的算法,幫助讀者可以直觀的理解算法。我會解釋原汁原味的梯度提升算法,然後分享一些變種的連結。我基於fast.ai的庫做了一個決策樹的代碼,然後構建了一個自己的簡單的基礎的梯度提升模型。
當我們使用一個機器學習技術來預測目標變量的時候,造成實際值和預測值之間的差別的原因有噪聲,方差和偏差。集成方法能夠幫助減少這些因素(除了噪聲,不可約誤差)。
Ensemble是幾個預測器在一起(比如求平均),給出一個最終的結果。使用ensemble的原因是許多不同的預測器預測同一個目標會比單個預測器的效果要好。Ensemble技術又可以分成Bagging和Boosting。
我們為每個模型使用隨機抽樣,所以每個模型都不太一樣。每個模型的輸入使用有放回的抽樣,所以模型的訓練樣本各不相同。因為這個技術使用了許多個不相關的學習器來進行最終的預測,它通過減少方差來減小誤差。bagging的一個例子是隨機森林模型。
這個技術使用了這樣的邏輯,後面的預測器學習的是前面的預測器的誤差。因此,觀測數據出現在後面模型中的機率是不一樣的,誤差越大,出現的機率越高。(所以觀測數據不是基於隨機又放回抽樣bootstrap的方式,而是基於誤差)。預測器可以從決策樹,回歸器,分類器中選取。因為新的預測器是從前面的預測器的誤差中學習的,接近實際的預測只需要更少的時間和疊代次數。但是我們不得不選擇嚴格的停止策略,否則可能會出現過擬合。梯度提升算法就是提升算法的一個例子。
Fig 1. Ensembling
Fig 2. Bagging
梯度提升是一個機器學習技術,用來做回歸和分類的問題,通過組合弱預測模型如決策樹,來得到一個強預測模型。(維基百科定義)
監督學習算法的目標是定義一個損失函數,然後最小化它。我們來看看,數學上梯度提升算法是怎麼工作的。比如我們使用均方誤差(MSE)作為損失函數:
我們希望我們的預測讓我們的損失函數最小。通過使用梯度提升算法,基於一個學習率來更新我們的預測,我們會發現一個讓MSE最小的值。
所以,我們基本上是在更新預測,讓殘差的和接近於0(或者最小),這樣預測的值就和實際的值足夠的接近了。
梯度提升背後的直覺
梯度提升背後的邏輯很簡單,(可以很直觀的理解,不用數據公式)。我希望讀這篇文章的人能夠熟悉一下簡單的線性回歸模型。
線性回歸模型的一個基本的假設是殘差是0,也就是說,參數應該在0的周圍分散。
現在,把這些殘差作為誤差提交到我們的預測模型中。儘管,基於樹的模型(將決策樹作為梯度提升的基礎模型)不是基於這個假設,但是如果我們對這個假設進行邏輯思考,我們也許能提出,如果我們能發現在0的周圍的殘差一些模式,我們可以利用這個模式來擬合模型。
所以,梯度提升背後的直覺就是重複的利用殘差中的模式利用弱預測器來加強模型,讓模型變得更好。一旦我們到了一個階段,殘差不具有任何的模式,無法進行建模,我們就可以停止了(否則會導致過擬合)。從算法的角度講,我們在最小化損失函數,直到測試損失達到最小。
總結一下:
擬合梯度提升模型的步驟
我們來模擬一些數據,如下面的散點圖所示,一個輸入,一個輸出。
上面的數據是通過下面的python代碼生成的。
1. 擬合一個簡單的線性回歸模型或者決策樹模型(在我的代碼中選擇了決策樹)[x作為輸入,y作為輸出]
2.計算誤差,實際的目標值,最小化預測目標值 [e1= y - y_predicted1 ]3.把誤差作為目標值,擬合新的模型,使用同樣的輸入數據[叫做e1_predicted]4. 將預測的誤差加到之前的預測之中[y_predicted2 = y_predicted1 + e1_predicted]5. 在剩下的殘差上擬合另一個模型, [e2 = y - y_predicted2],重複第2到第5步,直到開始過擬合,或者殘差的和開始不怎麼變換。過擬合可以通過驗證數據上的準確率來發現。
為了幫助理解劃線部分的概念,這裡有個連結,有完整的梯度提升模型的實現 [[Link: Gradient Boosting from scratch]](https://www.kaggle.com/grroverpr/gradient-boosting-simplified/)。
梯度提升樹的可視化工作
藍色的點(左邊)是輸入(x),紅色的線(左邊)是輸出(y)顯示了決策樹的預測值,綠色的點(右邊)顯示了第i次疊代的殘差vs.輸入(x),疊代表示擬合梯度提升樹的了序列的順序。
Fig 5. 梯度提升可視化(前4個疊代)
Fig 6. 梯度提升可視化(18到20個疊代)
我們發現過了20個疊代,殘差變成了0附近的隨機分布(我不會說是隨機正態分布),我們的預測也非常接近於實際值。這時可以停止訓練模型了,否則要開始過擬合了。
我們來看看,50個疊代之後的樣子:
Fig 7. 梯度提升可視化(第50個疊代)
我們發現,即使是50個疊代之後,殘差vs. x的圖和我們看到的20個疊代的圖也沒太大區別。但是模型正在變的越來越複雜,預測結果在訓練數據上出現了過擬合。所以,最好是在20個疊代的時候就停止。
用來畫圖的python代碼。
我希望這篇可以幫助你對梯度提升算法的工作有一個基本的直覺。
原文連結:https://medium.com/mlreview/gradient-boosting-from-scratch-1e317ae4587d
請長按或掃描二維碼關注本公眾號