【機器學習】一文詳解GBDT、Xgboost、Boosting與Bagging之間的區別

GBDT與Xgboost的區別

 

N問GBDT

講的hin好
GBDT詳解

1. 怎麼設置單棵樹的停止生長條件?

設置參數:節點分裂時的最小樣本數;min_samples;
最大深度:max_depth;
最多葉子節點數:max_leaf_nodes;
loss滿足約束條件。

2. 如何評估特徵的權重大小?

(1)計算每個特徵在訓練集下的特徵增益,與所有特徵的信息增益之和的比例爲權重值。
(2)借鑑投票機制。用相同的參數對 w 每個特徵訓練一個模型,計算各模型下每個特徵正確分類的個數,每個特徵正確分類個數與所有正確分類個數之和的比例爲權重值。

3. 當增加樣本數量時,訓練時長是線性增加的嗎?

不是,因爲生成單棵決策樹時,需要選擇最佳分裂點,以擬合殘差,尋找最優的擬合值,而這個運算與樣本個數N不是線性相關的。

4. 當增加樹的顆數時,訓練時長是線性增加的嗎?

不是,因爲每棵樹生成的時間複雜度不同。
葉子節點數和每棵樹的生成時間複雜度也不成正比。

5. 每個節點上保存什麼信息?

樹的中間節點保存某個特徵的分割值,葉節點保存預測時某個類別的概率

6.如何防止過擬合?

(1)增加樣本,移除噪聲
(2)減少特徵,保留重要的特徵;
(3)對樣本進行採樣,建樹的時候,選擇一個子集(GBDT特有的方法,是無放回抽樣);每一個子樹都採用這個樣本子集進行擬合。

7. gbdt 在訓練和預測的時候都用到了步長,這兩個步長一樣麼?

(1)這兩個步長一樣麼?答:訓練跟預測時,兩個步長是一樣的,也就是預測時的步長爲訓練時的步長,從訓練的過程可以得知(更新當前迭代模型的時候)。
(2)都有什麼用,如果不一樣,爲什麼?答:它的作用就是使得每次更新模型的時候,使得loss能夠平穩地沿着負梯度的方向下降,不至於發生震盪
(3)那麼怎麼設步長的大小?
答:有兩種方法,一種就是按策略來決定步長,另一種就是在訓練模型的同時,學習步長
A. 策略:
a 每個樹步長恆定且相等,一般設較小的值;
b 開始的時候給步長設一個較小值,隨着迭代次數動態改變或者衰減
B. 學習:
因爲在訓練第k棵樹的時候,前k-1棵樹時已知的,而且求梯度的時候是利用前k-1棵樹來獲得。所以這個時候,就可以把步長當作一個變量來學習。
(4)(太小?太大?)在預測時,對排序結果有什麼影響?
答:如果步長過大,在訓練的時候容易發生震盪,使得模型學不好,或者完全沒有學好,從而導致模型精度不好
而步長過小,導致訓練時間過長,即迭代次數較大,從而生成較多的樹,使得模型變得複雜,容易造成過擬合以及增加計算量
不過步長較小的話,使訓練比較穩定,總能找到一個穩定的局部最優解
個人覺得過大過小的話,模型的預測值都會偏離真實情況(可能比較嚴重),從而導致模型精度不好。
(5)跟shrinking裏面的步長一樣麼?答:這裏的步長跟shrinking裏面的步長是一致的。

8. gbdt中哪些部分可以並行?

A. 計算每個樣本的負梯度
B. 分裂挑選最佳特徵及其分割點時,對特徵計算相應的誤差及均值時
C. 更新每個樣本的負梯度
D. 最後預測過程中,每個樣本將之前的所有樹的結果累加的時候

9. 樹生長成畸形樹,會帶來哪些危害,如何預防?

在生成樹的過程中,加入樹不平衡的約束條件。這種約束條件可以是用戶自定義的。
例如對樣本集中分到某個節點,而另一個節點的樣本很少的情況進行懲罰。

GBDT與Xgboost的區別

