簡述樹模型之決策樹、隨機森林、xgboost

th.jpeg

數據建模中的樹模型常用于分類和預測,本文簡要介紹三種典型的樹模型。

損失函數

先介紹一下損失函數的概念,它被廣泛用做構造樹時調整樹形和衡量模型性能的標準,主要涉及兩個概念:1)方差(variance):某一模型對不同測試集的預測結果波動程度;2)偏差(bias):某次預測結果與實際數據的差。總的來說,模型簡單,偏差大、方差小,欠擬合;模型復雜,偏差小、方差大,過擬合。因此模型優化也是這樣一個尋找最佳平衡點的過程。

- 決策樹

決策樹是一種樹狀結構,它的每個葉節點對應一個分類,非葉節點對應在某個屬性上的劃分,根據樣本在該屬性上的不同取值劃分成若干子集。構造決策樹的核心問題是每一步對樣本屬性如何做拆分。對于一個分類問題,從已知數據做訓練,生產決策樹是一個自上而下的分治過程。

from sklearn.Tree import DecisionTreeRegressor
決策樹算法 算法描述
ID3算法 決策樹的各級節點上使用信息增益作為屬性的選擇標準,只適用離散變量
C4.5算法 改進ID3,使用信息增益率來選擇節點,離散或連續變量都適用
CART算法 Classification And Regressor Tree(分類與回歸樹),通過Gini**系數選擇節點,通過剪枝、評估樹構造一棵二叉樹。當葉節點是離散量時,該樹為分類樹;當葉節點是連續量時,該樹為回歸樹。

- 隨機森林

多棵決策樹組成, 基于Bagging思想,有放回抽樣。每輪結果之間相互獨立,因此損失函數的方差不對太大。
max_leaf_nodes參數決定迭代次數,也就是樹的深度,選取不當會導致模型過(欠)擬合,后果是雖然訓練結果準確度很高,但 在實際部署時會發生意想不到的錯誤,這被稱為數據泄露(data leakage)。二叉樹并不是越深越好,太深會帶來overfitting(過擬合)的問題,隨機森林構造器的默認參數往往最優。

from sklearn.ensemble import RandomForestRegressor

- XGBoost

梯度提升決策樹。專門處理表格型數據,如pd.DataFrame,基于Boosting。

Boosting: 初始建立M個模型,大多簡單,每完成一次訓練,將出錯的 數據權重上升,下次重點訓練,最終模型由各個子模型按權重相加,也就是說,程序越往后運行,越關注那些權重大的數據。

下面是一些關鍵的參數:

  • n_estimator: 迭代次數,通常選較大的數,1000.
  • early_stopping_rounds: model.fit(early_stopping_rounds=5),當模型訓練到一個理想值時自動停止訓練,即使沒有到n_estimator指定的輪數
  • learning_rate: 將預測結果乘以一個因子再加到下一輪,而不是簡單相加
  • n_jobs: 并行作業數,取計算機CPU核數
from xgboost import XGBoostRegressor
xgb = XGBRegressor(n_estimator=1000, learning_rate = 0.05, n_jobs=4)
xgb.fit(train_X, train_y, early_stopping_rounds=5)

一個問題:為什么RandomForest往往比GBDT深

GBDT每輪迭代數據都與上一輪結果有關,就信息元來說可以保證結果盡可能接近真實數據,偏差不會很大,但聯系緊密的數據擬合會使得方差過大,因此需要淺一點的樹來降低方差。
而基于Bagging的隨機森林,各分類相互獨立,受不同輸入數據的影響小,目標是如何提高準確度,因此采用很深甚至不剪枝的樹群。

數據挖掘小白一枚,如有錯誤,懇請大家指正~

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容