隨機森林RF、XGBoost、GBDT和LightGBM的原理和區別

一、基本知識點介紹

  • RandomForest、XGBoost、GBDT和LightGBM都屬於集成學習。算法

  • 集成學習經過構建並結合多個分類器來完成學習任務,也稱爲多分類系統,集成學習的目的是經過結合多個機器學習分類器的預測結果來改善基本學習器的泛化能力和魯棒性。api

  • 集成學習方法大體分爲兩類:多線程

    • 基本學習器之間存在強依賴關係、必須串行生成的序列化方法,即Boosting提高方法。框架

    • 基本學習器之間不存在強依賴關係、可同時生成的並行化方法,即Bagging方法。dom

二、各個算法原理

2.1 隨機森林 -- RandomForest

  • RF原理:RF是Bagging的擴展變體,它在以決策樹爲基礎學習器構建Bagging集成的基礎上,進一步在決策樹的訓練過程當中引入了隨機特徵選擇,其流程大概分爲四個步驟:機器學習

    1. 隨機選擇樣本(放回抽樣)。函數

    2. 隨機選擇特徵屬性。性能

    3. 構建決策樹。學習

    4. 隨機森林投票(平均)。

所以防止過擬合能力更強,下降方差。

  • Bagging,即套袋法,算法過程以下:

    1. 從原始樣本集中抽取訓練集。每輪從原始樣本集中使用Bootstraping的方法抽取n個訓練樣本,共進行k輪抽取,獲得k個訓練集。

    2. 每次使用一個訓練集獲得一個模型,k個訓練集共獲得k個模型。(模型能夠根據具體問題具體選取,如決策樹,SVM,感知機。)

    3. 對於分類問題:將上面獲得的k個模型採用投票的方式獲得分類結果;

      對於迴歸問題:計算上述模型的均值做爲最後的結果。(由於全部模型的重要性是相同的)
  • RF和Bagging對比: RF的起始性能較差,特別當只有一個基學習器時,隨着學習器數目增多,隨機森林一般會收斂到更低的泛化偏差。隨機森林的訓練效率也會高於Bagging,由於在單個決策樹的構建中,Bagging使用的是‘肯定性’特徵數,在選擇特徵劃分結點時,要對全部的特徵進行考慮,而隨機森林使用的是‘隨機性’特徵數,只需考慮特徵的子集。

2.2 XGBoost算法

  • XGBoost原理:XGBoost屬於集成學習Boosting,是在GBDT的基礎上對Boosting算法進行的改進,並加入了模型複雜度的正則項。GBDT是用模型在數據上的負梯度做爲殘差的近似值,從而擬合殘差。XGBoost也是擬合數據殘差,並用泰勒展開式對模型損失殘差的近似,同時在損失函數上添加了正則化項。

\[Obj^{t} = \sum_{i=1}^{n} L(y_{i}, \hat{y}_{i}^{(t-1)} + f_{t}(x_{i})) + \Omega (f_{t}) + constant\]

其中\(\sum_{i=1}^{n} L(y_{i}, \hat{y}_{i}^{(t-1)})\)爲損失函數,紅色方框爲正則項,包括L一、L2;紅色圓圈爲常數項。

  • L1正則化項:\[L(\omega) = \frac{1}{N} \sum_{i=1}^{N} (f(x_{i}) - y_{i})^{2} + \frac{\lambda}{2} ||\omega||^{1}\]

  • L2正則化項:\[L(\omega) = \frac{1}{N} \sum_{i=1}^{N} (f(x_{i}) - y_{i})^{2} + \frac{\lambda}{2} ||\omega||^{2}\]

  • XGBoost與GBDT算法的區別:

    • 傳統的GBDT在優化的時候只用到了一階導數信息,而XGBoost則對代價函數進行了二階泰勒展開,獲得一階和二階導數,而且XGBoost在代價函數中加入了正則項,用於控制模型的複雜度。

    • 另外XGBoost還支持線性分類器,經過在代價函數中加入正則項,下降了模型的方差,使學習出來的模型更加簡單,避免過擬合。

  • GBDT的基本原理是Boosting裏面的boosting tree(提高樹),並使用gradient boost。其關鍵是利用損失函數的負梯度方向在當前模型的值做爲殘差的近似值,進而擬合一顆CART迴歸樹(classification and regression tree)。

