隨機森林,GBDT,XGBoost的對比

隨機森林 RF RandomForest

  隨機森林的集成學習方法是bagging ,可是和bagging 不一樣的是bagging只使用bootstrap有放回的採樣樣本,但隨機森林即隨機採樣樣本,也隨機選擇特徵,所以防止過擬合能力更強,下降方差。html

使用的融合方法:baggingnode

  • 一種集成學習算法,基於bootstrap sampling 自助採樣法,重複性有放回的隨機採用部分樣本進行訓練最後再將結果 voting 或者 averaging 。
  • 它是並行式算法,由於不一樣基學習器是獨立
  • 訓練一個bagging集成學習器時間複雜度與基學習器同階(n倍,n爲基學習器個數)。
  • bagging能夠用於二分類/多分類/迴歸
  • 每一個基學習器的未用做訓練樣本可用來作包外估計,評價泛化性能。
  • bagging主要關注下降 方差
  • 兩個步驟 1. 抽樣訓練(採樣樣本,採樣特徵) 2 融合

隨機森林進一步在決策樹訓練時加入隨機屬性選擇:算法

  若是有M個輸入變量,每一個節點都將隨機選擇m(m<M)個特定的變量,而後運用這m個變量來肯定最佳的分裂點。在決策樹的生成過程當中,m的值是保持不變的。m通常取M均方根bootstrap

  所以隨機森林即有樣本隨機性(來自bagging的boostrap sampling)又有特徵隨機性。多線程

隨機森林的優缺點dom

優勢:分佈式

a)隨機森林算法能解決分類與迴歸兩種類型的問題,表現良好,因爲是集成學習,方差和誤差都比較低,泛化性能優越;
b)隨機森林對於高維數據集的處理能力很好,它能夠處理成千上萬的輸入變量,並肯定最重要的變量,所以被認爲是一個不錯的降維方法。此外,該模型可以輸出特徵的重要性程度,這是一個很是實用的功能。
c) 能夠應對缺失數據;
d)當存在分類不平衡的狀況時,隨機森林可以提供平衡數據集偏差的有效方法;
e ) 高度並行化,易於分佈式實現
f) 因爲是樹模型 ,不須要歸一化便可之間使用ide

缺點:函數

a)隨機森林在解決迴歸問題時並無像它在分類中表現的那麼好,這是由於它並不能給出一個連續型的輸出。當進行迴歸時,隨機森林不可以做出超越訓練集數據範圍的預測,這可能致使在對某些還有特定噪聲的數據進行建模時出現過分擬合。
b)對於許多統計建模者來講,隨機森林給人的感受像是一個黑盒子——你幾乎沒法控制模型內部的運行,只能在不一樣的參數和隨機種子之間進行嘗試。
c) 忽略屬性之間的相關性工具

RF的調參

通用的調參方法:

  1. grid search 網格搜索。 sklearn 提供了相應的方GridSearchCV。即便用cross validation,對模型迭代的選用候選參數進行交叉驗證,取結果最好的參數,優勢:效果好,至關於窮舉的思想,調參獲得了候選參數裏全局最優化結果。 缺點:計算複雜。 通常作競賽的小項目選這個啦。
  2. 基於貪心的座標降低搜索。即固定其餘參數,把某個參數取得最好。這樣迭代一遍獲得最終結果。優勢:計算量少,缺點:可能不是全局最優值、陷入局部最優解。
  3. 隨機網格搜索:防止 網格搜索間隔過大而跳過最優值,而隨機能夠相對單個參數取到更多的值。
  •  n_estimators越多結果更穩定(方差越小),因此只要容許內,數目越大越好, 但計算量會大增。只有這個參數對結果的影響是越大越好,其餘參數都是中間取得最優值。
  • 「分裂條件」(criterion)對模型的準確度的影響也不同,該參數須要在實際運用時靈活調整,可取gini或者信息增益比?。
  • 每棵樹最大特徵數(max_features) 通常用sqrt(總特徵數)。
  • 調整「最大葉節點數」(max_leaf_nodes)以及「最大樹深度」(max_depth)之一,能夠粗粒度地調整樹的結構:葉節點越多或者樹越深,意味着子模型的誤差越低,方差越高;同時,調整「分裂所需最小樣本數」(min_samples_split)、「葉節點最小樣本數」(min_samples_leaf)及「葉節點最小權重總值」(min_weight_fraction_leaf),能夠更細粒度地調整樹的結構:分裂所需樣本數越少或者葉節點所需樣本越少,也意味着子模型越複雜。

