1、XGBoost算法原理:
關於XGBoost算法的原理部分,有興趣的可以去看XGBoost的論文和陳天奇的PPT。
對英文有障礙的朋友可以去看劉建平博客總結的非常好。
2、XGBoost庫比較:
XGBoost有2種Python接口風格。一種是XGBoost自帶的原生Python API接口,另一種是sklearn風格的API接口,兩者的實現是基本一樣的,僅僅有細微的API使用的不同,主要體現在參數命名上,以及數據集的初始化上面。
xgboost庫要求我們必須要提供適合的Scipy環境,如果你是使用anaconda安裝的Python,你的Scipy環境應該是沒有什麼問題。
#windows安裝
pip install xgboost #安裝xgboost庫
pip install --upgrade xgboost #更新xgboost庫
#導入庫
import xgboost as xgb
現在,我們有兩種方式可以來使用我們的xgboost庫。
第一種方式,是直接使用xgboost庫自己的建模流程。
DMatrix
xgboost.DMatrix(data, label=None, weight=None, base_margin=None, missing=None, silent=False, feature_names=None, feature_types=None, nthread=None)
params
params {eta, gamma, max_depth, min_child_weight, max_delta_step, subsample, colsample_bytree,
colsample_bylevel, colsample_bynode, lambda, alpha, tree_method string, sketch_eps, scale_pos_weight, updater,
refresh_leaf, process_type, grow_policy, max_leaves, max_bin, predictor, num_parallel_tree}
train
xgboost.train(params, dtrain, num_boost_round=10, evals=(), obj=None, feval=None, maximize=False, early_stopping_rounds=None, evals_result=None, verbose_eval=True, xgb_model=None, callbacks=None)
predict
predict(data, output_margin=False, ntree_limit=0, pred_leaf=False, pred_contribs=False, approx_contribs=False, pred_interactions=False, validate_features=True, training=False)
其中最核心的,是DMtarix這個讀取數據的類,以及train()這個用於訓練的類。與sklearn把所有的參數都寫在類中的方式不同,xgboost庫中必須先使用字典設定參數集,再使用train來將參數及輸入,然後進行訓練。會這樣設計的原因,是因爲XGB所涉及到的參數實在太多,全部寫在xgb.train()中太長也容易出錯。
第二種方法,使用xgboost庫中的sklearn的API
xgboost.XGBRegressor (max_depth=3,
learning_rate=0.1,
n_estimators=100,
silent=True,
objective='reg:squarederror',
booster='gbtree',
n_jobs=1,
nthread=None,
gamma=0,
min_child_weight=1,
max_delta_step=0,
subsample=1,
colsample_bytree=1,
colsample_bylevel=1,
reg_alpha=0,
reg_lambda=1,
scale_pos_weight=1,
base_score=0.5,
random_state=0,
seed=None,
missing=None,
importance_type='gain',
**kwargs)
xgboost.XGBClassifier(max_depth=3,
learning_rate=0.1,
n_estimators=100,
silent=True,
objective='binary:logistic',
booster='gbtree',
n_jobs=1,
nthread=None,
gamma=0,
min_child_weight=1,
max_delta_step=0,
subsample=1,
colsample_bytree=1,
colsample_bylevel=1,
reg_alpha=0,
reg_lambda=1,
scale_pos_weight=1,
base_score=0.5,
random_state=0,
seed=None,
missing=None,
**kwargs
)
調用xgboost.train和調用sklearnAPI中的類XGBRegressor,需要輸入的參數是不同的,而且看起來相當的不同。但其實,這些參數只是寫法不同,功能是相同的。比如說,我們的params字典中的第一個參數eta,其實就是我們XGBRegressor裏面的參數learning_rate,他們的含義和實現的功能是一模一樣的。只不過在sklearnAPI中,開發團隊友好地幫助我們將參數的名稱調節成了與sklearn中其他的算法類更相似的樣子。
所以對我們來說,使用xgboost中設定的建模流程來建模,和使用sklearnAPI中的類來建模,模型效果是比較相似的,但是xgboost庫本身的運算速度(尤其是交叉驗證)以及調參手段比sklearn要簡單。
3、XGBoost庫參數總結
參數含義 | xgb.train() |
XGBRegressor() |
---|---|---|
集成中弱評估器的數量 | num_round,默認10 | n_estimators,默認100 |
訓練中是否打印每次訓練的結果 | slient,默認False | slient,默認True |
隨機抽樣的時候抽取的樣本比例,範圍(0,1] | subsample,默認1 | subsample,默認1 |
集成中的學習率,又稱爲步長以控制迭代速率,常用於防止過擬合 | eta,默認0.3取值範圍[0,1] | learning_rate,默認0.1取值範圍[0,1] |
使用哪種弱評估器 | xgb_model 可以輸入gbtree,gblinear或dart。輸入的評估器不同,使用的params參數也不同,每種評估器都有自己的params列表。評估器必須於param參數相匹配,否則報錯。 | booster 可以輸入gbtree,gblinear或dart。gbtree代表梯度提升樹,dart是Dropouts meet Multiple Additive Regression Trees,可譯爲拋棄提升樹,在建樹的過程中會拋棄一部分樹,比梯度提升樹有更好的防過擬合功能。輸入gblinear使用線性模型。 |
損失函數 |
|
objective:默認reg:squarederror 使用均方誤差,迴歸時使用 |
L1正則項的參數 | alpha,默認0,取值範圍[0, +∞] | reg_alpha,默認0,取值範圍[0, +∞] |
L2正則項的參數 | lambda,默認1,取值範圍[0, +∞] | reg_lambda,默認1,取值範圍[0, +∞] |
複雜度的懲罰項 | gamma,默認0,取值範圍[0, +∞] | gamma,默認0,取值範圍[0, +∞] |
樹的最大深度 | max_depth,默認6 | max_depth,默認6 |
每次生成樹時隨機抽樣特徵的比例 | colsample_bytree,默認1 | colsample_bytree,默認1 |
每次生成樹的一層時隨機抽樣特徵的比例 | colsample_bylevel,默認1 | colsample_bylevel,默認1 |
每次生成一個葉子節點時隨機抽樣特徵的比例 | colsample_bynode,默認1 | N.A. |
一個葉子節點上所需要的最小即葉子節點上的二階導數之和類似於樣本權重 | min_child_weight,默認1 | min_child_weight,默認1 |
控制正負樣本比例,表示爲負/正樣本比例在樣本不平衡問題中使用 | scale_pos_weight,默認1 | scale_pos_weight,默認1 |
更多調參細節可以到我的GitHub上面查看。