我试图通过与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线程讨论这个问题。