gbdt(又稱Gradient Boosted Decision Tree/Gradient Boosted Regression Tree),是一種迭代的決策樹算法,該算法由多個決策樹組成。

  1. 傳統GBDT以 CART作爲基分類器,xgboost 還支持線性分類器 。這個時候xgboost相當於帶L1和L2正則化項的邏輯斯蒂迴歸(分類問題)或者線性迴歸(迴歸問題)。
  2. 傳統GBDT在優化時只用到一階導數信息,xgboost則對代價函數進行了二階泰勒展開同時用到了一階和二階導數。順便提一下,xgboost工具支持自定義代價函數,只要函數可一階和二階求導。使用二階導數是爲了更好地一般形式的損失殘差近似
    Taylor公式展開:
    Taylor公式展開
  3. xgboost在代價函數裏加入了正則項用於控制模型的複雜度。正則項裏包含了樹的葉子節點個數、每個葉子節點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來講,正則項降低了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優於傳統GBDT的一個特性。
    目標函數
  • 葉子節點的權值,也是模型需要提升的值, 相當於GBDT中損失函數的負梯度: 計算葉子權值(G和H是落在葉子節點上的樣本,對於損失函數的一階或二階偏導,求和)
    葉子節點的權值
    分母加上了對結構損失的懲罰(如果結構複雜, 就少下降一點, 降低影響)
  • 每個葉子是相互獨立的, 因此可以直接帶入到損失函數中:
    正則項
  1. Shrinkage(縮減),相當於學習速率(xgboost中的eta,GBDT 中的 learning rate)。xgboost在進行完一次迭代後,會將葉子節點的權重(即葉子結點的輸出)乘上該係數,主要是爲了削弱每棵樹的影響,讓後面有更大的學習空間。一般把eta設置得小一點,然後迭代次數設置得大一點。
  2. 列抽樣(column subsampling)。xgboost借鑑了隨機森林的做法,支持列抽樣,不僅能降低過擬合,還能減少計算,這也是 xgboost 異於傳統 gbdt 的一個特性。
  3. 對缺失值的處理。對於特徵的值有缺失的樣本,xgboost 可以自動學習出它的分裂方向。
  4. 數據事先排序並且以block形式存儲,有利於並行計算。
    解釋:xgboost 工具支持並行。注意xgboost的並行不是tree粒度的並行,xgboost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數裏包含了前面t-1次迭代的預測值)。xgboost的並行是在特徵粒度上的。
    決策樹的學習最耗時的一個步驟就是對特徵的值進行排序(因爲要確定最佳分割點),xgboost在訓練之前,預先對數據進行了排序,然後保存爲block結構,後面的迭代中重複地使用這個結構,大大減小計算量。
    這個block結構也使得並行成爲了可能,在進行節點的分裂時,需要計算每個特徵的增益,最終選增益最大的那個特徵去做分裂,那麼各個特徵的增益計算就可以開多線程進行。
  5. 可並行的近似直方圖算法。樹節點在進行分裂時,我們需要計算每個特徵的每個分割點對應的增益,即用貪心法枚舉所有可能的分割點。當數據無法一次載入內存或者在分佈式情況下,貪心算法效率就會變得很低,所以xgboost還提出了一種可並行的近似直方圖算法,用於高效地生成候選的分割點
    分裂節點的增益公式
    這個公式形式上跟ID3算法(採用entropy計算增益) 、CART算法(採用gini指數計算增益) 是一致的,都是用分裂後的某種值 減去 分裂前的某種值,從而得到增益。
  • 爲了限制樹的生長,我們可以加入閾值,當增益大於閾值時才讓節點分裂,上式中的gamma即閾值(也是經常調整的一個參數),它是正則項裏葉子節點數T的係數,所以xgboost在優化目標函數的同時相當於做了預剪枝
  • 另外,上式中還有一個係數lambda,是正則項裏 leaf score 的 L2 模平方的係數,對leaf score做了平滑,也起到了防止過擬合的作用,這個是傳統GBDT裏不具備的特性。

GBDT與XGBoost算法上區別的總結

  1. GBDT使用一階梯度作爲殘差的近似, XGBoost使用二階梯度作爲殘差的近似;更加接近真實值, 收斂更快。
  2. GBDT的損失函數沒有考慮到樹的複雜度, 而XGBoost添加了正則項對複雜度進行了懲罰;
  3. GBDT是用的最小二乘法計算樹結構(CART),而XGBoost使用的是損失函數的增益來計算樹的結構。

Bagging和Boosting 異同

Bagging和Boosting都是將已有的分類或迴歸算法通過一定方式組合起來,即將分類器組裝成分類器的方法。將不同的分類算法套入到此類算法框架中一定程度上會提高了原單一分類器的分類效果,但是也增大了計算量。

首先介紹Bootstraping,即自助法:它是一種有放回的抽樣方法(可能抽到重複的樣本)。
1、Bagging (bootstrap aggregating)
Bagging即套袋法,其算法過程如下:

  • 每次使用一個訓練集得到一個模型,k個訓練集共得到k個模型。(注:這裏並沒有具體的分類算法或迴歸方法,我們可以根據具體問題採用不同的分類或迴歸方法,如決策樹、感知器等)
  • 對分類問題:將上步得到的k個模型採用投票的方式得到分類結果;
  • 對迴歸問題,計算上述模型的均值作爲最後的結果。(所有模型的重要性相同)

2、Boosting
其主要思想是,在PAC(概率近似正確)學習框架下,將弱分類器組裝成一個強分類器。
關於Boosting的兩個核心問題:
1)在每一輪如何改變訓練數據的權值或概率分佈?
Adaboost:通過提高那些在前一輪被弱分類器分錯樣例的權值,減小前一輪分對樣例的權值,來使得分類器對誤分的數據有較好的效果。

