決策樹系列思路

首發鏈接:https://zhuanlan.zhihu.com/p/149950949

本文涉及決策樹、隨機森林、adaboost、xgboost等的思路系統。都是大思路,和各算法之間的差異對比,沒有推導過程。

1、單棵決策樹

單棵決策樹的思路是,在現有節點選擇某種劃分方式,生成新的多個子節點,反覆重複,直至某種限制條件讓新增過程終止。其中的劃分過程詳細是,預先設定某項指標,選擇某列特徵作爲劃分方式,然後計算在該列特徵劃分數據集前後之間,該指標的變化量,變化的越大就越應該選擇該列特徵作爲劃分標準。

  • 這種思路體現在ID3上,就是 信息增益 = 整體數據集的熵 -
    該列劃分後各子數據集的熵的加權和(即條件熵,權重是子數據集樣本數量佔比),體現了該列劃分對熵的變化情況;
  • C4.5也是ID3的思路,只是做了改進,劃分標準變爲了 信息增益率 = 信息增益 /
    該列本身的熵,體現了該列每個單位的熵對劃分前後熵的變化情況;
  • 上文思路體現在CART上,就是 gini變化 = 整體數據集的gini -
    該列劃分後各子數據集的gini的加權和(權重是子數據集樣本數量佔比),由於採用了二叉樹,所以不需像C4.5一樣考慮該列本身的情況而做改進;

上述是分類樹的思路,若是迴歸樹則用mse等指標替代上述的熵、gini等指標,大思路不變。

2、多棵決策樹

用一套數據集生成多棵決策樹,最暴力的方式是將數據集劃分爲多個數據集,分別成樹,但該方式需要海量數據,否則欠擬合嚴重。

更好的方式是藉助兩種思路:bagging 和 boosting。

bagging是對數據集做有放回、等數量的重採樣,得到多個數據集,分別成樹,分別得結果。若分類,則讓多個結果投票;若迴歸,則讓多個結果算均值。
boosting 分類是通過弱學習方法得到多個弱分類器(基分類器),通過組合得到一個強分類器。

2.1、bagging得到多棵樹

比如隨機森林模型,在上述bagging思路之外,又加上了對特徵的抽樣。每次僅抽少量的特徵,加速計算。注意,隨機森林不剪枝。(行、列都做了抽樣,已經很好的處理過擬合問題了。)

2.2、boosting得到多棵樹

比如adaboost、GBDT和xgboost。

2.2.1、adaboost

對應上述boosting,每次迭代都是用殘差修改“各樣本權重”,得到不同的多個弱分類器。這是最核心的,除此之外還有一些特點:

  • 二分類,二叉樹,CART分類/迴歸樹;
  • 每棵樹都是單層;
  • 最終每棵樹的預測值投票結果是加權投票。

2.2.2、GBDT

對應上述boosting,每次迭代的預測值都是上次的殘差(這也是GBDT中gradient的意義所在),從而得到多個弱分類器。其他特點有:

  • 僅迴歸問題,若分類則轉回歸;
  • 每棵樹都是CART迴歸樹;
  • 最後算所有樹的預測值之和作爲最終預測值;
  • shrinkage:每步小些,步數多些,雖慢,防止過擬合,且最終效果好些。

2.2.3、xgboost

魔改版的GBDT,與GBDT相比的差別和特點有:( ~~ 開啓舔狗模式 ~~ )

  1. xgboost不是一種算法,而是一套包含可選擇具體算法的實用工具。
  2. 將防止過擬合的方式(如最大葉數等),從其他決策樹系列模型的硬性規則設定轉化爲xgboost的目標函數公式中的正則化項,從而精確計算,更加科學;
  3. 可選基分類器是決策樹、線性;可選是單棵樹、森林;可選甚至自己寫損失函數(如下鏈接);
  4. 每棵樹對特徵做抽樣(學隨機森林);
  5. 每片葉子都有權重;
  6. 每次也做shrinkage;
  7. (trick)有處理缺失值的獨特方式;
  8. (處理過程中)在迭代過程中,需要對目標函數求導,由於損失函數是可自定義的,不變求導,所以對損失函數做泰勒展開;
  9. (生產級代碼)構建單棵樹的對特徵排序的過程中做並行加速。

鏈接: ​【乾貨】 xgboost如何自定義eval_metric ( feval ) ?


自己寫的,,如果有錯,請指正;如果覺得還行,請點贊!謝謝!

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