數據建模中的樹模型常用于分類和預測,本文簡要介紹三種典型的樹模型。
損失函數
先介紹一下損失函數的概念,它被廣泛用做構造樹時調整樹形和衡量模型性能的標準,主要涉及兩個概念: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的隨機森林,各分類相互獨立,受不同輸入數據的影響小,目標是如何提高準確度,因此采用很深甚至不剪枝的樹群。
數據挖掘小白一枚,如有錯誤,懇請大家指正~