1. 程式人生 > >樹形模型整合庫Xgboost&LightGBM

樹形模型整合庫Xgboost&LightGBM

以下內容是個人學習筆記,圖片及調參內容參考自寒小陽老師講義。

sklearn庫:中小型資料集;Xgboost/LightGBM庫:工業界大型資料,可以分散式部署。  工業界非常喜歡樹形模型原因:(1)可解釋性好,和人的判斷非常相似,可以順著樹的路徑找出做決策的方式,出問題容易debug。(2)樹形模型不需要做幅度縮放,樹分裂時不受各個特徵變化幅度的影響(衡量各個特徵時,熵/Gini index的計算與各個特徵的變化幅度取值無關)。(3)各種由樹形模型整合的模型精準度也很高。

Random Forest學習時,每一棵樹的生成:隨機選擇利用部分樣本點,隨機選擇部分特徵,並行生成很多棵樹後,分類問題:投票,迴歸問題:平均(Bagging)。  Random Forest效果受限於每一棵決策樹可以學習到的程度,可以控制過擬合,但有時擬合程度不一定精確。  GBDT是一個很容易overfitting的模型;為了控制過擬合,同時又能得到比較高的精確度,對GBDT進行改進,引入Bagging的機制,在GBDT序列生成過程引入隨機取樣。 

LightGBM文件:https://lightgbm.readthedocs.io/en/latest/Installation-Guide.html  Xgboost文件:http://xgboost.readthedocs.io/en/latest/model.html

Xgboost裡3類引數:通用引數,整合引數,任務引數通用引數(general parameters):最上層引數,用什麼模型搭建(1)booster[default=gbtree] 序列學習過程,基模型是什麼  gbtree,gblinear

(2)silent[default=0] 資訊是否輸出

(3)nthread[default=max] 跑xgboost的最大執行緒數,預設最大執行緒數

(4)num_pbuffer[無需手動調]  (5)num_feature[無需手動調]

整合引數/增強引數(booster parameters):模型整合時,每一個基模型的引數,各基模型融合時的引數 (1)eta[default=0.3] 取值[0,1],看成學習率,序列修正偏差學習基模型的作用幅度,即為防止過擬合,更新過程中用到的收縮步長;在每次提升計算之後,演算法會直接獲得新特徵的權重,eta通過縮減特徵的權重,使提升計算過程更保守  (2)gamma[default=0,alias:nin_split_loss] 取值[0,∞∞],為了防止過擬合,限制樹的葉子結點進一步分裂時,損失函式應該減少的最小值,即如果某個葉子結點分裂前後,損失函式變化太小,就預剪枝不分裂該葉結點,這個值取值越大,演算法越保守  (3)max_depth[default=6] 取值[1,∞∞],經驗設定取值[4,8]的樹的最大深度,這個值取值越大,演算法越保守  (4)min_child_weight[default=1] 取值[0,∞∞],最小孩子的權重,為了防止過擬合,設定葉節點分裂時最少應該包含的樣本數,這個值取值越大,演算法越保守

(5)max_delta_step[default=0] 取值[0,∞∞],(如果該值為0,就是沒有限制;如果設為一個正數,可以使每一步更新更加保守通常情況下這一引數是不需要設定的,但是在logistic迴歸的訓練集中類極端不平衡的情況下,將這一引數的設定很有用,將該引數設為1-10可以控制每一步更新)

(6)subsample[default=1] 取值(0,1],經驗設定取值[0.6,0.9],構造每棵樹用到的“樣本”比例  (7)colsample_bylevel[default=1] 取值(0,1],經驗設定取值[0.6,0.9],樹在每層每個分裂所用“特徵”比例  (8)colsample_bytree[default=1] 取值(0,1],經驗設定取值[0.6,0.9],構造每棵樹所用的“特徵”比例  (如,決策樹生長時,不會用到全量的樣本,按比例抽取一部分樣本用於某棵樹的生成,樹每一層增長分裂選特徵時,可以用全量資料樣本去選最好的分裂特徵,也可用取樣的部分資料樣本去選最好的分裂特徵)

(9)lambda[default=1,alias:reg_lambda] L2正則化項權重(gblinear)  (10)alpha[default=0,alias:reg_alpha] L1正則化項權重(gblinear)

(11)tree_method[default=’auto’] 取值’auto’,’exact’,’approx’,這個引數一般情況下不需要調。序列的樹,在樹分裂時,xgboost package裡做了一些並行處理。‘exact’是掃描全量特徵進行選擇分裂,’approx’是利用histogram的方式做近似構造特徵,這種近似可以加速高維資料(資料特徵維度上千)的建模,但是有可能會犧牲一定的精度

(12)scale_pos_weight[default=1] 負樣本數/正樣本數=>樣本比例,將樣本比例傳入,調節正負樣本類別不平衡建模問題。把逾期樣本的設為1,利用scale_pos_weight引數,xgboost可以簡單粗暴的放大標記為1的權重;scale_pos_weight裡,pos即positive為正類,把逾期的標記成1即正類,對這個類放大

任務引數(task parameters):當前任務、場景相關,當前解決的是什麼樣的一個任務——迴歸問題、分類問題 (1)objective[default=reg:linear] 模型優化學習過程,需要最小化的損失函式  內建取值如下列表(高階用法——自己定義損失函式):  “reg:linear” –線性迴歸  “reg:logistic” –邏輯迴歸  “binary:logistic” –二分類的邏輯迴歸,返回預測的概率(不是類別)  “binary:logitraw” –輸出歸一化前的得分,11+e−θTz11+e−θTz裡的zz  “multi:softmax” –設定XGBoost做多分類,你需要同時設定num_class(類別數)的值  “multi:softprob” –輸出維度為ndata * nclass的概率矩陣

(2)eval_metric[ 預設是根據 損失函式/目標函式 自動選定的 ] 評估最後學習到的模型對任務處理的好壞(如,分類問題中,學習到的模型對測試集、訓練集樣本的分類正確率)  “rmse”–均方誤差  “mae”–絕對平均誤差(不可導)  “logloss”–對數似然損失(分類問題二元交叉熵損失)  “error”–二分類的錯誤率  “[email protected]”: 通過提供t為閾值(而不是0.5),計算錯誤率  “auc”–ROC曲線下方的面積(排序問題)  https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_curve

(3)seed[default=0] 隨機種子