Scikit-Learn:并行的几个 X-Vals?
Scikit-Learn: Several X-Vals in parallel?
我想为我的数据尝试几种不同的模型并对其进行交叉验证,因此结果比较可靠。
对于我的交叉验证,我调用:
cross_val_score(model, X, y, scoring = 'mean_squared_error', cv=kf, n_jobs = -1)
并行执行我的 10 折交叉验证。由于我 运行 所在的机器有 40 个内核和足够的内存,我想并行尝试 "model" 的四个不同值,每个值都进行 10 倍交叉验证。
但是,当我尝试按以下方式使用 joblib 执行此操作时,出现错误:
results = Parallel(n_jobs = num_jobs)(delayed(crossVal)(model) for model in models)
/usr/local/lib/python2.7/dist-packages/sklearn/cross_validation.py:1433: UserWarning: Multiprocessing-backed parallel loops cannot be nested, setting n_jobs=1 for train, test in cv)
其中crossVal是我定义的一个方法,主要是调用cross_val_score.
有没有一种无需手动启动多个不同 python 文件的优雅方法?
Joblib 可以使用多处理和线程后端,默认情况下它使用多处理(这是因为 CPython 实现,其中线程仅在某些特定情况下会更快,我不想进入详情在这里,你可以找到大量关于 CPython 和 Python GIL 的文章。
这不是错误,它只是一个警告,告诉您您试图从进程创建进程。 IE。通过这条线:
results = Parallel(n_jobs = num_jobs)(delayed(crossVal)(model) for model in models)
您已经生成了一些进程 (n_jobs),然后 crossVal
中的每个 cross_val_score
都尝试做同样的事情(生成一些进程),因为cross_val_score 默认情况下使用 multoprocessing。 Joblib 不允许在多处理后端做这样的事情。因此 AFAIK 它在单个进程中给出此警告和 运行s 嵌套并行循环,即 cross_val_score
内部现在 运行 在单线程中,但仍然是你的 crossVal
函数 运行s 处于多处理模式。
如果你摆脱这两个多处理周期中的任何一个,你可以避免这个警告,即你可以通过调用摆脱嵌套的多处理:
cross_val_score(..., n_jobs=1)
在你的 crossVal
函数中,或者你可以在简单循环中多次调用 default cross_val_score
,无需多处理,然后聚合结果,例如:
results = [cross_val_score(estimator = est, ...) for est in estimators]
在第一种情况下,您可以同时 运行 min(n_models, n_jobs)
(在您原来的情况下,当 joblib 发出警告时,您已经隐含地执行了此操作),在第二种情况下 - min(n_folds, n_cores)
。如果你想 运行 min(n_jobs, n_models*n_folds)
你应该使用 GridSearchCV,因为它在内部以这种方式产生工作:
out = Parallel(
n_jobs=self.n_jobs, verbose=self.verbose,
pre_dispatch=pre_dispatch
)(
delayed(_fit_and_score)(clone(base_estimator), X, y, self.scorer_,
train, test, self.verbose, parameters,
self.fit_params, return_parameters=True,
error_score=self.error_score)
for parameters in parameter_iterable
for train, test in cv)
我想为我的数据尝试几种不同的模型并对其进行交叉验证,因此结果比较可靠。
对于我的交叉验证,我调用:
cross_val_score(model, X, y, scoring = 'mean_squared_error', cv=kf, n_jobs = -1)
并行执行我的 10 折交叉验证。由于我 运行 所在的机器有 40 个内核和足够的内存,我想并行尝试 "model" 的四个不同值,每个值都进行 10 倍交叉验证。
但是,当我尝试按以下方式使用 joblib 执行此操作时,出现错误:
results = Parallel(n_jobs = num_jobs)(delayed(crossVal)(model) for model in models)
/usr/local/lib/python2.7/dist-packages/sklearn/cross_validation.py:1433: UserWarning: Multiprocessing-backed parallel loops cannot be nested, setting n_jobs=1 for train, test in cv)
其中crossVal是我定义的一个方法,主要是调用cross_val_score.
有没有一种无需手动启动多个不同 python 文件的优雅方法?
Joblib 可以使用多处理和线程后端,默认情况下它使用多处理(这是因为 CPython 实现,其中线程仅在某些特定情况下会更快,我不想进入详情在这里,你可以找到大量关于 CPython 和 Python GIL 的文章。
这不是错误,它只是一个警告,告诉您您试图从进程创建进程。 IE。通过这条线:
results = Parallel(n_jobs = num_jobs)(delayed(crossVal)(model) for model in models)
您已经生成了一些进程 (n_jobs),然后 crossVal
中的每个 cross_val_score
都尝试做同样的事情(生成一些进程),因为cross_val_score 默认情况下使用 multoprocessing。 Joblib 不允许在多处理后端做这样的事情。因此 AFAIK 它在单个进程中给出此警告和 运行s 嵌套并行循环,即 cross_val_score
内部现在 运行 在单线程中,但仍然是你的 crossVal
函数 运行s 处于多处理模式。
如果你摆脱这两个多处理周期中的任何一个,你可以避免这个警告,即你可以通过调用摆脱嵌套的多处理:
cross_val_score(..., n_jobs=1)
在你的 crossVal
函数中,或者你可以在简单循环中多次调用 default cross_val_score
,无需多处理,然后聚合结果,例如:
results = [cross_val_score(estimator = est, ...) for est in estimators]
在第一种情况下,您可以同时 运行 min(n_models, n_jobs)
(在您原来的情况下,当 joblib 发出警告时,您已经隐含地执行了此操作),在第二种情况下 - min(n_folds, n_cores)
。如果你想 运行 min(n_jobs, n_models*n_folds)
你应该使用 GridSearchCV,因为它在内部以这种方式产生工作:
out = Parallel(
n_jobs=self.n_jobs, verbose=self.verbose,
pre_dispatch=pre_dispatch
)(
delayed(_fit_and_score)(clone(base_estimator), X, y, self.scorer_,
train, test, self.verbose, parameters,
self.fit_params, return_parameters=True,
error_score=self.error_score)
for parameters in parameter_iterable
for train, test in cv)