我在使用计算机上的所有内核进行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)
工作正常,但仅使用1个线程来运行xgboost。
处理器已开启25%。它会忽略n_jobs=-1
但是,如果我使用scikit-learn实现进行交叉验证:
scores = cross_val_score(xg_model, X, y, cv=kfold, n_jobs=-1)
比它使用所有内核。
如何强制xgb.train
和xgb.cv
使用所有内核?
答案 0 :(得分:2)
Boosting是一种固有的顺序算法,您只能在训练t+1
之后训练树1..t
。因此,对于并行化,如here所述,XGBoost“在单个树内进行并行化”。使用max_depth=5
时,您的树很小,因此并行化树构建步骤并不明显。
cross_val_score
但是正在并行训练K个不同的XGBoost 模型。这些模型彼此完全独立。根据我的经验,使用cross_val_score
或GridSearchCV
进行这种粗粒度的并行处理总是比并行处理单个模型要快。
一种替代方法是使用随机森林变量:XGBRFClassifier
。与提升算法不同,像cross_val_score
一样,随机森林为embarrassingly parallel。
答案 1 :(得分:1)
所选最佳答案中提到的约束似乎不是 XGBoost 的关键问题。我也遇到过 n_jobs = -1
不起作用的问题。显然,这似乎与 XGBoost 中的一个已知问题有关。见here。
当我将 n_jobs
设置为我需要的线程数时,发生了多核的使用。使用 n_jobs = 16
,我的训练时间现在减少了近 10 倍。