我有一个非常大的数据集(700 万行,54 个特征),我想拟合回归模型以使用XGBoost
. 为了训练最好的模型,我想使用BayesSearchCV
fromscikit-optimize
对不同的超参数组合重复运行拟合,直到找到性能最好的集合。
对于给定的一组超参数,XGBoost
训练一个模型需要很长时间,所以为了找到最好的超参数而不需要花费数天时间在训练折叠、超参数等的每个排列上,我想多线程XGBoost
和BayesSearchCV
. 我的代码的相关部分如下所示:
xgb_pipe = Pipeline([('clf', XGBRegressor(random_state = 42, objective='reg:squarederror', n_jobs = 1))])
xgb_fit_params = {'clf__early_stopping_rounds': 5, 'clf__eval_metric': 'mae', 'clf__eval_set': [[X_val.values, y_val.values]]}
xgb_kfold = KFold(n_splits = 5, random_state = 42)
xgb_unsm_cv = BayesSearchCV(xgb_pipe, xgb_params, cv = xgb_kfold, n_jobs = 2, n_points = 1, n_iter = 15, random_state = 42, verbose = 4, scoring = 'neg_mean_absolute_error', fit_params = xgb_fit_params)
xgb_unsm_cv.fit(X_train.values, y_train.values)
但是,我发现n_jobs > 1
在BayesSearchCV
通话中,fit 崩溃并且我收到以下错误:
TerminatedWorkerError: A worker process managed by the executor was unexpectedly terminated. This could be caused by a segmentation fault while calling the function or by an excessive memory usage causing the Operating System to kill the worker.
The exit codes of the workers are {SIGKILL(-9)}
每当我在调用中使用超过 1 个线程时,此错误就会持续存在BayesSearchCV
,并且与我提供的内存无关。
这是XGBoost
and之间的一些基本不兼容scikit-optimize
,还是可以强制两个包以某种方式一起工作?如果没有某种多线程优化方式,我担心拟合我的模型需要数周时间才能执行。我能做些什么来解决这个问题?