2.3 GBDT算法(Gradient Boosting Decision Tree)

  • GBDT算法原理:指經過在殘差減少的梯度方向創建boosting tree(提高樹),即gradient boosting tree(梯度提高樹)。每次創建新模型都是爲了使以前模型的殘差往梯度方向降低。

\[r_{ti} = -[\frac{\partial L(y_{i}, f(x_{i}))}{\partial f(x_{i})}]_{f(x)=f_{t-1}(x)}\]

\[c_{tj} = arg \ \min\limits_{c} \sum\limits_{x_{i} \in R_{tj}} L(y_{i}, f_{t-1}(x_{i}) + c)\]

  • GBDT缺點:GBDT會累加全部樹的結果,此過程沒法經過分類完成,由於GBDT須要按照損失函數的梯度近似地擬合殘差,這樣擬合的是連續數據,所以只能是CART迴歸樹,而不能是分類樹。

2.4 LightGBM提高學習模型

  • lightGBM,它是微軟出的新的boosting框架,基本原理與XGBoost同樣,使用基於學習算法的決策樹,只是在框架上作了一優化(重點在模型的訓練速度的優化)。
  • 直方圖算法的基本思想是先把連續的浮點特徵值離散化成k個整數,同時構造一個寬度爲k的直方圖。在遍歷數據的時候,根據離散化後的值做爲索引在直方圖中累積統計量,當遍歷一次數據後,直方圖累積了須要的統計量,而後根據直方圖的離散值,遍歷尋找最優的分割點。

  • lightGBM與XGBoost的區別:
    • xgboost採用的是level-wise的分裂策略,而lightGBM採用了leaf-wise的策略。
      • level-wise:指對每一層全部節點作無差異分裂,可能有些節點的增益很是小,帶來了不必的開銷。
      • leaf-wise:指在當前全部葉子節點中選擇分裂收益最大的節點進行分裂,如此遞歸進行,容易出現過擬合,所以須要作最大深度限制,從而避免過擬合。
    • lightGBM使用了基於histogram(直方圖)的決策樹算法,而XGBoost使用了exact算法(須要提早預排序)。
      • 能減小內存消耗(#data* #features * 1Bytes),下降計算代價,由於其只須要保存特徵離散化以後的值。
      • 而XGBoost使用exact算法,內存消耗爲(2 * #data * #features* 4Bytes),由於XGBoost既要保存原始feature的值,也要保存這個值的順序索引。
      • XGBoost的預排序算法在選擇好分裂特徵計算分裂受益時,須要遍歷全部樣本的特徵值,時間複雜度爲(#data),與數據量成正比。而lightGBM的直方圖只須要遍歷分區的直方桶便可,時間複雜度爲(#bin)。
    • lightGBM的直方圖還能作減差加速做用。
      • 一個子節點的直方圖能夠經過父節點的直方圖減去兄弟節點的直方圖便可獲得,從而實現加速。
    • lightGBM支持直接輸入類別categorical的特徵feature。
      • 在對離散特徵分裂時,每一個取值都看成一個桶,分裂時的增益爲「是否屬於某個類別category」的gain。相似與one-hot編碼。
    • lightGBM實現可多線程優化。(即可以在同一時間執行多個線程,提高總體性能)
    • lightGBM作了並行處理。
      • feature parallel(特徵並行處理):通常的feature parallel就是對數據作垂直分割(partiion data vertically,就是對屬性分割),而後將分割後的數據分散到各個worker上,各個workers計算其擁有的數據的best splits point, 以後再彙總獲得全局最優分割點。lightgbm的作法是每一個worker都擁有全部數據,再分割。——我也沒懂
      • data parallel(數據並行處理):傳統的data parallel是將對數據集進行劃分,也叫 平行分割(partion data horizontally), 分散到各個workers上以後,workers對獲得的數據作直方圖,彙總各個workers的直方圖獲得全局的直方圖。 lightgbm的作法是使用」Reduce Scatter「機制,不彙總全部直方圖,只彙總不一樣worker的不一樣feature的直方圖(原理?),在這個彙總的直方圖上作split,最後同步。

參考
一、牛人:https://blog.csdn.net/zwqjoy/article/details/82150528

二、周志華《機器學習》

三、劉建平GBDT:http://www.javashuo.com/article/p-coowgizi-dv.html

四、大牛XGBoost:http://www.javashuo.com/article/p-wdqpjpms-hq.html

相關文章
相關標籤/搜索