我试图通过使用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评论)。
答案 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讨论该问题。