日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习-集成学习-梯度提升决策树(GBDT)

發布時間:2023/12/19 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习-集成学习-梯度提升决策树(GBDT) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

1. GBDT算法的過程

1.1 Boosting思想

1.2 GBDT原理?

需要多少顆樹

2. 梯度提升和梯度下降的區別和聯系是什么?

3.?GBDT的優點和局限性有哪些?

3.1 優點

3.2 局限性

4. RF(隨機森林)與GBDT之間的區別與聯系

5. GBDT與XGBoost之間的區別與聯系

6. 代碼實現?


1. GBDT算法的過程

GBDT(Gradient Boosting Decision Tree),全名叫梯度提升決策樹,或GBRT(Gradient Boosting Regressor?Tree)梯度提升回歸樹,使用的是Boosting(提升)的思想。

1.1 Boosting思想

提升樹(Boosting Tree)是以分類樹或者回歸樹位基本分類器到提升方法,提升樹被認為是統計學習中性能最好的方法之一

Boosting方法訓練基分類器時采用串行的方式,各個基分類器之間有依賴。它的基本思路是將基分類器層層疊加,每一層在訓練的時候,對前一層基分類器分錯的樣本,給予更高的權重(Ada Boosting),或者讓新的預測器對前一個預測器到殘差進行擬合(GBDT)。預測時,根據各層分類器的結果的加權得到最終結果。

Bagging與Boosting的串行訓練方式不同,Bagging方法在訓練過程中,各基分類器之間無強依賴,可以進行并行訓練。

1.2 GBDT原理?

GBDT的原理很簡單,首先,在訓練集上擬合一個DecisonTreeRegressor;

from sklearn.tree import DecisionTreeRegressortree_reg1 = DecisionTreeRegressor(max_depth=2, random_state=42) tree_reg1.fit(X, y)

然后針對第一個預測器到殘差,訓練第二個DecisonTreeRegressor;

y2 = y - tree_reg1.predict(X) tree_reg2 = DecisionTreeRegressor(max_depth=2, random_state=42) tree_reg2.fit(X, y2)

然后針對針對第二個預測器到殘差,訓練第三個DecisonTreeRegressor;

y3 = y2 - tree_reg2.predict(X) tree_reg3 = DecisionTreeRegressor(max_depth=2, random_state=42) tree_reg3.fit(X, y3)

現在我們有一個包含三顆樹到機場,將這三顆樹到預測結果相加,從而對新的實例進行預測。

y_pred = tree_reg1 + tree_reg2 + tree_reg3

單個預測器是弱分類器,可以通過弱分類器構建強分類器,就是所有弱分類器的結果相加等于預測值,它里面的弱分類器的表現形式就是各棵樹。

下圖7-9是GBDT的一個例子,左邊表示三顆樹單獨到預測,右邊表示集成預測。第一行集成只有一顆樹,因此它的預測與第一顆樹完全相同。第二行左側是在第一顆樹殘差上訓練的一顆新樹,由側的繼承預測則是前面兩顆樹之和。類似的,左側第三行樹又是在第二顆樹的殘差上訓練的新樹,集成預測隨著新數的增加越來越好。

舉另外一個例子,比如我今年30歲了,但計算機或者模型GBDT并不知道我今年多少歲,那GBDT咋辦呢?

  • 它會在第一個弱分類器(或第一棵樹中)隨便用一個年齡比如20歲來擬合,然后發現誤差有10歲;
  • 接下來在第二棵樹中,用6歲去擬合剩下的損失,發現差距還有4歲;
  • 接著在第三棵樹中用3歲擬合剩下的差距,發現差距只有1歲了;
  • 最后在第四課樹中用1歲擬合剩下的殘差,完美。
  • 最終,四棵樹的結論加起來,就是真實年齡30歲(實際工程中,gbdt是計算負梯度,用負梯度近似殘差)。

為何GBDT可以用負梯度近似殘差呢?

回歸任務下,GBDT 在每一輪的迭代時對每個樣本都會有一個預測值,此時的損失函數為均方差損失函數,

那此時的負梯度是這樣計算的

所以,當損失函數選用均方差函數時,負梯度就是殘差。

訓練過程

簡單起見,假定訓練集只有4個人:A,B,C,D,他們的年齡分別是14,16,24,26。其中A、B分別是高一和高三學生;C,D分別是應屆畢業生和工作兩年的員工。如果是用一棵傳統的回歸決策樹來訓練,會得到如下圖所示結果:

?現在我們使用GBDT來做這件事,由于數據太少,我們限定葉子節點做多有兩個,即每棵樹都只有一個分枝,并且限定只學兩棵樹。我們會得到如下圖所示結果:

在第一棵樹分枝和圖1一樣,由于A,B年齡較為相近,C,D年齡較為相近,他們被分為左右兩撥,每撥用平均年齡作為預測值。

  • 此時計算殘差(殘差的意思就是:A的實際值 - A的預測值 = A的殘差),所以A的殘差就是實際值14 - 預測值15 = 殘差值-1。
  • 注意,A的預測值是指前面所有樹累加的和,這里前面只有一棵樹所以直接是15,如果還有樹則需要都累加起來作為A的預測值。

然后拿它們的殘差-1、1、-1、1代替A B C D的原值,到第二棵樹去學習,第二棵樹只有兩個值1和-1,直接分成兩個節點,即A和C分在左邊,B和D分在右邊,經過計算(比如A,實際值-1 - 預測值-1 = 殘差0,比如C,實際值-1 - 預測值-1 = 0),此時所有人的殘差都是0。殘差值都為0,相當于第二棵樹的預測值和它們的實際值相等,則只需把第二棵樹的結論累加到第一棵樹上就能得到真實年齡了,即每個人都得到了真實的預測值。

