sklearn.cross_validation.cross_val_score 多个CPU?

1 投票
2 回答
3162 浏览
提问于 2025-04-18 11:32

我正在尝试通过交叉验证来给一个模型打分,使用的是sklearn库里的cross_val_score函数。根据它的文档,参数n_jobs可以设置你想用多少个CPU来处理。不过,当我把这个参数设置为-1(或者其他不等于1的值)时,程序就报错了,提示:

AttributeError: '_MainProcess' object has no attribute '_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的评论)。

2 个回答

1

你需要保护你的代码:

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

在使用joblib.Parallel进行多进程处理时(也就是n_jobs大于1),似乎会出现一些问题。关于这个问题的更多信息,可以查看joblib的文档,另外还有一个GitHub讨论帖在讨论这个问题。

3

把IPython笔记本、使用NumPy的代码(比如scikit-learn)和joblib/multiprocessing(当n_jobs != 1时使用)放在一起用,会出现很多问题,比如崩溃、卡死和奇怪的错误信息。NumPy/SciPy社区知道这个问题,但据我所知,他们还没有找到具体出错的原因,更别提解决办法了。(*) 我建议你在IPython笔记本之外运行这段代码。

(*) 如果你感兴趣,可以去各个项目的邮件列表查找相关信息。这个问题可能是因为IPython使用了ZeroMQ这个多线程的C库,而Python的multiprocessing在调用fork时没有使用exec,这违反了POSIX标准。类似的问题也会在NumPy在multiprocessing环境中调用多线程线性代数库时出现。

撰写回答