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)