隨機森林的推廣(Extra Trees)

extra trees是RF的一個變種, 原理幾乎和RF如出一轍,僅有區別有:

1) 對於每一個決策樹的訓練集,RF採用的是隨機採樣bootstrap來選擇採樣集做爲每一個決策樹的訓練集,而extra trees通常不採用隨機採樣,即每一個決策樹採用原始訓練集。

2) 在選定了劃分特徵後,RF的決策樹會基於信息增益,基尼係數,均方差之類的原則,選擇一個最優的特徵值劃分點,這和傳統的決策樹相同。可是extra trees比較的激進,他會隨機的選擇一個特徵值來劃分決策樹。

從第二點能夠看出,因爲隨機選擇了特徵值的劃分點位,而不是最優勢位,這樣會致使生成的決策樹的規模通常會大於RF所生成的決策樹。也就是說,模型的方差相對於RF進一步減小,可是bias相對於RF進一步增大。在某些時候,extra trees的泛化能力比RF更好

 

GBDT (Gradient Boosting Decision Tree)

gbdt的基本原理是boost 裏面的 boosting tree(提高樹),並使用 gradient boost。

 

GBDT中的樹都是迴歸樹,不是分類樹 ,由於gradient boost 須要按照損失函數的梯度近似的擬合殘差,這樣擬合的是連續數值,所以只有迴歸樹。

梯度提高 gradient boosting:

Gradient Boosting是一種Boosting的方法,其與傳統的Boosting的區別是,每一次的計算是爲了減小上一次的殘差(residual),而爲了消除殘差,能夠在殘差減小的梯度(Gradient)方向上創建一個新的模型。因此說,在Gradient Boosting中,每一個新的模型的創建是爲了使得以前模型的殘差往梯度方向減小,與傳統Boosting對正確、錯誤樣本進行加權有着很大的區別。這個梯度表明上一輪學習器損失函數對預測值求導。

與Boosting Tree的區別:Boosting Tree的適合於損失函數爲平方損失或者指數損失。而Gradient Boosting適合各種損失函數(損失函數爲:平方損失則至關於Boosting Tree擬合殘差、損失函數爲:使用指數損失則能夠近似於Adaboost,但樹是迴歸樹)

對於梯度提高樹其學習流程與提高樹相似只是再也不使用殘差做爲新的訓練數據而是使用損失函數的梯度做爲新的新的訓練數據的y值,具體的來講就是使用損失函數對f(x)求梯度而後帶入fm-1(x)計算:

GDBT與提高樹之間的關係:

提高樹模型每一次的提高都是靠上次的預測結果與訓練數據的label值差值做爲新的訓練數據進行從新訓練,GDBT則是將殘差計算替換成了損失函數的梯度方向,將上一次的預測結果帶入梯度中求出本輪的訓練數據,這兩種模型就是在生成新的訓練數據時採用了不一樣的方法,那麼在這個背後有啥區別?使用殘差有啥很差?

李航老師《統計學習方法》中提到了在使用平方偏差損失函數和指數損失函數時,提高樹的殘差求解比較簡單,可是在使用通常的損失偏差函數時,殘差求解起來不是那麼容易,因此就是用損失函數的負梯度在當前模型的值做爲迴歸問題中殘差(均方偏差)或者殘差的近似值。 

 

(來自MLAPP)

 

XGBoost

 

 

XGBoost比GBDT好的地方:
二階泰勒展開
節點分數懲罰正則
增益計算不一樣,gbdt是gini,xgb是優化推導公式

如下來自 一步一步理解GB、GBDT、xgboost

Xgboost是GB算法的高效實現,xgboost中的基學習器除了能夠是CART(gbtree)也能夠是線性分類器(gblinear)。下面全部的內容來自原始paper,包括公式。

(1). xgboost在目標函數中顯示的加上了正則化項,基學習爲CART時,正則化項與樹的葉子節點的數量T葉子節點的值有關。

(2). GB中使用Loss Function對f(x)的一階導數計算出僞殘差用於學習生成fm(x),xgboost不只使用到了一階導數,還使用二階導數

第t次的loss:

對上式作二階泰勒展開:g爲一階導數,h爲二階導數

(3). 上面提到CART迴歸樹中尋找最佳分割點的衡量標準是最小化均方差,xgboost尋找分割點的標準是最大化,lamda,gama與正則化項相關

