Scikit-learn: GridSearchCV.fit(...,n_job=-1) peut contenir un bogue de parallélisme

Créé le 11 sept. 2020  ·  3Commentaires  ·  Source: scikit-learn/scikit-learn

Avant de soumettre un bogue, assurez-vous que le problème n'a pas déjà été résolu en recherchant dans les anciens numéros.

Décrivez le bogue

L'appel de GridSearchCV.fit() avec n_jobs=-1 lève l'exception ' OSError: [Errno 22] Argument invalide '.
Appeler GridSearchCV.fit() avec n_jobs=None fonctionne parfaitement

Dans le cas de n_jobs=None , la sortie montre qu'elle résout n_jobs=1 (bien que dans mes autres programmes, toute exécution réussie de GridSearchCV résoudra n_jobs=6 sur la même machine, cela peut ne pas être un gros problème. Juste FYI).

Peut-être que le problème réside dans (1) lib\site-packages\joblib\parallel.py ou _parallel_backends.py ou (2) lib\concurrent\futures_base.py, comme indiqué dans le retraçage ci-dessous.

Étapes/Code à reproduire

Veuillez ajouter un exemple minimal que nous pouvons reproduire l'erreur en exécutant le code. Soyez le plus succinct possible, ne vous fiez pas à des données externes. Bref, nous allons copier-coller votre code et nous espérons obtenir le même résultat que vous. Exemple : md5-0c48dcb0a123e7134795a5b1cc42e4f2 Si le code est trop long, n'hésitez pas à le mettre dans un gist public et à le lier dans le numéro : https://gist.github.com
search = GridSearchCV(RandomForestClassifier(), param_grid, cv=3, n_jobs=-1, return_train_score=True, verbose=2)
search.fit(feature_matrix, labels)

Résultats attendus


Aucune erreur n'est renvoyée.

Résultats actuels


OSError : [Errno 22] Argument non valide

Le rétrolien détaillé est joint ci-dessous :


_RemoteTraceback Traceback (appel le plus récent en dernier)
_RemoteTraceback :
"""
Traceback (appel le plus récent en dernier) :
Fichier "C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\externals\loky\process_executor.py", ligne 431, dans _process_worker
r = élément_appel()
Fichier "C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\externals\loky\process_executor.py", ligne 285, en __call__
return self.fn( self.args, * self.kwargs)
Fichier "C:Users\tlbh9\Anaconda3\lib\site-packages\joblib_parallel_backends.py", ligne 595, en __call__
return self.func( args, * kwargs)
Fichier "C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\parallel.py", ligne 252, en __call__
return [func( args, * kwargs)
Fichier "C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\parallel.py", ligne 252, dans
return [func( args, * kwargs)
Fichier "C:Users\tlbh9\Anaconda3\lib\site-packages\sklearn\model_selection_validation.py", ligne 505, dans _fit_and_score
print("[CV] %s %s" % (msg, (64 - len(msg)) * '.'))
OSError : [Errno 22] Argument non valide
"""

L'exception ci-dessus était la cause directe de l'exception suivante :

OSError Traceback (appel le plus récent en dernier)
dans
.......
212 recherche = GridSearchCV(RandomForestClassifier(), param_grid, cv=3, n_jobs=-1, return_train_score=True, verbose=2)
--> 213 search.fit(feature_matrix, étiquettes)
.......

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py dans inner_f(*args, kwargs)71 Avertissement futur)72 kwargs.update({k : arg pour k, arg dans zip(sig.parameters, args)})---> 73 retour f( kwargs)
74 retour intérieur_f
75

~\Anaconda3\lib\site-packages\sklearn\model_selection_search.py ​​dans fit(self, X, y, groups, **fit_params)
734 résultats de retour
735
--> 736 self._run_search(evaluate_candidates)
737
738 # Pour une évaluation multi-métrique, stockez les best_index_, best_params_ et

