XGBoost 和 scikit-optimize:BayesSearchCV 和 XGBRegressor 不兼容 - 为什么?
XGBoost and scikit-optimize: BayesSearchCV and XGBRegressor are incompatible - why?
我有一个非常大的数据集(700 万行,54 个特征),我想使用 XGBoost
拟合回归模型。为了训练最好的模型,我想使用 BayesSearchCV
从 scikit-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)
但是,我发现当 BayesSearchCV
调用中的 n_jobs > 1
时,拟合崩溃并且出现以下错误:
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)}
每当我在 BayesSearchCV
调用中使用超过 1 个线程时,此错误仍然存在,并且与我提供的内存无关。
这是 XGBoost
和 scikit-optimize
之间的一些根本不兼容,还是两个包都可以以某种方式被迫一起工作?如果没有某种多线程优化方法,我担心拟合模型需要数周时间才能执行。我该怎么做才能解决这个问题?
我认为错误与库的不兼容无关。相反,由于您要求两个不同的多线程操作,因此您 运行 内存不足,因为您的程序试图将完整的数据集放入您的 RAM 中,不是一次,而是 两次 用于多个实例(取决于线程)。
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)}
分段错误是指系统 运行 可用内存不足的错误。
请注意,XGBoost 是一个 RAM 饥渴的野兽,将它与另一个多线程操作结合起来势必会付出代价(个人而言,不建议在日常驱动程序机器上使用。)
最可行的解决方案可能是使用 Google 的 TPU 或其他一些云服务(注意成本),或者使用一些技术来减少数据集的大小,以便使用一些统计数据进行处理kaggle notebook and Data Science StackExchange Article.
中提到的技术
想法是,要么升级硬件(货币成本),直接使用单线程 BayesianCV(时间成本),要么使用最适合您的技术缩小数据规模。
最后,答案仍然是这些库可能是兼容的,只是数据对于可用的 RAM 来说太大了。
我有一个非常大的数据集(700 万行,54 个特征),我想使用 XGBoost
拟合回归模型。为了训练最好的模型,我想使用 BayesSearchCV
从 scikit-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)
但是,我发现当 BayesSearchCV
调用中的 n_jobs > 1
时,拟合崩溃并且出现以下错误:
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)}
每当我在 BayesSearchCV
调用中使用超过 1 个线程时,此错误仍然存在,并且与我提供的内存无关。
这是 XGBoost
和 scikit-optimize
之间的一些根本不兼容,还是两个包都可以以某种方式被迫一起工作?如果没有某种多线程优化方法,我担心拟合模型需要数周时间才能执行。我该怎么做才能解决这个问题?
我认为错误与库的不兼容无关。相反,由于您要求两个不同的多线程操作,因此您 运行 内存不足,因为您的程序试图将完整的数据集放入您的 RAM 中,不是一次,而是 两次 用于多个实例(取决于线程)。
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)}
分段错误是指系统 运行 可用内存不足的错误。
请注意,XGBoost 是一个 RAM 饥渴的野兽,将它与另一个多线程操作结合起来势必会付出代价(个人而言,不建议在日常驱动程序机器上使用。)
最可行的解决方案可能是使用 Google 的 TPU 或其他一些云服务(注意成本),或者使用一些技术来减少数据集的大小,以便使用一些统计数据进行处理kaggle notebook and Data Science StackExchange Article.
中提到的技术想法是,要么升级硬件(货币成本),直接使用单线程 BayesianCV(时间成本),要么使用最适合您的技术缩小数据规模。
最后,答案仍然是这些库可能是兼容的,只是数据对于可用的 RAM 来说太大了。