2016-11-25 2 views
3

Я сталкиваюсь с следующими проблемами с использованием GridSearchCV: он дает мне параллельную ошибку при использовании n_jobs > 1. В то же время n_jobs > 1 отлично работает с такими моделями, как RadonmForestClassifier.Параллельная ошибка с GridSearchCV, отлично работает с другими методами

Ниже приведен простой рабочий пример, показывающий ошибки:

train = np.random.rand(100,10) 
targ = np.random.randint(0,2,100) 

clf = ensemble.RandomForestClassifier(n_jobs = 2) 
clf.fit(train,targ) 
train = np.random.rand(100,10) 
targ = np.random.randint(0,2,100) 
​ 
clf = ensemble.RandomForestClassifier(n_jobs = 2) 
clf.fit(train,targ) 
Out[349]: RandomForestClassifier(bootstrap=True, class_weight=None,  criterion='gini', 
      max_depth=None, max_features='auto', max_leaf_nodes=None, 
      min_impurity_split=1e-07, min_samples_leaf=1, 
      min_samples_split=2, min_weight_fraction_leaf=0.0, 
      n_estimators=10, n_jobs=2, oob_score=False, random_state=None, 
      verbose=0, warm_start=False) 

этот пример работает отлично.

Между тем следующее не работает:

clf = ensemble.RandomForestClassifier() 
param_grid = {'n_estimators': [10,20]} 
grid_s= model_selection.GridSearchCV(clf, param_grid=param_grid_gb,n_jobs=-1,verbose=1) 
grid_s.fit(train, targ) 

И дает следующее сообщение об ошибке:

Fitting 3 folds for each of 2 candidates, totalling 6 fits 

ImportErrorTraceback (most recent call last) 
<ipython-input-351-b8bb45396026> in <module>() 
     2 param_grid = {'n_estimators': [10,20]} 
     3 grid_s= model_selection.GridSearchCV(clf, param_grid=param_grid_gb,n_jobs=-1,verbose=1) 
----> 4 grid_s.fit(train, targ) 

/root/anaconda3/envs/python2/lib/python2.7/site-packages/sklearn/model_selection/_search.pyc in fit(self, X, y, groups) 
    943    train/test set. 
    944   """ 
--> 945   return self._fit(X, y, groups, ParameterGrid(self.param_grid)) 
    946 
    947 

/root/anaconda3/envs/python2/lib/python2.7/site-packages/sklearn/model_selection/_search.pyc in _fit(self, X, y, groups, parameter_iterable) 
    562         return_times=True, return_parameters=True, 
    563         error_score=self.error_score) 
--> 564   for parameters in parameter_iterable 
    565   for train, test in cv_iter) 
    566 

/root/anaconda3/envs/python2/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in __call__(self, iterable) 
    726   self._aborting = False 
    727   if not self._managed_backend: 
--> 728    n_jobs = self._initialize_backend() 
    729   else: 
    730    n_jobs = self._effective_n_jobs() 

/root/anaconda3/envs/python2/lib/python2.7/site-packages/sklearn/externals/joblib/parallel.pyc in _initialize_backend(self) 
    538   try: 
    539    return self._backend.configure(n_jobs=self.n_jobs, parallel=self, 
--> 540           **self._backend_args) 
    541   except FallbackToBackend as e: 
    542    # Recursively initialize the backend in case of requested fallback. 

/root/anaconda3/envs/python2/lib/python2.7/site-packages/sklearn/externals/joblib/_parallel_backends.pyc in configure(self, n_jobs, parallel, **backend_args) 
    297   if already_forked: 
    298    raise ImportError(
--> 299     '[joblib] Attempting to do parallel computing ' 
    300     'without protecting your import on a system that does ' 
    301     'not support forking. To use parallel-computing in a ' 

ImportError: [joblib] Attempting to do parallel computing without protecting your import on a system that does not support forking. To use parallel-computing in a script, you must protect your main loop using "if __name__ == '__main__'". Please see the joblib documentation on Parallel for more information 

ответ

8

Я думаю, что вы используете окна. Вам нужно обернуть поиск сетки в функции, а затем вызвать внутри __name__ == '__main__'. Joblib parallel n_jobs=-1 определяет количество заданий на использование, которые параллельно не работают в окнах все время.

Try оберточной поиск сетки в функции:

def somefunction(): 
    clf = ensemble.RandomForestClassifier() 
    param_grid = {'n_estimators': [10,20]} 
    grid_s= model_selection.GridSearchCV(clf, param_grid=param_grid_gb,n_jobs=-1,verbose=1) 
    grid_s.fit(train, targ) 
    return grid_s 

if __name__ == '__main__': 
    somefunction() 

Или:

if __name__ == '__main__': 
    clf = ensemble.RandomForestClassifier() 
    param_grid = {'n_estimators': [10,20]} 
    grid_s= model_selection.GridSearchCV(clf, param_grid=param_grid_gb,n_jobs=-1,verbose=1) 
    grid_s.fit(train, targ) 
+0

Спасибо, я постараюсь это, но в данный момент я нахожусь на сервере Linux. Редактировать: я просто попробовал ваше решение, и это все равно дает мне ту же ошибку. – Alessandro

+0

@ Alessandro работает, если все внутри основного? (см. отредактированный ответ). –

+0

нет, такой же ошибка! Более странно то, что сама модель работает. – Alessandro

Смежные вопросы