sklearn.cross_validation.cross_val_score 多个CPU?
我正在尝试通过交叉验证来给一个模型打分,使用的是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 个回答
3
把IPython笔记本、使用NumPy的代码(比如scikit-learn)和joblib/multiprocessing(当n_jobs != 1
时使用)放在一起用,会出现很多问题,比如崩溃、卡死和奇怪的错误信息。NumPy/SciPy社区知道这个问题,但据我所知,他们还没有找到具体出错的原因,更别提解决办法了。(*) 我建议你在IPython笔记本之外运行这段代码。
(*) 如果你感兴趣,可以去各个项目的邮件列表查找相关信息。这个问题可能是因为IPython使用了ZeroMQ这个多线程的C库,而Python的multiprocessing
在调用fork
时没有使用exec
,这违反了POSIX标准。类似的问题也会在NumPy在multiprocessing
环境中调用多线程线性代数库时出现。