Scikit-learn: GridSearchCV.fit(...,n_job=-1) enthält möglicherweise Fehler in der Parallelität

Erstellt am 11. Sept. 2020  ·  3Kommentare  ·  Quelle: scikit-learn/scikit-learn

Bevor Sie einen Fehler einreichen, vergewissern Sie sich bitte, dass das Problem nicht bereits behoben wurde, indem Sie die vergangenen Probleme durchsuchen.

Beschreibe den Fehler

Der Aufruf von GridSearchCV.fit() mit n_jobs=-1 löst die Ausnahme ' OSError: [Errno 22] Ungültiges Argument ' aus.
Das Aufrufen von GridSearchCV.fit() mit n_jobs=None funktioniert einwandfrei

Im Fall von n_jobs=None zeigt die Ausgabe, dass n_jobs=1 aufgelöst wird (obwohl in meinen anderen Programmen jede erfolgreiche Ausführung von GridSearchCV n_jobs=6 auf demselben Computer auflöst, ist dies möglicherweise kein großes Problem. Nur zu deiner Information).

Möglicherweise liegt das Problem in (1) lib\site-packages\joblib\parallel.py oder _parallel_backends.py oder (2) lib\concurrent\futures_base.py, wie im folgenden Traceback gezeigt.

Schritte/Code zum Reproduzieren

Bitte fügen Sie ein Minimalbeispiel hinzu, damit wir den Fehler durch Ausführen des Codes reproduzieren können. Seien Sie so prägnant wie möglich, verlassen Sie sich nicht auf externe Daten. Kurz gesagt, wir werden Ihren Code kopieren und einfügen und erwarten, das gleiche Ergebnis wie Sie zu erhalten. Beispiel: md5-0c48dcb0a123e7134795a5b1cc42e4f2 Wenn der Code zu lang ist, können Sie ihn gerne in eine öffentliche Gist stellen und in der Ausgabe verlinken: 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)

erwartete Ergebnisse


Es wird kein Fehler ausgegeben.

Tatsächliche Ergebnisse


OSError: [Errno 22] Ungültiges Argument

Der detaillierte Trackback ist unten angehängt:


_RemoteTraceback Traceback (letzter Aufruf zuletzt)
_RemoteTraceback:
"""
Traceback (letzter Anruf zuletzt):
Datei "C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\externals\loky\process_executor.py", Zeile 431, in _process_worker
r = call_item()
Datei "C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\externals\loky\process_executor.py", Zeile 285, in __call__
return self.fn( self.args, * self.kwargs)
Datei "C:Users\tlbh9\Anaconda3\lib\site-packages\joblib_parallel_backends.py", Zeile 595, in __call__
return self.func( args, * kwargs)
Datei "C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\parallel.py", Zeile 252, in __call__
return [func( args, * kwargs)
Datei "C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\parallel.py", Zeile 252, in
return [func( args, * kwargs)
Datei "C:Users\tlbh9\Anaconda3\lib\site-packages\sklearn\model_selection_validation.py", Zeile 505, in _fit_and_score
print("[CV] %s %s" % (msg, (64 - len(msg)) * '.'))
OSError: [Errno 22] Ungültiges Argument
"""

Die obige Ausnahme war die direkte Ursache für die folgende Ausnahme:

OSError Traceback (letzter Aufruf zuletzt)
in
.......
212 search = GridSearchCV(RandomForestClassifier(), param_grid, cv=3, n_jobs=-1, return_train_score=True, ausführlich=2)
--> 213 search.fit(feature_matrix, Labels)
.......

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py in inner_f(*args, kwargs)71 Zukunftswarnung)72 kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})---> 73 return f( kwargs)
74 Rückkehr inner_f
75

~\Anaconda3\lib\site-packages\sklearn\model_selection_search.py ​​in fit(self, X, y, groups, **fit_params)
734 Ergebnisse zurückgeben
735
--> 736 self._run_search(evaluate_candidates)
737
738 # Speichern Sie für die multimetrische Auswertung best_index_, best_params_ und

