xgboost 優勢和常規步驟


https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/

 

優勢

1、正則化

2、並行計算

3、可以處理空值(怎么處理?)

5、不是貪心算法。會先分到最大深度max_depth然后再進行剪枝。可以得到增益最有解。

6、有一個內置的交叉驗證

7、可以在原模型上接着訓練(fine_tuning? 遷移學習?)

 

短語參數命名規則。現在在xgboost的module中,有一個sklearn的封裝。在這個module中命名規則和sklearn的命名規則一致。

  1. eta –> learning_rate
  2. lambda –> reg_lambda
  3. alpha –> reg_alpha

 

參數

1、基本配置參數

booster: 基本使用gbtree,使用樹模型,這個效果一般

silent 通常設為0,方便我們查看每輪的loss

nthread: 多線程,如果不設置,算法會自動查看核心數進行並行計算。

 

2、Booster參數

eta(learning rate):  學習率 0.01-0.2

min_chile_weight: 子節點的最低sum of weights。 高的時候預防過擬合,太低了容易欠擬合。

max_depth:樹的最大深度,太高容易過擬合。通常3-10

gamma: loss閾值,loss降低超過這個閾值,就繼續切分

max_delta_step:In maximum delta step we allow each tree’s weight estimation to be.,通常不用

subsample: 通常0.5-1 構建每棵樹時,只取一部分樣本進行構建,避免過擬合

colsample_bytree:[0.5-1] 特征抽樣,

colsample_bylevel : 通常不用

lambda: L2 regularization term on weights (通常不用?)

alpha: L1 regularization term

scale_pos_weight

 

3、訓練參數

objective 二分類使用'binary:logistic'  多分類使用 'multi:softmax' 直接返回標簽, 也可以使用 'multi:softprob' 或者在訓練后使用predict_prob輸出類別的概率

eval_metric: 用來評估validation data:rmse ,mae,logloss,error ,merror ,mlogloss,auc

 

4、XGBoost允許在每一輪boosting迭代中使用交叉驗證。因此,可以方便地獲得最優boosting迭代次數。而如果使用sklearn的kfold和cross_val_score,這個是每次模型訓練只用一個固定的數據,而不是每輪boosting都交叉驗證。

 

 

 5、關於特征工程

XGBOOST是樹的boosting模型,由於樹的非線性特點,我們不需要對特征進行歸一化(正態分布),縮放(到01區間),

或者取log(這個存疑,我個人覺得取log可能有用?),但是我們應該關心創造特征。

比如過去5天內均值,去年同期的數值,環比增長,同比增長。還比如說在租房的場景中,房租/卧室數,這些跟業務非常相關的特征,其實是需要不斷的探索才能找到。XGBOOST里並不能幫我們獲取這樣的特征。

同深度學習對比,深度學習本質上也是依靠如LSTM,CNN等特殊的結構,去獲取到適合這個業務的特征。

然后類別特征在XGBOOST里面並不是特別好用,如果相關性不大可以去掉。如果類別數並不是很多,比如只有個位數的類別,則可以加上。如果類別數很多,可以考慮使用CATBOOSTING或者LIGHTGBM

 

xgboost無法處理類別特征,事實上,相比起強加類別特征,我們更需要思考類別特征背后的意義。比如數據有城市這一類別特征,但是城市背后的意義是什么,一線城市和二線城市區別在哪里?

我們可以進行量化,將城市量化成為有具體數字的特征,如GDP,面積,人口,人口/平方公里、GDP/人,GDP/平方公里,構造盡可能多的特征用來代表類別特征。這樣我們不會陷入標簽陷阱,如果一個城市很接近於1線城市,但是卻被分到了2線城市,

直接使用標簽會帶來很多問題。

還有比如星期特征,我們直覺上知道在個人消費領域,星期五六日是高峰,那么我們通過統計得到星期1、2、3、4、5、6、7他們的平均營業額,然后縮放到01區間,用來替代周幾這個特征。

而每個月的幾號同樣會有一些特征。

也就是說,假如把類別特征當成一個分類器的分類結果,我們不直接使用這個結果,而是轉而使用為了判別這個結果而使用到的特征。這個才是xgboost拿手的

 

6、如何查看feature importance?

1.xgb(原生).plot_importance(model)

2.model.get_booster().get_score(importance_type="weight")

 

'weight', 'gain', 'cover', 'total_gain', 'total_cover'

 但是這個feature_importance使用不同計算方法出來的結果可能完全不一樣https://towardsdatascience.com/be-careful-when-interpreting-your-features-importance-in-xgboost-6e16132588e7

一定使用合適的計算方法,否則可能會完全誤導特征工程的方向

 

6、數據量小的時候,early_stop_rounds一定要慎用!因為可能會讓模型訓練的不夠。最理想的情況,應該是每10個n_estimators就計算一次k折的val_loss,然后取平均,loss最小的我們用來作為n_estimators

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM