機器學習-樹模型理論(GDBT,xgboost,lightBoost,隨機森林)

tree based ensemble algorithms

  • 原始的Boost算法是在算法開始的時候,爲每一個樣本賦上一個權重值,初始的時候,每一個樣本都是一樣的重要。在每一步的訓練中,獲得的模型,會給出每一個數據點的估計對錯,根據判斷的對錯,在每一步的訓練以後,會增長分錯樣本的權重,減小分類正確的樣本的權重,若是在後續的每一步訓練中,若是繼續被分錯,那麼就會被嚴重的關注,也就是得到了一個比較高的權重。通過N次迭代以後,將會獲得N個簡單的分類器(base learner),而後將他們組裝起來(能夠進行加權,或者進行投票),獲得一個最終的模型。

主要介紹如下幾種ensemble的分類器(tree based algorithms)

xgboost

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

  • 總結下來就是二者的區別:
    • xgboost裏面的基學習器除了用tree(gbtree),也可用線性分類器(gblinear)。而GBDT則特指梯度提高決策樹算法。
    • xgboost相對於普通gbm的實現,可能具備如下的一些優點:
    • 顯式地將樹模型的複雜度做爲正則項加在優化目標
    • 公式推導裏用到了二階導數信息,而普通的GBDT只用到一階
    • 容許使用column(feature) sampling來防止過擬合,借鑑了Random Forest的思想。(sklearn裏的gbm好像也有相似實現)
    • 實現了一種分裂節點尋找的近似算法,用於加速和減少內存消耗。
    • 節點分裂算法能自動利用特徵的稀疏性。
    • data事先排好序並以block的形式存儲,利於並行計算
    • penalty function Omega主要是對樹的葉子數和葉子分數作懲罰,這點確保了樹的簡單性
    • 支持分佈式計算能夠運行在MPI,YARN上,得益於底層支持容錯的分佈式通訊框架rabit。

  • The correct answer is marked in red. Please consider if this visually seems a reasonable fit to you. The general principle is we want both a simple and predictive model. The tradeoff between the two is also referred as bias-variance tradeoff in machine learning.

