優勢
1、正則化
2、並行計算
3、可以處理空值(怎么處理?)
5、不是貪心算法。會先分到最大深度max_depth然后再進行剪枝。可以得到增益最有解。
6、有一個內置的交叉驗證
7、可以在原模型上接着訓練(fine_tuning? 遷移學習?)
短語參數命名規則。現在在xgboost的module中,有一個sklearn的封裝。在這個module中命名規則和sklearn的命名規則一致。
- eta –> learning_rate
- lambda –> reg_lambda
- 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
