我在使用计算机的所有核心进行XGBoost模型的训练和交叉验证时遇到了问题。
数据:
data_dmatrix = xgb.DMatrix(data=X,label=y, nthread=-1)dtrain = xgb.DMatrix(X_train, label=y_train, nthread=-1)dtest = xgb.DMatrix(X_test, label=y_test, nthread=-1)
模型:
xg_model = XGBRegressor(objective='reg:linear', colsample_bytree= 0.3, learning_rate = 0.2, max_depth = 5, alpha = 10, n_estimators = 100, subsample=0.4, booster = 'gbtree', n_jobs=-1)
然后,如果我使用以下代码进行模型训练:
xgb.train( xg_model.get_xgb_params(), dtrain, num_boost_round=500, evals=[(dtest, "Test")], early_stopping_rounds=200)
它运行正常,但只使用了一个线程来运行XGBoost。处理器使用率为25%。它忽略了n_jobs=-1
但是,如果我使用scikit-learn的实现进行交叉验证:
scores = cross_val_score(xg_model, X, y, cv=kfold, n_jobs=-1)
那么它会使用所有核心。如何强制xgb.train
和xgb.cv
使用所有核心?
回答:
最佳答案中提到的限制似乎并不是XGBoost的关键问题。我也遇到了n_jobs = -1
不起作用的情况。显然,这似乎与XGBoost的一个已知问题有关。请参见这里。
当我将n_jobs
设置为我需要的线程数时,多个核心的使用就发生了。使用n_jobs = 16
后,我的训练时间现在减少了近10倍。