我遇到了一次无声无息的崩溃,我把它归结为破坏了线程安全。
以下是发生的细节。首先,我定义了一个自定义的 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
是一个数组 NaN
s. 在做了一些错误的追问之后,我注意到,设置 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'
意味着崩溃不会被静音。