机器学习-集成学习-梯度提升决策树(GBDT)
目錄
1. GBDT算法的過程
1.1 Boosting思想
1.2 GBDT原理?
需要多少顆樹
2. 梯度提升和梯度下降的區(qū)別和聯(lián)系是什么?
3.?GBDT的優(yōu)點和局限性有哪些?
3.1 優(yōu)點
3.2 局限性
4. RF(隨機森林)與GBDT之間的區(qū)別與聯(lián)系
5. GBDT與XGBoost之間的區(qū)別與聯(lián)系
6. 代碼實現(xiàn)?
1. GBDT算法的過程
GBDT(Gradient Boosting Decision Tree),全名叫梯度提升決策樹,或GBRT(Gradient Boosting Regressor?Tree)梯度提升回歸樹,使用的是Boosting(提升)的思想。
1.1 Boosting思想
提升樹(Boosting Tree)是以分類樹或者回歸樹位基本分類器到提升方法,提升樹被認為是統(tǒng)計學(xué)習(xí)中性能最好的方法之一
Boosting方法訓(xùn)練基分類器時采用串行的方式,各個基分類器之間有依賴。它的基本思路是將基分類器層層疊加,每一層在訓(xùn)練的時候,對前一層基分類器分錯的樣本,給予更高的權(quán)重(Ada Boosting),或者讓新的預(yù)測器對前一個預(yù)測器到殘差進行擬合(GBDT)。預(yù)測時,根據(jù)各層分類器的結(jié)果的加權(quán)得到最終結(jié)果。
Bagging與Boosting的串行訓(xùn)練方式不同,Bagging方法在訓(xùn)練過程中,各基分類器之間無強依賴,可以進行并行訓(xùn)練。
1.2 GBDT原理?
GBDT的原理很簡單,首先,在訓(xùn)練集上擬合一個DecisonTreeRegressor;
from sklearn.tree import DecisionTreeRegressortree_reg1 = DecisionTreeRegressor(max_depth=2, random_state=42) tree_reg1.fit(X, y)然后針對第一個預(yù)測器到殘差,訓(xùn)練第二個DecisonTreeRegressor;
y2 = y - tree_reg1.predict(X) tree_reg2 = DecisionTreeRegressor(max_depth=2, random_state=42) tree_reg2.fit(X, y2)然后針對針對第二個預(yù)測器到殘差,訓(xùn)練第三個DecisonTreeRegressor;
y3 = y2 - tree_reg2.predict(X) tree_reg3 = DecisionTreeRegressor(max_depth=2, random_state=42) tree_reg3.fit(X, y3)現(xiàn)在我們有一個包含三顆樹到機場,將這三顆樹到預(yù)測結(jié)果相加,從而對新的實例進行預(yù)測。
y_pred = tree_reg1 + tree_reg2 + tree_reg3單個預(yù)測器是弱分類器,可以通過弱分類器構(gòu)建強分類器,就是所有弱分類器的結(jié)果相加等于預(yù)測值,它里面的弱分類器的表現(xiàn)形式就是各棵樹。
下圖7-9是GBDT的一個例子,左邊表示三顆樹單獨到預(yù)測,右邊表示集成預(yù)測。第一行集成只有一顆樹,因此它的預(yù)測與第一顆樹完全相同。第二行左側(cè)是在第一顆樹殘差上訓(xùn)練的一顆新樹,由側(cè)的繼承預(yù)測則是前面兩顆樹之和。類似的,左側(cè)第三行樹又是在第二顆樹的殘差上訓(xùn)練的新樹,集成預(yù)測隨著新數(shù)的增加越來越好。
舉另外一個例子,比如我今年30歲了,但計算機或者模型GBDT并不知道我今年多少歲,那GBDT咋辦呢?
- 它會在第一個弱分類器(或第一棵樹中)隨便用一個年齡比如20歲來擬合,然后發(fā)現(xiàn)誤差有10歲;
- 接下來在第二棵樹中,用6歲去擬合剩下的損失,發(fā)現(xiàn)差距還有4歲;
- 接著在第三棵樹中用3歲擬合剩下的差距,發(fā)現(xiàn)差距只有1歲了;
- 最后在第四課樹中用1歲擬合剩下的殘差,完美。
- 最終,四棵樹的結(jié)論加起來,就是真實年齡30歲(實際工程中,gbdt是計算負梯度,用負梯度近似殘差)。
為何GBDT可以用負梯度近似殘差呢?
回歸任務(wù)下,GBDT 在每一輪的迭代時對每個樣本都會有一個預(yù)測值,此時的損失函數(shù)為均方差損失函數(shù),
那此時的負梯度是這樣計算的
所以,當(dāng)損失函數(shù)選用均方差函數(shù)時,負梯度就是殘差。
訓(xùn)練過程
簡單起見,假定訓(xùn)練集只有4個人:A,B,C,D,他們的年齡分別是14,16,24,26。其中A、B分別是高一和高三學(xué)生;C,D分別是應(yīng)屆畢業(yè)生和工作兩年的員工。如果是用一棵傳統(tǒng)的回歸決策樹來訓(xùn)練,會得到如下圖所示結(jié)果:
?現(xiàn)在我們使用GBDT來做這件事,由于數(shù)據(jù)太少,我們限定葉子節(jié)點做多有兩個,即每棵樹都只有一個分枝,并且限定只學(xué)兩棵樹。我們會得到如下圖所示結(jié)果:
在第一棵樹分枝和圖1一樣,由于A,B年齡較為相近,C,D年齡較為相近,他們被分為左右兩撥,每撥用平均年齡作為預(yù)測值。
- 此時計算殘差(殘差的意思就是:A的實際值 - A的預(yù)測值 = A的殘差),所以A的殘差就是實際值14 - 預(yù)測值15 = 殘差值-1。
- 注意,A的預(yù)測值是指前面所有樹累加的和,這里前面只有一棵樹所以直接是15,如果還有樹則需要都累加起來作為A的預(yù)測值。
然后拿它們的殘差-1、1、-1、1代替A B C D的原值,到第二棵樹去學(xué)習(xí),第二棵樹只有兩個值1和-1,直接分成兩個節(jié)點,即A和C分在左邊,B和D分在右邊,經(jīng)過計算(比如A,實際值-1 - 預(yù)測值-1 = 殘差0,比如C,實際值-1 - 預(yù)測值-1 = 0),此時所有人的殘差都是0。殘差值都為0,相當(dāng)于第二棵樹的預(yù)測值和它們的實際值相等,則只需把第二棵樹的結(jié)論累加到第一棵樹上就能得到真實年齡了,即每個人都得到了真實的預(yù)測值。
換句話說,現(xiàn)在A,B,C,D的預(yù)測值都和真實年齡一致了。Perfect!
- A: 14歲高一學(xué)生,購物較少,經(jīng)常問學(xué)長問題,預(yù)測年齡A = 15 – 1 = 14
- B: 16歲高三學(xué)生,購物較少,經(jīng)常被學(xué)弟問問題,預(yù)測年齡B = 15 + 1 = 16
- C: 24歲應(yīng)屆畢業(yè)生,購物較多,經(jīng)常問師兄問題,預(yù)測年齡C = 25 – 1 = 24
- D: 26歲工作兩年員工,購物較多,經(jīng)常被師弟問問題,預(yù)測年齡D = 25 + 1 = 26
所以,GBDT需要將多棵樹的得分累加得到最終的預(yù)測得分,且每一次迭代,都在現(xiàn)有樹的基礎(chǔ)上,增加一棵樹去擬合前面樹的預(yù)測結(jié)果與真實值之間的殘差。
需要多少顆樹
樹的數(shù)目太少了容易擬合不足,數(shù)量太大容易過擬合。要尋找樹的最佳數(shù)量,可以使用早期停止法。實現(xiàn)方法是使用staged_predict()方法:在訓(xùn)練的每個階段(一棵樹時、兩顆樹時,等等)對集成預(yù)測返回一個迭代器,然后測量每個階段的驗證集誤差,當(dāng)連續(xù)5次迭代未改善時,當(dāng)前的樹都數(shù)量就是一個合適的數(shù)量。
import numpy as np from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_errorX_train, X_val, y_train, y_val = train_test_split(X, y, random_state=49)gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=120, random_state=42) gbrt.fit(X_train, y_train)errors = [mean_squared_error(y_val, y_pred)for y_pred in gbrt.staged_predict(X_val)] bst_n_estimators = np.argmin(errors) + 1gbrt_best = GradientBoostingRegressor(max_depth=2, n_estimators=bst_n_estimators, random_state=42) gbrt_best.fit(X_train, y_train)?下圖為訓(xùn)練120顆樹驗證集誤差隨著樹數(shù)量的變化,從誤差上可以找到樹的最佳數(shù)量。
2. 梯度提升和梯度下降的區(qū)別和聯(lián)系是什么?
兩者都是在每 一輪迭代中,利用損失函數(shù)相對于模型的負梯度方向的信息來對當(dāng)前模型進行更 新,只不過在梯度下降中,模型是以參數(shù)化形式表示,從而通過對參數(shù)的更新來對模型進行更新的。而在梯度提升中,模型并不需要進行參數(shù)化表示,而是直接定義在函數(shù)空間中,是通過增加模型來對集成模型進行更新。
3.?GBDT的優(yōu)點和局限性有哪些?
3.1 優(yōu)點
3.2 局限性
4. RF(隨機森林)與GBDT之間的區(qū)別與聯(lián)系
相同點:
都是由多棵樹組成,最終的結(jié)果都是由多棵樹一起決定。
不同點:?
1. 從模型框架上看,隨機森林是bagging,樹可以并行生成,而GBDT是boosting,串行生成
2. 從偏差分解的角度來看,隨機森林是減少模型的方差,而GBDT是減少模型的偏差
3. 從模型的訓(xùn)練要求上?
- 組成隨機森林的樹可以分類樹也可以是回歸樹,而GBDT只由回歸樹組成
- 隨機森林的結(jié)果是多數(shù)表決表決的,而GBDT則是多棵樹累加之和
- 隨機森林對異常值不敏感,而GBDT對異常值比較敏感
- 隨機森林不需要進行特征歸一化。而GBDT則需要進行特征歸一化
5. GBDT與XGBoost之間的區(qū)別與聯(lián)系
XGBoost全名eXtreme Gradient Boosting,在數(shù)據(jù)競賽中風(fēng)靡一時/披荊斬棘,它源于梯度提升框架,但是更加高效,秘訣就在算法能并行計算、近似建樹、對稀疏數(shù)據(jù)的有效處理以及內(nèi)存使用優(yōu)化,這使得XGBoost至少比現(xiàn)有梯度提升算法有10倍的速度提升。
也使用與提升樹相同的前向分步算法,其區(qū)別在于:Xgboost通過結(jié)構(gòu)風(fēng)險最小化來確定下一個決策樹的參數(shù) ,主要區(qū)別:
1. 傳統(tǒng)GBDT在優(yōu)化時只用到一階導(dǎo)數(shù)信息,xgboost則對代價函數(shù)進行了二階泰勒展開,同時用到了一階和二階導(dǎo)數(shù)。順便提一下,xgboost工具支持自定義代價函數(shù),只要函數(shù)可一階和二階求導(dǎo)。例如,xgboost支持線性分類器,這個時候xgboost相當(dāng)于帶L1和L2正則化項的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)
2. xgboost在代價函數(shù)里加入了正則項,用于控制模型的復(fù)雜度。正則項里包含了樹的葉子節(jié)點個數(shù)、每個葉子節(jié)點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型的variance,使學(xué)習(xí)出來的模型更加簡單,防止過擬合,這也是xgboost優(yōu)于傳統(tǒng)GBDT的一個特性。
3.?列抽樣(column subsampling)。xgboost借鑒了隨機森林的做法,支持列抽樣(即每次的輸入特征不是全部特征),不僅能降低過擬合,還能減少計算,這也是xgboost異于傳統(tǒng)gbdt的一個特性。
4.?并行化處理:在訓(xùn)練之前,預(yù)先對每個特征內(nèi)部進行了排序找出候選切割點,然后保存為block結(jié)構(gòu),后面的迭代中重復(fù)地使用這個結(jié)構(gòu),大大減小計算量。在進行節(jié)點的分裂時,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計算就可以開多線程進行,即在不同的特征屬性上采用多線程并行方式尋找最佳分割點。
6. 代碼實現(xiàn)?
GitHub:ML-NLP/GBDT_demo.ipynb at master · NLP-LOVE/ML-NLP · GitHub
內(nèi)容整理自
1. ML-NLP/Machine Learning/3.2 GBDT at master · NLP-LOVE/ML-NLP · GitHub
機器學(xué)習(xí)算法中 GBDT 和 XGBOOST 的區(qū)別有哪些? - 知乎https://www.zhihu.com/question/413543923. Aurelien Geron.?Hands-On Machine Learning with Scikit-Learn and TensorFlow
4.?GBT、GBDT、GBRT與Xgboost - 知乎https://zhuanlan.zhihu.com/p/57814935
總結(jié)
以上是生活随笔為你收集整理的机器学习-集成学习-梯度提升决策树(GBDT)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习-集成学习:随机森林(Rando
- 下一篇: 最便宜的第二代骁龙7+手机!真我GT N