~\Anaconda3\lib\site-packages\sklearn\model_selection_search.py ​​in _run_search(self, evaluation_candidates)
1186 def _run_search(self,valu_candidates):
1187 """Alle Kandidaten in param_grid suchen"""
-> 1188 Evaluation_candidates(ParameterGrid(self.param_grid))
1189
1190

~\Anaconda3\lib\site-packages\sklearn\model_selection_search.py ​​in Evaluation_candidates(candidate_params)
706 n_Splits, n_Kandidaten, n_Kandidaten * n_Splits))
707
--> 708 out = parallel(delayed(_fit_and_score)(clone(base_estimator),
709 X, y,
710 trainieren=trainieren, testen=testen,

~\Anaconda3\lib\site-packages\joblib\parallel.py in __call__ (selbst, iterierbar)
1040
1041 mit self._backend.retrieval_context():
-> 1042 self.retrieve()
1043 # Stellen Sie sicher, dass wir eine letzte Nachricht erhalten, die uns mitteilt, dass wir fertig sind
1044 elapsed_time = time.time() - self._start_time

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

~\Anaconda3\lib\site-packages\joblib_parallel_backends.py in wrap_future_result(Zukunft, Zeitüberschreitung)
540 AsyncResults.get von Multiprocessing."""
541 versuchen:
--> 542 return future.result(timeout=timeout)
543 außer CfTimeoutError als e:
544 TimeoutError von e . erhöhen

~\Anaconda3\lib\concurrent\futures_base.py im Ergebnis (self, timeout)
430 erhöhen CancelledError()
431 elif self._state == FERTIG:
--> 432 selbst zurückgeben.__get_result()
433
434 self._condition.wait(timeout)

~\Anaconda3\lib\concurrent\futures_base.py in __get_result(self)
386 def __get_result(selbst):
387 wenn selbst._Ausnahme:
--> 388 selbst erhöhen._Exception
389 sonst:
390 selbst zurückgeben._result

OSError: [Errno 22] Ungültiges Argument

Versionen


System:
Python: 3.8.3 (Standard, 2. Juli 2020, 17:30:36) [MSC v.1916 64 Bit (AMD64)]
ausführbare Datei: C:Users\tlbh9\Anaconda3\python.exe
Maschine: Windows-10-10.0.18362-SP0

Python-Abhängigkeiten:
Pip: 20.1.1
Setuptools: 49.2.0.post20200714
sklearn: 0.23.1
numpy: 1.18.5
scipy: 1.5.0
Cython: 0.29.21
Pandas: 1.0.5
matplotlib: 3.2.2
Joblib: 0.16.0
threadpoolctl: 2.1.0

Mit OpenMP erstellt: True

Danke fürs Mitmachen!
triage

Alle 3 Kommentare

@tluocs Können Sie den vollständigen Code
Ich möchte wissen, wie Sie param_grid auch feature_matrix zugewiesen haben.
Es wäre besser, wenn Sie alle im obigen Code der Zeilen verwendeten Variablen freigeben könnten, um das Problem zu reproduzieren.

Danke Anshu. Der Code ist ziemlich umfangreich, daher scheint es nicht einfach, das Problem zu reproduzieren. Deshalb habe ich versucht, alle notwendigen Informationen einzugeben, als ich das Problem ansprach. Jetzt habe ich es gerade gelöst, indem ich mein Python und Scikit-Learn auf den neuesten Stand gebracht habe (obwohl meine vorherige Version bereits ziemlich neu war, die im Juli 2020 datiert wurde). Ich vermute also, dass dieser "Bug" (wenn ja) in der neuesten Version behoben wurde.

Danke @tluocs für die @AnshuTrivedi für den Blick darauf.
Wenn ich das richtig verstanden habe, wurde das Problem mit einem Update behoben, ich schließe es. Gerne wieder öffnen, wenn noch etwas repariert werden muss. Vielen Dank.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen