1.首先導入包
import xgboost as xgb
2.使用以下的函數實現交叉驗證訓練xgboost。
bst_cvl = xgb.cv(xgb_params, dtrain, num_boost_round=50,
nfold=3, seed=0, feval=xg_eval_mae, maximize=False, early_stopping_rounds=10)
3.cv參數說明:函數cv的第一個參數是對xgboost訓練器的參數的設置,具體見以下
xgb_params = { 'seed': 0, 'eta': 0.1, 'colsample_bytree': 0.5, 'silent': 1, 'subsample': 0.5, 'objective': 'reg:linear', 'max_depth': 5, 'min_child_weight': 3 }
參數說明如下:
Xgboost參數
- 'booster':'gbtree',
- 'objective': 'multi:softmax', 多分類的問題
- 'num_class':10, 類別數,與 multisoftmax 並用
- 'gamma':損失下降多少才進行分裂,gammar越大越不容易過擬合。
- 'max_depth':樹的最大深度。增加這個值會使模型更加復雜,也容易出現過擬合,深度3-10是合理的。
- 'lambda':2, 控制模型復雜度的權重值的L2正則化項參數,參數越大,模型越不容易過擬合。
- 'subsample':0.7, 隨機采樣訓練樣本
- 'colsample_bytree':0.7, 生成樹時進行的列采樣
- 'min_child_weight':正則化參數. 如果樹分區中的實例權重小於定義的總和,則停止樹構建過程。
- 'silent':0 ,設置成1則沒有運行信息輸出,最好是設置為0.
- 'eta': 0.007, 如同學習率
- 'seed':1000,
- 'nthread':7, cpu 線程數
4.cv參數說明:dtrain是使用下面的函數DMatrix得到的訓練集
dtrain = xgb.DMatrix(train_x, train_y)
5.cv參數說明:feval參數是自定義的誤差函數
def xg_eval_mae(yhat, dtrain): y = dtrain.get_label() return 'mae', mean_absolute_error(np.exp(y), np.exp(yhat))
6.cv參數說明:nfold是交叉驗證的折數, early_stopping_round是多少次模型沒有提升后就結束, num_boost_round是加入的決策樹的數目。
7. bst_cv是cv返回的結果,是一個DataFram的類型,其列為以下列組成

8.自定義評價函數:具體見這個博客:https://blog.csdn.net/wl_ss/article/details/78685984
def customedscore(preds, dtrain): label = dtrain.get_label() pred = [int(i>=0.5) for i in preds] confusion_matrixs = confusion_matrix(label, pred) recall =float(confusion_matrixs[0][0]) / float(confusion_matrixs[0][1]+confusion_matrixs[0][0]) precision = float(confusion_matrixs[0][0]) / float(confusion_matrixs[1][0]+confusion_matrixs[0][0]) F = 5*precision* recall/(2*precision+3*recall)*100 return 'FSCORE',float(F)
這種自定義的評價函數可以用於XGboost的cv函數或者train函數中的feval參數
還有一種定義評價函數的方式,如下
def mae_score(y_ture, y_pred): return mean_absolute_error(y_true=np.exp(y_ture), y_pred=np.exp(y_pred))
這種定義的函數可以用於gridSearchCV函數的scorning參數中。
xgboost調參步驟
第一步:確定n_estimators參數
首先初始化參數的值
xgb1 = XGBClassifier(max_depth=3, learning_rate=0.1, n_estimators=5000, silent=False, objective='binary:logistic', booster='gbtree', n_jobs=4, gamma=0, min_child_weight=1, subsample=0.8, colsample_bytree=0.8, seed=7)
用cv函數求得參數n_estimators的最優值。
cv_result = xgb.cv(xgb1.get_xgb_params(), dtrain, num_boost_round=xgb1.get_xgb_params()['n_estimators'], nfold=5, metrics='auc', early_stopping_rounds=50, callbacks=[xgb.callback.early_stop(50), xgb.callback.print_evaluation(period=1,show_stdv=True)])
第二步、確定max_depth和min_weight參數
param_grid = {'max_depth':[1,2,3,4,5],
'min_child_weight':[1,2,3,4,5]}
grid_search = GridSearchCV(xgb1,param_grid,scoring='roc_auc',iid=False,cv=5)
grid_search.fit(train[feature_name],train['label'])
print('best_params:',grid_search.best_params_)
print('best_score:',grid_search.best_score_)
第三步、gamma參數調優
首先將上面調好的參數設置好,如下所示
xgb1 = XGBClassifier(max_depth=2, learning_rate=0.1, n_estimators=33, silent=False, objective='binary:logistic', booster='gbtree', n_jobs=4, gamma=0, min_child_weight=9, subsample=0.8, colsample_bytree=0.8, seed=7)
然后繼續網格調參
param_grid = {'gamma':[1,2,3,4,5,6,7,8,9]}
grid_search = GridSearchCV(xgb1,param_grid,scoring='roc_auc',iid=False,cv=5)
grid_search.fit(train[feature_name],train['label'])
print('best_params:',grid_search.best_params_)
print('best_score:',grid_search.best_score_)
第四步、調整subsample與colsample_bytree參數
param_grid = {'subsample':[i/10.0 for i in range(5,11)],
'colsample_bytree':[i/10.0 for i in range(5,11)]}
grid_search = GridSearchCV(xgb1,param_grid,scoring='roc_auc',iid=False,cv=5)
grid_search.fit(train[feature_name],train['label'])
print('best_params:',grid_search.best_params_)
print('best_score:',grid_search.best_score_)
第五步、調整正則化參數
param_grid = {'reg_lambda':[i/10.0 for i in range(1,11)]}
grid_search = GridSearchCV(xgb1,param_grid,scoring='roc_auc',iid=False,cv=5)
grid_search.fit(train[feature_name],train['label'])
print('best_params:',grid_search.best_params_)
print('best_score:',grid_search.best_score_)
最后我們使用較低的學習率以及使用更多的決策樹,可以用CV來實現這一步驟
xgb1 = XGBClassifier(max_depth=2, learning_rate=0.01, n_estimators=5000, silent=False, objective='binary:logistic', booster='gbtree', n_jobs=4, gamma=2.1, min_child_weight=9, subsample=0.8, colsample_bytree=0.8, seed=7, )
- 僅僅靠參數的調整和模型的小幅優化,想要讓模型的表現有個大幅度提升是不可能的。
- 要想讓模型的表現有一個質的飛躍,需要依靠其他的手段,諸如,特征工程(feature egineering) ,模型組合(ensemble of model),以及堆疊(stacking)等
具體的關於調參的知識請看以下鏈接:
https://www.cnblogs.com/TimVerion/p/11436001.html
http://www.pianshen.com/article/3311175716/
