在`sklearn`分类器中调用`scipy.optimization.minimittle`会使它在并行作业中崩溃

问题描述 投票:0回答:1

我遇到了一次无声无息的崩溃,我把它归结为破坏了线程安全。

以下是发生的细节。首先,我定义了一个自定义的 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_score 是... sklearn 开箱即用的功能。n_jobs=-1 意味着我要求它在尽可能多的内核上进行并行化。

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

有没有办法让它同时工作?

python-3.x scikit-learn scipy thread-safety scipy-optimize
1个回答
0
投票

我想我在这里找到了一个方法。

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

看来这里是安全的 如果有人能解释背后发生了什么,以及为什么'locky'后端中断而'multiprocessing'没有,我正在听。另外,设置 error_score='raise' 意味着崩溃不会被静音。

© www.soinside.com 2019 - 2024. All rights reserved.