lightGBM基於決策樹算法的分佈式梯度提高框架

  • lightGBM 與xgboost的區別:
    • xgboost使用的是pre-sorted算法(對全部的特徵都按照特徵的數值進行預排序,在遍歷分割點的時候用O(data)的代價函數找個一個特徵的最好分割點,可以更加精確的找到數據的分割點。
    • lightGBM 使用的是histogram算法,佔用內存更低,數據分割的複雜度更低。
  • 決策樹生長策略上
    • xgboost採用的是level-wise生長策略,可以同時分類同一層的葉子,從而進行多線程優化,不容易過擬合,可是不加區分的對待同一層的葉子,帶來了不少沒有必要的開銷(有不少的葉子分裂增益較低,沒有必要進行搜索和分裂)
    • lightGBM採用的是leaf-wise的生長策略,每次從當前的葉子中找到分裂增益最大的(通常也是數據量最大)的一個葉子進行分裂,如此循環;可是生長出的決策樹枝葉過多,產生過擬合,lightGBM在leaf-wise上增長了一個最大深度的限制,在保證高效率的同時防止過擬合。
    • 另外一個巧妙的優化是histogram作差加速,一個容易觀察到的現象:一個葉子的直方圖能夠由它的父節點的直方圖與它兄弟的直方圖作差獲得。

GBDT(Gradient Boosting Decison Tree)

  • GBDT中使用的都是迴歸樹,GBDT用來作迴歸預測,調整後也能夠用於分類,設定閾值,大於閾值爲正例,反之爲負例,能夠發現多種有區分性的特徵以及特徵組合。
  • GBDT是把全部樹的結論累加起來作最終結論,GBDT的核心就在於,每一棵樹學的是以前全部樹結論和的殘差,這個殘差就是把一個加預測值後能獲得真實值的累加量。
  • 好比A的真實年齡是18歲,但第一棵樹的預測年齡是12歲,差了6歲,即殘差爲6歲。那麼在第二棵樹裏咱們把A的年齡設爲6歲去學習,若是第二棵樹真的能把A分到6歲的葉子節點,那累加兩棵樹的結論就是A的真實年齡;若是第二棵樹的結論是5歲,則A仍然存在1歲的殘差,第三棵樹裏A的年齡就變成1歲,繼續學。 Boosting的最大好處在於,每一步的殘差計算其實變相地增大了分錯instance的權重,而已經分對的instance則都趨向於0。這樣後面的樹就能愈來愈專一那些前面被分錯的instance。
  • 用公式來表示提高樹的部分原理 node

  • GBDT劃分標準默認是friedman_mse能夠查看sklearn 官方文檔中GBDT的參數說明git

  • Gradient Boost與傳統的Boost的區別是
  • 每一次的計算是爲了減小上一次的殘差(residual),而爲了消除殘差,咱們能夠在殘差減小的梯度(Gradient)方向上創建一個新的模型。
  • 因此說,在Gradient Boost中,每一個新的模型的創建是爲了使得以前模型的殘差往梯度方向減小。
  • Shrinkage(縮減)的思想認爲,每次走一小步逐漸逼近結果的效果,要比每次邁一大步很快逼近結果的方式更容易避免過擬合。
  • 即它不徹底相信每一棵殘差樹,他認爲每棵樹只學到了真理的一部分,累加的時候只累加一小部分,每次經過多學幾棵樹彌補不足。
  • 本質上,Shrinkage爲每棵樹設置了一個weight,累加時要乘以這個weight,但和Gradient並無關係
  • The advantages of GBRT are:github

  • Natural handling of data of mixed type (= heterogeneous features)
  • 能夠處理不一樣性質的屬性,數值特徵與category特徵,
  • 數值特徵須要進行數據的預處理
  • Predictive power
  • Robustness to outliers in output space (via robust loss functions)算法

The disadvantages of GBRT are:多線程

  • Scalability, due to the sequential nature of boosting it can hardly be parallelized.
  • Boost是一個串行過程,很差並行化,並且計算複雜度高,同時不太適合高維稀疏特徵。

隨機森林

  • 是隨機的方式創建一個森林,森林裏面有不少的決策樹組成,隨機森林的每一決策樹質檢是沒有關聯的。在獲得隨機森林以後,當有一個新的樣本輸進的時候,就讓森林中的每一棵決策樹進行判斷,判斷樣本屬於哪一類,而後看哪一類被選擇最多,就預測這個樣本爲這一類。
  • 隨機採樣
    • 隨機行採樣,採用有放回的方式,也就是在採樣獲得的樣本集合中,可能有重複的樣本。
      假如輸入的樣本爲N個,那麼採樣的樣本也是N個。這使得在訓練的時候,每棵樹的輸入的樣本都不是所有的樣本,使得相對不容易出現over-fitting。框架

    • 隨機列採樣,從M個feature中,選擇m個(m<<M)。
      對採樣以後的數據使用徹底分裂的方式創建決策樹,這樣的決策樹的某個葉子節點要麼沒法繼續分裂,要麼裏面全部的樣本都是指向的同一分類。
  • 隨機森林 中一樣有剪枝,限制決策樹的最大深度,以及最小的樣本分裂,最小的節點樣本數目,樣本分裂節點的信息增益或gini係數必須達到的閾值
  • 隨機森林用於分類的話,劃分標準是entropy或者gini係數
  • 隨機森林用於迴歸的話,劃分標準是mse(mean squared error)或者mae(mean absolute error)dom

    Why is it called random then?

  • 假如咱們的數據有1000行,30列,隨機森林的算法中,有兩個不一樣水平的隨機
  • At row level
    • 每棵樹隨機抽取了樣本 數據的一部分,每棵樹都是獨立訓練的,給出的預測結果也是獨立的
  • At column level, feature random selection at node level of the decision tree

決策樹

  • ID3 信息增益:熵(數據的不肯定性程度)的減小;一個屬性的信息增益量越大,這個屬性做爲一棵樹的根節點就能使這棵樹更簡潔。
    信息增益=分裂前的熵 – 分裂後的熵
    面對類別較少的離散數據時效果較好,但若是面對連續的數據(如體重、身高、年齡、距離等),或者每列數據沒有明顯的類別之分(最極端的例子的該列全部數據都獨一無二),即每一個值對應一類樣本
  • C4.5信息增益比:克服了ID3用信息增益選擇屬性時偏向選擇取值多的屬性的不足(某個屬性存在大量的不一樣值,在劃分時將每一個值分爲一個結點分佈式

  • CART 使用基尼係數進行分類
    基尼指數Gini(D)表示集合D的不肯定性,基尼指數Gini(D,A)表示經A=a分割後集合D的不肯定性。基尼指數值越大,樣本集合的不肯定性也就越大,這一點與熵類似。

  • 分類與迴歸樹(CART):二叉樹形式,分類時:根據Gini指數選擇劃分特徵
  • 迴歸時:Los爲 平方損失函數,最小化均方偏差選擇劃分特徵,切分點(值)將數據切分紅兩部分,用平方偏差最小的準則(最小二乘法)求解每一個單元上的最優輸出值(每一個葉子節點上的預測值爲全部樣本的平均值)。

    用選定的對(j,s)劃分區域並決定相應的輸出值,每一個葉子節點上的預測值爲全部樣本的平均值:
    ide

    能夠參看該repository中的另外文章中介紹的迴歸樹

  • 決策樹的生成一般使用 信息增益最大、信息增益比最大或基尼指數最小做爲特徵選擇的準則。

[參考]:https://medium.com/theboredhuman/random-forests-explained-intuitively-2cecb9e1a7b5

相關文章
相關標籤/搜索