~\Anaconda3\lib\site-packages\sklearn\model_selection_search.py ​​dans _run_search(self, evaluation_candidates)
1186 def _run_search(self,évaluer_candidats):
1187 """Rechercher tous les candidats dans param_grid"""
-> 1188 évaluer_candidats(ParameterGrid(self.param_grid))
1189
1190

~\Anaconda3\lib\site-packages\sklearn\model_selection_search.py ​​dans evaluation_candidates(candidate_params)
706 n_splits, n_candidates, n_candidates * n_splits))
707
--> 708 out = parallel(delayed(_fit_and_score)(clone(base_estimator),
709 X, y,
710 train=train, test=test,

~\Anaconda3\lib\site-packages\joblib\parallel.py dans __call__ (auto, itérable)
1040
1041 avec self._backend.retrieval_context() :
-> 1042 self.retrieve()
1043 # Assurez-vous que nous recevons un dernier message nous disant que nous avons terminé
1044 elapsed_time = time.time() - self._start_time

~\Anaconda3\lib\site-packages\joblib\parallel.py dans retrieve(self)
919 essayer :
920 si getattr(self._backend, 'supports_timeout', False):
--> 921 self._output.extend(job.get(timeout=self.timeout))
922 autre :
923 self._output.extend(job.get())

~\Anaconda3\lib\site-packages\joblib_parallel_backends.py dans wrap_future_result(future, timeout)
540 AsyncResults.get du multitraitement."""
541 essayer :
--> 542 return future.result(timeout=timeout)
543 sauf CfTimeoutError comme e :
544 lever TimeoutError de e

~\Anaconda3\lib\concurrent\futures_base.py dans result(self, timeout)
430 augmenter CancelledError()
431 elif self._state == TERMINÉ :
--> 432 renvoie self.__get_result()
433
434 self._condition.wait(timeout)

~\Anaconda3\lib\concurrent\futures_base.py dans __get_result(self)
386 def __get_result(self):
387 si self._exception :
--> 388 lève self._exception
389 autres :
390 return self._result

OSError : [Errno 22] Argument non valide

Versions


Système:
python : 3.8.3 (par défaut, 2 juillet 2020, 17:30:36) [MSC v.1916 64 bits (AMD64)]
exécutable : C:Users\tlbh9\Anaconda3\python.exe
ordinateur : Windows-10-10.0.18362-SP0

Dépendances Python :
pépin : 20.1.1
outils de configuration : 49.2.0.post20200714
sklearn: 0.23.1
numpy : 1.18.5
scipy : 1.5.0
Cython : 0.29.21
panda : 1.0.5
matplotlib : 3.2.2
joblib : 0.16.0
threadpoolctl : 2.1.0

Construit avec OpenMP : vrai

Merci d'avoir contribué !
triage

Tous les 3 commentaires

@tluocs Pouvez-vous partager le code complet alors que j'essayais de reproduire le problème, il dit que param_grid n'est pas défini.
Je veux savoir comment vous avez affecté param_grid également feature_matrix.
Il serait préférable que vous puissiez partager toutes les variables utilisées dans le code des lignes ci-dessus pour reproduire le problème.

Merci Anshu. Le code est assez lourd donc il ne semble pas facile de reproduire le problème. C'est pourquoi j'essayais de saisir toutes les informations nécessaires lorsque je soulevais le problème. Maintenant, je viens de le résoudre en mettant à jour mon python et mon scikit-learn (bien que ma version précédente était déjà assez nouvelle, qui datait de juillet 2020). Je suppose donc que ce "bug" (si c'est le cas) a peut-être été corrigé dans la dernière version.

Merci @tluocs d'avoir @AnshuTrivedi d'avoir jeté un coup d'œil à cela.
Si j'ai bien compris le problème a été résolu avec une mise à jour, je la ferme. N'hésitez pas à rouvrir si quelque chose doit encore être réparé. Merci.

Cette page vous a été utile?
0 / 5 - 0 notes