換句話說,現在A,B,C,D的預測值都和真實年齡一致了。Perfect!

  • A: 14歲高一學生,購物較少,經常問學長問題,預測年齡A = 15 – 1 = 14
  • B: 16歲高三學生,購物較少,經常被學弟問問題,預測年齡B = 15 + 1 = 16
  • C: 24歲應屆畢業生,購物較多,經常問師兄問題,預測年齡C = 25 – 1 = 24
  • D: 26歲工作兩年員工,購物較多,經常被師弟問問題,預測年齡D = 25 + 1 = 26

所以,GBDT需要將多棵樹的得分累加得到最終的預測得分,且每一次迭代,都在現有樹的基礎上,增加一棵樹去擬合前面樹的預測結果與真實值之間的殘差。

需要多少顆樹

樹的數目太少了容易擬合不足,數量太大容易過擬合。要尋找樹的最佳數量,可以使用早期停止法。實現方法是使用staged_predict()方法:在訓練的每個階段(一棵樹時、兩顆樹時,等等)對集成預測返回一個迭代器,然后測量每個階段的驗證集誤差,當連續5次迭代未改善時,當前的樹都數量就是一個合適的數量。

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)

?下圖為訓練120顆樹驗證集誤差隨著樹數量的變化,從誤差上可以找到樹的最佳數量。

2. 梯度提升和梯度下降的區別和聯系是什么?

兩者都是在每 一輪迭代中,利用損失函數相對于模型的負梯度方向的信息來對當前模型進行更 新,只不過在梯度下降中,模型是以參數化形式表示,從而通過對參數的更新來對模型進行更新的。而在梯度提升中,模型并不需要進行參數化表示,而是直接定義在函數空間中,是通過增加模型來對集成模型進行更新。

3.?GBDT的優點和局限性有哪些?

3.1 優點

  • 預測階段的計算速度快,樹與樹之間可并行化計算。
  • 在分布稠密的數據集上,泛化能力和表達能力都很好,這使得GBDT在Kaggle的眾多競賽中,經常名列榜首。
  • 采用決策樹作為弱分類器使得GBDT模型具有較好的解釋性和魯棒性,能夠自動發現特征間的高階關系,并且也不需要對數據進行特殊的預處理如歸一化等。
  • 3.2 局限性

  • GBDT在高維稀疏的數據集上,表現不如支持向量機或者神經網絡。
  • GBDT在處理文本分類特征問題上,相對其他模型的優勢不如它在處理數值特征時明顯。
  • 訓練過程需要串行訓練,只能在決策樹內部采用一些局部并行的手段提高訓練速度。
  • 4. RF(隨機森林)與GBDT之間的區別與聯系

    相同點

    都是由多棵樹組成,最終的結果都是由多棵樹一起決定。

    不同點:?

    1. 從模型框架上看,隨機森林是bagging,樹可以并行生成,而GBDT是boosting,串行生成

    2. 從偏差分解的角度來看,隨機森林是減少模型的方差,而GBDT是減少模型的偏差

    3. 從模型的訓練要求上?

    • 組成隨機森林的樹可以分類樹也可以是回歸樹,而GBDT只由回歸樹組成
    • 隨機森林的結果是多數表決表決的,而GBDT則是多棵樹累加之和
    • 隨機森林對異常值不敏感,而GBDT對異常值比較敏感
    • 隨機森林不需要進行特征歸一化。而GBDT則需要進行特征歸一化

    5. GBDT與XGBoost之間的區別與聯系

    XGBoost全名eXtreme Gradient Boosting,在數據競賽中風靡一時/披荊斬棘,它源于梯度提升框架,但是更加高效,秘訣就在算法能并行計算、近似建樹、對稀疏數據的有效處理以及內存使用優化,這使得XGBoost至少比現有梯度提升算法有10倍的速度提升。

    也使用與提升樹相同的前向分步算法,其區別在于:Xgboost通過結構風險最小化來確定下一個決策樹的參數 ,主要區別:

    1. 傳統GBDT在優化時只用到一階導數信息,xgboost則對代價函數進行了二階泰勒展開,同時用到了一階和二階導數。順便提一下,xgboost工具支持自定義代價函數,只要函數可一階和二階求導。例如,xgboost支持線性分類器,這個時候xgboost相當于帶L1和L2正則化項的邏輯斯蒂回歸(分類問題)或者線性回歸(回歸問題)

    2. xgboost在代價函數里加入了正則項,用于控制模型的復雜度。正則項里包含了樹的葉子節點個數、每個葉子節點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優于傳統GBDT的一個特性。

    3.?列抽樣(column subsampling)。xgboost借鑒了隨機森林的做法,支持列抽樣(即每次的輸入特征不是全部特征),不僅能降低過擬合,還能減少計算,這也是xgboost異于傳統gbdt的一個特性。

    4.?并行化處理:在訓練之前,預先對每個特征內部進行了排序找出候選切割點,然后保存為block結構,后面的迭代中重復地使用這個結構,大大減小計算量。在進行節點的分裂時,需要計算每個特征的增益,最終選增益最大的那個特征去做分裂,那么各個特征的增益計算就可以開多線程進行,即在不同的特征屬性上采用多線程并行方式尋找最佳分割點。

    6. 代碼實現?

    GitHub:ML-NLP/GBDT_demo.ipynb at master · NLP-LOVE/ML-NLP · GitHub

    內容整理自

    1. ML-NLP/Machine Learning/3.2 GBDT at master · NLP-LOVE/ML-NLP · GitHub

    機器學習算法中 GBDT 和 XGBOOST 的區別有哪些? - 知乎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

    總結

    以上是生活随笔為你收集整理的机器学习-集成学习-梯度提升决策树(GBDT)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。