XGBoost训练,n_jobs = -1,未使用所有内核

时间:2019-10-11 10:31:47

标签: python-3.x machine-learning xgboost

我在使用计算机上的所有内核进行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.trainxgb.cv使用所有内核?

2 个答案:

答案 0 :(得分:2)

Boosting是一种固有的顺序算法,您只能在训练t+1之后训练树1..t。因此,对于并行化,如here所述,XGBoost“在单个树内进行并行化”。使用max_depth=5时,您的树很小,因此并行化树构建步骤并不明显。

cross_val_score但是正在并行训练K个不同的XGBoost 模型。这些模型彼此完全独立。根据我的经验,使用cross_val_scoreGridSearchCV进行这种粗粒度的并行处理总是比并行处理单个模型要快。

一种替代方法是使用随机森林变量:XGBRFClassifier。与提升算法不同,像cross_val_score一样,随机森林为embarrassingly parallel

答案 1 :(得分:1)

所选最佳答案中提到的约束似乎不是 XGBoost 的关键问题。我也遇到过 n_jobs = -1 不起作用的问题。显然,这似乎与 XGBoost 中的一个已知问题有关。见here

当我将 n_jobs 设置为我需要的线程数时,发生了多核的使用。使用 n_jobs = 16,我的训练时间现在减少了近 10 倍。