sklearn.cross_validation.cross_val_score多个cpu?

时间:2014-06-30 04:45:58

标签: python multiprocessing ipython scikit-learn cross-validation

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

  

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

下面附有一个最小的示例,以及相应的错误消息。

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评论)。

2 个答案:

答案 0 :(得分:3)

IPython笔记本,NumPy重型代码(如scikit-learn)和joblib /多处理(n_jobs != 1时使用)的组合存在问题,可能导致各种崩溃,冻结和奇怪的错误消息。 NumPy / SciPy社区已经意识到了这一点,但AFAIK尚未确定究竟出现了什么问题,更不用说产生修复了。(*)我建议你在IPython笔记本之外运行这段代码。

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

答案 1 :(得分:1)

您必须保护您的代码:

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

当涉及多个处理(n_jobs&gt; 1)时,joblib.Parallel似乎存在问题。有关joblib documentation中有关该问题的更多信息,还有Github thread讨论该问题。