xgboost算法的步驟和GB基本相同,都是首先初始化爲一個常數,gb是根據一階導數ri,xgboost是根據一階導數gi和二階導數hi,迭代生成基學習器,相加更新學習器。

xgboost與gdbt除了上述三點的不一樣,xgboost在實現時還作了許多優化

  • 在尋找最佳分割點時,考慮傳統的枚舉每一個特徵的全部可能分割點的貪心法效率過低,xgboost實現了一種近似的算法。大體的思想是根據百分位法列舉幾個可能成爲分割點的候選者,而後從候選者中根據上面求分割點的公式計算找出最佳的分割點。
  • xgboost考慮了訓練數據爲稀疏值的狀況,能夠爲缺失值或者指定的值指定分支的默認方向,這能大大提高算法的效率,paper提到50倍。
  • 特徵列排序後以塊的形式存儲在內存中,在迭代中能夠重複使用;雖然boosting算法迭代必須串行,可是在處理每一個特徵列時能夠作到並行。
  • 按照特徵列方式存儲能優化尋找最佳的分割點,可是當以行計算梯度數據時會致使內存的不連續訪問,嚴重時會致使cache miss,下降算法效率。paper中提到,可先將數據收集到線程內部的buffer,而後再計算,提升算法的效率。
  • xgboost 還考慮了當數據量比較大,內存不夠時怎麼有效的使用磁盤,主要是結合多線程、數據壓縮、分片的方法,儘量的提升算法的效率。

 

如下內容來自wepon
做者:wepon
連接:https://www.zhihu.com/question/41354392/answer/98658997

 

  • 傳統GBDT以CART做爲基分類器,xgboost還支持線性分類器,這個時候xgboost至關於帶L1和L2正則化項的邏輯斯蒂迴歸(分類問題)或者線性迴歸(迴歸問題)。
  • 傳統GBDT在優化時只用到一階導數信息,xgboost則對代價函數進行了二階泰勒展開,同時用到了一階和二階導數。順便提一下,xgboost工具支持自定義代價函數,只要函數可一階和二階求導。
  • xgboost在代價函數里加入了正則項,用於控制模型的複雜度。正則項裏包含了樹的葉子節點個數、每一個葉子節點上輸出的score的L2模的平方和。從Bias-variance tradeoff角度來說,正則項下降了模型的variance,使學習出來的模型更加簡單,防止過擬合,這也是xgboost優於傳統GBDT的一個特性。
  • Shrinkage(縮減),至關於學習速率(xgboost中的eta)。xgboost在進行完一次迭代後,會將葉子節點的權重乘上該係數,主要是爲了削弱每棵樹的影響,讓後面有更大的學習空間。實際應用中,通常把eta設置得小一點,而後迭代次數設置得大一點。(補充:傳統GBDT的實現也有學習速率)
  • 列抽樣(column subsampling)即特徵抽樣。xgboost借鑑了隨機森林的作法,支持列抽樣,不只能下降過擬合,還能減小計算,這也是xgboost異於傳統gbdt的一個特性。
  • 對缺失值的處理。對於特徵的值有缺失的樣本,xgboost能夠自動學習出它的分裂方向。
  • xgboost工具支持並行。boosting不是一種串行的結構嗎?怎麼並行的?注意xgboost的並行不是tree粒度的並行,xgboost也是一次迭代完才能進行下一次迭代的(第t次迭代的代價函數裏包含了前面t-1次迭代的預測值)。xgboost的並行是在特徵粒度上的。咱們知道,決策樹的學習最耗時的一個步驟就是對特徵的值進行排序(由於要肯定最佳分割點),xgboost在訓練以前,預先對數據進行了排序,而後保存爲block結構,後面的迭代中重複地使用這個結構,大大減少計算量。這個block結構也使得並行成爲了可能,在進行節點的分裂時,須要計算每一個特徵的增益,最終選增益最大的那個特徵去作分裂,那麼各個特徵的增益計算就能夠開多線程進行。
  • 可並行的近似直方圖算法。樹節點在進行分裂時,咱們須要計算每一個特徵的每一個分割點對應的增益,即用貪心法枚舉全部可能的分割點。當數據沒法一次載入內存或者在分佈式狀況下,貪心算法效率就會變得很低,因此xgboost還提出了一種可並行的近似直方圖算法,用於高效地生成候選的分割點。
  • 多種語言封裝支持。

XGBoost 調參

 

參考資料:
chentq的slides 
chentq的paper 
chentq在52cs上的中文博文 
微博上分享的 xgboost導讀和實戰.pdf
相關文章
相關標籤/搜索