sklearn.cross_validation.cross_val_score multiple cpu?



我试图通过与sklearn.cross_validation.cross_val_score进行交叉验证来获得模型的分数。根据它的文档,参数n_jobs设置可以使用的cpu数量。但是,当我将其设置为-1(或其他不等于1的值)时,程序报错:

AttributeError: '_MainProcess'对象没有属性'_daemonic'

下面是一个最小的示例,以及相应的错误消息。
import sklearn.datasets
import sklearn.cross_validation
import sklearn.linear_model
d = sklearn.datasets.load_iris()
X = d.data
y = d.target
sklearn.cross_validation.cross_val_score(sklearn.linear_model.LogisticRegression(), X, y, n_jobs=-1)

AttributeError                            
Traceback (most recent call last)
<ipython-input-57-3b5f62e97b0d> in <module>()
    ----> 1 sklearn.cross_validation.cross_val_score(gb_clf, train, train_label, n_jobs=2)
/usr/lib/python3.4/site-packages/sklearn/cross_validation.py in cross_val_score(estimator, X, y,     scoring, cv, n_jobs, verbose, fit_params, score_func, pre_dispatch)
   1150         delayed(_cross_val_score)(clone(estimator), X, y, scorer, train, test,
   1151                                   verbose, fit_params)
-> 1152         for train, test in cv)
   1153     return np.array(scores)
   1154 
/usr/lib/python3.4/site-packages/sklearn/externals/joblib/parallel.py in __call__(self, iterable)
    468             self._pool = None
    469         else:
--> 470             if multiprocessing.current_process()._daemonic:
    471                 # Daemonic processes cannot have children
    472                 n_jobs = 1
AttributeError: '_MainProcess' object has no attribute '_daemonic'

附加信息:我在IPython笔记本模式下运行这个脚本。它也出现在控制台模式下,或在正常的python解释器下(根据@larsmans的评论)。

IPython notebook, NumPy-heavy代码(如scikit-learn)和joblib/multiprocessing(当n_jobs != 1时使用)的组合是有问题的,并且可能导致各种崩溃,冻结和奇怪的错误消息。NumPy/SciPy社区已经意识到了这一点,但是他们还没有诊断出到底是什么问题,更不用说修复了。(*)我建议你在IPython笔记本之外运行这段代码。

(*)如果您感兴趣,请务必在邮件列表中搜索各种项目。这个问题可能源于Python对ZeroMQ(一个多线程C库)的使用,以及Python multiprocessing调用fork而不调用exec的习惯,这违反了POSIX。当NumPy在multiprocessing上下文中调用多线程线性代数库时,也会出现类似的问题。

你必须保护你的代码:

if __name__ == "__main__":
    [Your code]

joblib似乎有问题。当涉及到多个处理(n_jobs> 1)时,它是并行的。关于joblib文档中的更多信息,还有一个Github线程讨论这个问题。

相关内容

  • 没有找到相关文章