科學也可以如此靠近

從頭了解Gradient Boosting算法

6月
13
2018

2018年6月13日14時 今日科學 雲棲社區

雲棲社區

目的

雖然大多數Kaggle競賽獲勝者使用各種模型的疊加/集合,但是一個特定的模式是大部分集合的部分是梯度提升(GBM)算法的一些變體。以最新的Kaggle比賽獲勝者為例:Michael Jahrer的解決方案是在安全駕駛的預測中的表示學習。他的解決方案是6個模型的混合。1

個LightGBM(GBM的變體)和5個神經網絡。雖然他的成功歸因於他為結構化數據發明的新的半監督學習,但梯度提升模型也發揮了作用。

儘管GBM被廣泛使用,許多從業人員仍然將其視為複雜的黑盒算法,只是使用預建的庫運行模型。這篇文章的目的是為了簡化所謂複雜的算法,並幫助讀者直觀地理解算法。我將解釋基本版本的梯度提升算法,並將在最後分享其不同的變體的連結。我已經從fast.ai庫(fastai/courses/ml1/lesson3-rf_foundations.ipynb)取得了基本的DecisionTree代碼,最重要的是,我建立了自己的簡單版本的基本梯度提升模型。

關於Ensemble, Bagging 和 Boosting

的簡要描述

當我們試圖用任何機器學習技術來預測目標變量時,實際值和預測值的主要差異是噪聲,方差和偏差。集成有助於減少這些因素。

一個集合只是一個匯集在一起(例如所有預測的平均值)來作出最終預測的預測器集合。我們使用集成的原因是許多不同的預測變量試圖預測相同的目標變量將比任何單一的預測器完成的更好。集成技術進一步分為Bagging和Boosting。

Bagging是一個簡單的集成技術,我們建立許多獨立的預測變量/模型/學習者,並使用一些模型平均技術將它們結合起來。(例如加權平均數,多數票或正態平均數)。

我們通常對每個模型採用隨機的子樣本/bootstrap數據,因此所有模型彼此之間幾乎沒有差別。每個觀察結果在所有模型中出現的機率相同。因為這種技術需要許多不相關的學習者做出最終的模型,所以通過減少方差來減少錯誤。Bagging集成的例子是隨機森林模型。

Boosting是一種集成技術,其中預測變量不是獨立的,而是按順序進行的。

這種技術使用了後面的預測變量從之前的預測變量的錯誤中學習的邏輯。因此,觀測值在後續模型中出現的機率是不相同的,而誤差最大的出現最頻繁。預測變量可以從一系列模型中選擇,如決策樹,回歸量,分類器等等。因為新的預測變量是從以前的預測變量所犯的錯誤中學習的,所以需要更少的時間/次數來接近實際的預測。但是我們必須慎重選擇停機判據,否則可能導致訓練數據過度擬合。梯度提升是Boosting算法的一個例子。

圖1.集成

圖2. Bagging (獨立模式) 和 Boosting (順序模式).

參考:https://quantdare.com/what-is-the-ding-between-bagging-and-boosting /

梯度提升算法

在維基百科的定義中,梯度提升是一種用於回歸和分類問題的機器學習技術,它以弱預測模型(通常是決策樹)的集合的形式產生預測模型。

任何監督學習算法的目標是定義一個損失函數,並將其最小化。讓我們看看梯度提升算法的數學運算。假設我們將均方根誤差(MSE)定義為:

我們希望我們的預測,使我們的損失函數(MSE)最小。
通過使用梯度下降和基於學習速率更新我們的預測,我們可以找到MSE最小的值。

所以,我們基本上是更新預測,使我們的殘差總和接近0(或最小),預測值足夠接近實際值。

梯度提升背後的直覺

梯度提升背後的邏輯很簡單,(可以直觀地理解,不使用數學符號)。
我期望任何閱讀這篇文章的人都可以熟悉簡單的線性回歸模型。

線性回歸的一個基本假設是其殘差之和為0,即殘差應該在0左右隨機分布。

圖3.抽樣隨機正態分布殘差均值在0附近

現在把這些殘差看作我們的預測模型所犯的錯誤。雖然基於樹的模型(把決策樹當作我們梯度提升的基本模型)並不是基於這樣的假設,但是如果我們從邏輯上(而不是統計上)考慮這個假設,那麼我們可能證明,如果我們能夠看到一些殘差在0左右的模式,我們可以利用這種模式來擬合模型。

