在 `sklearn` 分类器中调用 `scipy.optimize.minimize` 会使它在并行作业中中断

Calling `scipy.optimize.minimize` inside an `sklearn` classifier makes it break in a parallel job

我 运行 陷入无声崩溃,我将其归因于破坏线程安全。

这是发生的事情的详细信息。首先,我定义了一个自定义 sklearn 估计器,它在拟合时使用 scipy.optimize,类似于:

class CustomClassifier(BaseEstimator, ClassifierMixin):

    ...

    def fit(self, X, y=None):
        ...
        #optimizes with respect to some metric by using scipy.optimize.minimize
        ...
        return self

    ...

下游,我运行对其性能进行了交叉验证的测量,看起来像:

cv_errors = cross_val_score( CustomClassifier(), X, y, n_jobs=-1)

cross_val_scoresklearn 开箱即用的功能,n_jobs=-1 意味着我要求它在尽可能多的可用内核上并行化。

输出是我的cv_errors是一个NaN的数组。在进行了一些错误追踪之后,我注意到设置 n_jobs=1 为我提供了一个由错误填充的数组,正如预期的那样。看起来并行化步骤加上 scipy.optimize.minimize 的使用是罪魁祸首。

有没有办法让它并行工作?

我想我找到了解决办法:

with parallel_backend('multiprocessing'):
    cv_errors = cross_val_score( CustomClassifier(), X, y, n_jobs=-1, error_score='raise')

这里似乎很安全。如果有人解释了幕后发生的事情,以及为什么 'locky' 后端中断而 'multiprocessing' 没有中断,我正在倾听。此外,设置 error_score='raise' 意味着崩溃不会被静音。