2)通過什麼方式來組合弱分類器?
通過加法模型將弱分類器進行線性組合,比如AdaBoost通過加權多數表決的方式,即增大錯誤率小的分類器的權值,同時減小錯誤率較大的分類器的權值。
提升樹通過擬合殘差的方式逐步減小殘差,將每一步生成的模型疊加得到最終模型。

3、Bagging,Boosting二者之間的區別

1)樣本選擇與樣本權重上:
Bagging:訓練集是在原始集中有放回選取的,從原始集中選出的各輪訓練集之間是獨立的。使用均勻取樣,每個樣例的權重相等
Boosting:每一輪的訓練集不變,只是訓練集中每個樣例在分類器中的權重發生變化。而權值是根據上一輪的分類結果進行調整,分類錯誤率越大則權重越大。

2)預測函數:
Bagging:所有預測函數的權重相等
Boosting:每個弱分類器都有相應的權重,對於分類誤差小的分類器會有更大的權重。

3)並行計算:
Bagging:各個預測函數可以並行生成
Boosting:各個預測函數只能順序生成,因爲後一個模型參數需要前一輪模型的結果。但是特徵的選擇上可以並行。

4、總結
下面是將決策樹與這些算法框架進行結合所得到的新的算法:
1)Bagging + 決策樹 = 隨機森林
2)AdaBoost + 決策樹 = 提升樹
3)Gradient Boosting + 決策樹 = GBDT、Xgboost

adaboost是boosting其中的一種,採用了指數損失函數exponential loss function(其實就是用指數的權重),根據不同的loss function還可以有其他算法,比如L2Boosting, logitboost…

RF與GBDT不同

  • 組成隨機森林的樹可以是分類樹或迴歸樹,而GBDT只由迴歸樹組成;
  • 組成隨機森林的樹可以並行生成,而GBDT是串行生成;
  • 隨機森林的結果是多數表決的,而GBDT則是多棵樹累加之和
  • 隨機森林對異常值不敏感,而GBDT對異常值比較敏感
  • 隨機森林是通過減少模型的方差來提高性能,而GBDT是減少模型的偏差來提高性能的;(因爲RF的子樹方差大,合起來之後方差小;GBDT子樹的偏差大,但是串行合併之後,偏差小)
  • 隨機森林不需要進行數據預處理,即特徵歸一化。而GBDT則需要進行特徵歸一化
    • 沒有考慮變量之間相關性,每次篩選都只考慮一個變量(因此不需要歸一化)
    • 因爲GBDT的樹是在上一顆樹的基礎上通過梯度下降求解最優解,歸一化能收斂的更快,而隨機森林本來就是通過減少方差提高性能的,樹之間建立關係是獨立的,不需要歸一化

爲什麼進行歸一化

1)歸一化後加快了梯度下降求最優解的速度
2)歸一化有可能提高精度
如下左圖爲未歸一化,梯度下降按照“之”字型收斂;
如下右圖爲歸一化結果,梯度下降按照一個方向收斂。
梯度下降

GBDT 的調參

參數說明(sklearn)
n_estimators:控制弱學習器的數量
max_depth:設置樹深度,深度越大可能過擬合
max_leaf_nodes:最大葉子節點數
learning_rate:更新過程中用到的收縮步長,(0, 1]
max_features:劃分時考慮的最大特徵數,如果特徵數非常多,我們可以靈活使用其他取值來控制劃分時考慮的最大特徵數,以控制決策樹的生成時間。
min_samples_split:內部節點再劃分所需最小樣本數,這個值限制了子樹繼續劃分的條件,如果某節點的樣本數少於min_samples_split,則不會繼續再嘗試選擇最優特徵來進行劃分。
min_samples_leaf:葉子節點最少樣本數,這個值限制了葉子節點最少的樣本數,如果某葉子節點數目小於樣本數,則會和兄弟節點一起被剪枝。
min_weight_fraction_leaf:葉子節點最小的樣本權重和,這個值限制了葉子節點所有樣本權重和的最小值,如果小於這個值,則會和兄弟節點一起被剪枝。
min_impurity_split:節點劃分最小不純度,使用 min_impurity_decrease 替代。
min_impurity_decrease:如果節點的純度下降大於了這個閾值,則進行分裂。
subsample:採樣比例,取值爲(0, 1],注意這裏的子採樣和隨機森林不一樣,隨機森林使用的是放回抽樣,而這裏是不放回抽樣。如果取值爲1,則全部樣本都使用,等於沒有使用子採樣。如果取值小於1,則只有一部分樣本會去做 GBDT 的決策樹擬合。選擇小於1的比例可以減少方差,即防止過擬合,但是會增加樣本擬合的偏差,因此取值不能太低,一般在 [0.5, 0.8] 之間。

GBDT 與 Adaboost

AdaBoost是通過提升錯分數據點的權重來定位模型的不足;
Gradient Boosting是通過算梯度(gradient)來定位模型的不足!

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章