[机器学习 ] RandomForest、GBDT、XGBoost、lightGBM 原理与区别
目錄
隨機森林 -- RandomForest
GBDT?(Gradient?Boosting?Decision?Tree)
XGBoost
lightGBM
一 知識點介紹
RF,GBDT,XGBoost,lightGBM都屬于集成學習(Ensemble Learning),集成學習的目的是通過結合多個基學習器的預測結果來改善基本學習器的泛化能力和魯棒性。
根據基本學習器的生成方式,目前的集成學習方法大致分為兩大類:即基本學習器之間存在強依賴關系、必須串行生成的序列化方法,以及基本學習器間不存在強依賴關系、可同時生成的并行化方法;前者的代表就是Boosting,后者的代表是Bagging和“隨機森林”(Random Forest)
這篇文章主要對集成學習中重要的、使用廣泛的方法進行對比:
RF(隨機森林)), GBDT(梯度提升決策樹), XGBoost,? lightGBM
二 隨機森林 -- RandomForest
提到隨機森林,就不得不提Bagging,Bagging可以簡單的理解為:放回抽樣,多數表決(分類)或簡單平均(回歸),同時Bagging的基學習器之間屬于并列生成,不存在強依賴關系。
Random Forest(隨機森林)是Bagging的擴展變體,它在以決策樹 為基學習器構建Bagging集成的基礎上,進一步在決策樹的訓練過程中引入了隨機特征選擇
因此可以概括RF包括四個步驟:
1、隨機選擇樣本(放回抽樣);
2、隨機選擇特征屬性;
3、構建決策樹;
4、隨機森林投票(平均)
因此防止過擬合能力更強,降低方差。
RF和Bagging對比: RF的起始性能較差,特別當只有一個基學習器時,隨著學習器數目增多,隨機森林通常會收斂到更低的泛化誤差。隨機森林的訓練效率也會高于Bagging,因為在單個決策樹的構建中,Bagging使用的是‘確定性’決策樹,在選擇特征劃分結點時,要對所有的特征進行考慮,而隨機森林使用的是‘隨機性’特征數,只需考慮特征的子集。
使用的融合方法:bagging
- 一種集成學習算法,基于bootstrap sampling 自助采樣法,重復性有放回的隨機采用部分樣本進行訓練最后再將結果 voting 或者 averaging 。
- 它是并行式算法,因為不同基學習器是獨立
- 訓練一個bagging集成學習器時間復雜度與基學習器同階(n倍,n為基學習器個數)。
- bagging可以用于二分類/多分類/回歸
- 每個基學習器的未用作訓練樣本可用來做包外估計,評價泛化性能。
- bagging主要關注降低?方差。
- 兩個步驟 1. 抽樣訓練(采樣樣本,采樣特征) 2 融合
隨機森林的優缺點
優點:
缺點:
?
三 GBDT?(Gradient?Boosting?Decision?Tree)
????? 提GBDT之前,談一下Boosting,Boosting是一種與Bagging很類似的技術。不論是Boosting還是Bagging,所使用的多個分類器類型都是一致的。但是在前者當中,不同的分類器是通過串行訓練而獲得的,每個新分類器都根據已訓練的分類器的性能來進行訓練。Boosting是通過關注被已有分類器錯分的那些數據來獲得新的分類器。
由于Boosting分類的結果是基于所有分類器的加權求和結果的,因此Boosting與Bagging不太一樣,Bagging中的分類器權值是一樣的,而Boosting中的分類器權重并不相等,每個權重代表對應的分類器在上一輪迭代中的成功度。
?
原理
- GBDT的基本原理是boost?里面的?boosting tree(提升樹),并使用 gradient boost。
- GradientBoosting算法關鍵是利用損失函數的負梯度方向在當前模型的值作為殘差的近似值,進而擬合一棵CART回歸樹。
- GBDT會累加所有樹的結果,而這種累加是無法通過分類完成的,因此GBDT的樹都是CART回歸樹,而不是分類樹(盡管GBDT調整后也可以用于分類但不代表GBDT的樹為分類樹) 因為Gradient Boosting 需要按照損失函數的梯度近似的擬合殘差,這樣擬合的是連續數值,因此只有回歸樹。
梯度提升 Gradient Boosting:
??? Gradient Boosting是一種Boosting的方法,其與傳統的Boosting的區別是,每一次的計算是為了減少上一次的殘差(residual),而為了消除殘差,可以在殘差減少的梯度(Gradient)方向上建立一個新的模型。所以說,在Gradient Boosting中,每個新的模型的建立是為了使得之前模型的殘差往梯度方向減少,與傳統Boosting對正確、錯誤樣本進行加權有著很大的區別。這個梯度代表上一輪學習器損失函數對預測值求導。
??? 與Boosting Tree的區別:Boosting Tree適合于損失函數為平方損失或者指數損失。而Gradient Boosting適合各類損失函數(損失函數為平方損失則相當于Boosting Tree擬合殘差、損失函數為指數損失則可以近似于Adaboost,但樹是回歸樹)
???????
優缺點
優點:GBDT的性能在RF的基礎上又有一步提升,因此其優點也很明顯,1、它能靈活的處理各種類型的數據;2、在相對較少的調參時間下,預測的準確度較高。
缺點:當然由于它是Boosting,因此基學習器之前存在串行關系,難以并行訓練數據。
?
四 XGBoost
XGBoost的原理詳細,推薦兩篇大神博客, xgboost原理 ,xgboost 算法原理。
?????? XGBoost是集成學習Boosting家族的成員,是在GBDT的基礎上對boosting算法進行的改進。GBDT是用模型在數據上的負梯度作為殘差的近似值,從而擬合殘差。XGBoost也是擬合的在數據上的殘差,但是它是用泰勒展開式對模型損失殘差的近似;同時XGBoost對模型的損失函數進行的改進,并加入了模型復雜度的正則項。
?? XGBoost的性能在GBDT上又有一步提升,而其性能也能通過各種比賽管窺一二。坊間對XGBoost最大的認知在于其能夠自動地運用CPU的多線程進行并行計算,同時在算法精度上也進行了精度的提高。由于GBDT在合理的參數設置下,往往要生成一定數量的樹才能達到令人滿意的準確率,在數據集較復雜時,模型可能需要幾千次迭代運算。但是XGBoost利用并行的CPU更好的解決了這個問題。
XGBoost與GBDT的區別: 在了解了XGBoost原理后容易理解二者的不同
損失函數的改變:(導數和正則項的認識)
- 傳統的GBDT以CART樹作為基學習器,XGBoost還支持線性分類器,這個時候XGBoost相當于L1和L2正則化的邏輯斯蒂回歸(分類)或者線性回歸(回歸);
- 傳統的GBDT在優化的時候只用到一階導數信息,XGBoost則對代價函數進行了二階泰勒展開,得到一階和二階導數;
- XGBoost在代價函數中加入了正則項,用于控制模型的復雜度。從權衡方差偏差來看,它降低了模型的方差,使學習出來的模型更加簡單,防止過擬合,這也是XGBoost優于傳統GBDT的一個特性;
工具的優化:(趨勢值和并行的認識)
缺點
1、level-wise 建樹方式對當前層的所有葉子節點一視同仁,有些葉子節點分裂收益非常小,對結果沒影響,但還是要分裂,加重了計算代價。
2、預排序方法空間消耗比較大,不僅要保存特征值,也要保存特征的排序索引,同時時間消耗也大,在遍歷每個分裂點時都要計算分裂增益(不過這個缺點可以被近似算法所克服)
五 lightGBM
它是微軟出的新的boosting框架,基本原理與XGBoost一樣,只是在框架上做了一優化(重點在模型的訓練速度的優化)。
關于lightGBM的介紹參考:比XGBOOST更快–LightGBM介紹
與XGboost對比
1、xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略.
- level-wise:指對每一層所有節點做無差別分裂,可能有些節點的增益非常小,對結果影響不大,但是xgboost也進行了分裂,帶來了沒必要的開銷。
- leaf-wise:指在當前所有葉子節點中選擇分裂收益最大的節點進行分裂,如此遞歸進行,容易出現過擬合,因此需要做最大深度限制,從而避免過擬合。
2、lightgbm使用了基于histogram的決策樹算法,這一點不同與xgboost中的 exact 算法(tree_method 可以使用 hist參數),histogram算法在內存和計算代價上都有不小優勢。
(1)內存上優勢:很明顯,直方圖算法的內存消耗為(#data* #features * 1Bytes)(因為對特征分桶后只需保存特征離散化之后的值),而xgboost的exact算法內存消耗為:(2 * #data * #features* 4Bytes),因為xgboost既要保存原始feature的值,也要保存這個值的順序索引,這些值需要32位的浮點數來保存。
(2)計算上的優勢,預排序算法在選擇好分裂特征計算分裂收益時需要遍歷所有樣本的特征值,時間為(#data),而直方圖算法只需要遍歷桶就行了,時間為(#bin)
3、直方圖做差加速
一個子節點的直方圖可以通過父節點的直方圖減去兄弟節點的直方圖得到,從而加速計算。
4、lightgbm支持直接輸入categorical 的feature
在對離散特征分裂時,每個取值都當作一個桶,分裂時的增益算的是”是否屬于某個category“的gain。類似于one-hot編碼。
5、多線程優化
lightgbm哪些方面做了并行?
1. Feature Parallel
一般的feature parallel就是對數據做垂直分割(partiion data vertically,就是對屬性分割),然后將分割后的數據分散到各個worker上,各個workers計算其擁有的數據的best splits point, 之后再匯總得到全局最優分割點。但是lightgbm說這種方法通訊開銷比較大,lightgbm的做法是每個worker都擁有所有數據,再分割?(沒懂,既然每個worker都有所有數據了,再匯總有什么意義?這個并行體現在哪里??)
2. Data Parallel
傳統的data parallel是將對數據集進行劃分,也叫 平行分割(partion data horizontally), 分散到各個workers上之后,workers對得到的數據做直方圖,匯總各個workers的直方圖得到全局的直方圖。 lightgbm也claim這個操作的通訊開銷較大,lightgbm的做法是使用”Reduce Scatter“機制,不匯總所有直方圖,只匯總不同worker的不同feature的直方圖(原理?),在這個匯總的直方圖上做split,最后同步。
總結
以上是生活随笔為你收集整理的[机器学习 ] RandomForest、GBDT、XGBoost、lightGBM 原理与区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在一起!滴滴和快的合并后的影响(滴滴有没
- 下一篇: [机器学习] LR与SVM的异同