因此,梯度提升算法的直覺就是反覆利用殘差模式,加強預測能力較弱的模型,使其更好。
一旦我們達到殘差沒有任何模式可以建模的階段,我們可以停止建模殘差(否則可能導致過度擬合)。
在算法上,我們正在最小化我們的損失函數,使得測試損失達到最小值。

綜上所述,

我們首先用簡單的模型對數據進行建模,並分析錯誤的數據。

這些錯誤通過一個簡單的模型來表示數據點是很難的。

那麼對於以後的模型,我們特別關注那些難以處理的數據,以使它們正確。

最後,我們通過給每個預測變量賦予一些權重來組合所有的預測變量。

關於同一邏輯的更為技術性的引用寫在Probably Approximately Correct: Nature’s Algorithms for Learning and Prospering in a Complex World,「這個想法是多次使用弱的學習方法來獲得連續的假設,每一個調整的例子是以往發現困難和錯誤分類的。但是,請注意,能做到這一點並不明顯」。

擬合梯度提升模型的步驟

讓我們思考下面的散點圖中顯示的模擬數據,其中1個輸入(x)和1個輸出(y)變量。

圖4.模擬數據(x:輸入,y:輸出)

上面顯示的圖的數據是使用下面的python代碼生成的:

1、對數據擬合一個簡單的線性回歸或決策樹(我在我的代碼中選擇了決策樹)<將x作為輸入,將y作為輸出>

2、計算誤差殘差。實際目標值減去預測目標值

3、將誤差殘差的新模型作為具有相同輸入變量的目標變量<稱為e1_predicted>

4、將預測的殘差添加到先前的預測中

5、在剩餘的殘差上擬合另一個模型。即並重複步驟2到5,直到它開始過擬合或殘差總和變成恆定。過度擬合可以通過持續檢查驗證數據的準確性來控制。

為了幫助理解基本概念,下面是從零開始完整實現簡單梯度提升模型的連結。

https://www.kaggle.com/grroverpr/gradient-boosting-simplified/?spm=5176.100239.blogcont304535.17.OodOmp

共享代碼是一種非優化的梯度提升的普通實現。庫中的大多數梯度提升模型都經過了很好的優化,並且有很多超參數。

工作梯度提升樹的可視化

藍點(左)是輸入(x)與輸出(y)的關係•紅線(左)顯示由決策樹預測的值•綠點(右)顯示第i次疊代的殘差與輸入(x)•疊代表示擬合梯度提升樹的順序。

圖5.梯度提升預測的可視化(前4次疊代)

圖6.梯度提升預測的可視化(第18次至第20次疊代)

我們觀察到,在第20次疊代之後,殘差在0附近是隨機分布的(我並不是說隨機的正態分布),我們的預測非常接近真實值。(疊代在sklearn實現中被稱為n_estimators)。這將是一個很好的點來停止或開始過度擬合模型。

讓我們看看我們的模型在第五十次疊代中的樣子。

我們可以看到,即使在第50次疊代之後,殘差對x的曲線看起來也與我們在第20次疊代中看到的相似。
但是,模型變得越來越複雜,預測過度的訓練數據,並試圖學習每個訓練數據。
所以,最好是停止在第20次疊代。

用於繪製所有上述數據的Python代碼片段:

更多有用的資源

1.我的github repo和關於從頭開始GBM的kaggle核心連結:

https://github.com/groverpr/Intro-to-Machine-Learning/blob/master/algo_scratch/gradient%20boosting%20from%20scratch.ipynb

2.關於從頭開始決策樹的Fast.ai github repo連結(Massive

ML / DL相關資源):

3. Alexander Ihler的視頻。這個視頻真的幫助我了理解梯度提升算法。

5.廣泛使用的GBM算法:

XGBoost || Lightgbm|| Catboost ||

sklearn.ensemble.GradientBoostingClassiber

作者及譯者信息

Prince Grover,南佛羅里達大學數據科學碩士學生,Manifold.ai數據科學實習生。

本文由阿里云云棲社區組織翻譯。文章原標題《Gradient Boosting from scratch》作者:Prince Grover 譯者:董昭男 審核:海棠

往期精彩文章

-END-

雲棲社區

ID:yunqiinsight

雲計算丨網際網路架構丨大數據丨機器學習丨運維


延伸閱讀

外星蟲子可能已來到地球?研究:星際塵埃是微生物的

英媒:世界越來越「亮」 科學家認為這未必是件好事

史上最大冰山正融化入海!NASA專家乘飛機航拍,

香格里拉天外來物1克20萬!專家1句話吐血

來自星星的鐵?埃及法老的匕首材料竟源自太空?


熱門內容

友善連結