Scikit-learn: GridSearchCV.fit (..., n_job = -1) puede contener un error en el paralelismo

Creado en 11 sept. 2020  ·  3Comentarios  ·  Fuente: scikit-learn/scikit-learn

Antes de enviar un error, asegúrese de que el problema no se haya abordado ya mediante la búsqueda en los problemas anteriores.

Describe el error

Llamar a GridSearchCV.fit() con n_jobs=-1 genera la excepción ' OSError: [Errno 22] Argumento no válido '.
Llamar a GridSearchCV.fit() con n_jobs=None funciona perfectamente

En el caso de n_jobs=None , la salida muestra que resuelve n_jobs = 1 (aunque en mis otros programas, cualquier ejecución exitosa de GridSearchCV resolverá n_jobs = 6 en la misma máquina, esto puede no ser un gran problema. Solo para tu información).

Posiblemente, el problema podría estar en (1) lib \ site-packages \ joblib \ paralelo.py o _parallel_backends.py o (2) lib \ concurrent \ futures_base.py, como se muestra en el seguimiento a continuación.

Pasos / Código para reproducir

Agregue un ejemplo mínimo de que podemos reproducir el error ejecutando el código. Sea lo más sucinto posible, no dependa de datos externos. En resumen, vamos a copiar y pegar su código y esperamos obtener el mismo resultado que usted. Ejemplo: md5-0c48dcb0a123e7134795a5b1cc42e4f2 Si el código es demasiado largo, siéntase libre de ponerlo en una esencia pública y vincularlo en el número: 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)

Resultados previstos


No se lanza ningún error.

Resultados actuales


OSError: [Errno 22] Argumento no válido

El trackback detallado se adjunta a continuación:


_RemoteTraceback Traceback (última llamada más reciente)
_RemoteTraceback:
"" "
Rastreo (llamadas recientes más última):
Archivo "C: Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ joblib \ externals \ loky \ process_executor.py", línea 431, en _process_worker
r = elemento_llamada ()
Archivo "C: Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ joblib \ externals \ loky \ process_executor.py", línea 285, en __call__
return self.fn ( self.args, * self.kwargs)
Archivo "C: Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ joblib_parallel_backends.py", línea 595, en __call__
return self.func ( args, * kwargs)
Archivo "C: Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ joblib \ paralelo.py", línea 252, en __call__
return [func ( args, * kwargs)
Archivo "C: Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ joblib \ paralelo.py", línea 252, en
return [func ( args, * kwargs)
Archivo "C: Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ sklearn \ model_selection_validation.py", línea 505, en _fit_and_score
print ("[CV]% s% s"% (msg, (64 - len (msg)) * '.'))
OSError: [Errno 22] Argumento no válido
"" "

La excepción anterior fue la causa directa de la siguiente excepción:

OSError Traceback (última llamada más reciente)
en
.......
212 búsqueda = GridSearchCV (RandomForestClassifier (), param_grid, cv = 3, n_jobs = -1, return_train_score = True, verbose = 2)
-> 213 search.fit (feature_matrix, etiquetas)
.......

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

~ \ Anaconda3 \ lib \ site-packages \ sklearn \ model_selection_search.py ​​in fit (self, X, y, groups, ** fit_params)
734 devoluciones de resultados
735
-> 736 self._run_search (evaluar_candidatos)
737
738 # Para una evaluación multimétrica, almacene el best_index_, best_params_ y

~ \ Anaconda3 \ lib \ site-packages \ sklearn \ model_selection_search.py ​​en _run_search (auto, evaluar_candidatos)
1186 def _run_search (auto, evaluar_candidatos):
1187 "" "Buscar todos los candidatos en param_grid" ""
-> 1188 evaluar_candidatos (ParameterGrid (self.param_grid))
1189
1190

~ \ Anaconda3 \ lib \ site-packages \ sklearn \ model_selection_search.py ​​en evaluar_candidatos (candidato_params)
706 n_splits, n_candidates, n_candidates * n_splits))
707
-> 708 fuera = paralelo (retrasado (_fit_and_score) (clon (base_estimator),
709 X, y,
710 tren = tren, prueba = prueba,

~ \ Anaconda3 \ lib \ site-packages \ joblib \ paralelo.py en __call__ (auto, iterable)
1040
1041 con self._backend.retrieval_context ():
-> 1042 auto.recuperación ()
1043 # Asegúrese de que recibamos un último mensaje que nos diga que hemos terminado
1044 tiempo_entendido = tiempo.tiempo () - self._start_time

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

~ \ Anaconda3 \ lib \ site-packages \ joblib_parallel_backends.py en wrap_future_result (futuro, tiempo de espera)
540 AsyncResults.get de multiprocesamiento. "" "
541 intento:
-> 542 return future.result (tiempo de espera = tiempo de espera)
543 excepto CfTimeoutError como e:
544 elevar TimeoutError de e

~ \ Anaconda3 \ lib \ concurrent \ futures_base.py en el resultado (self, timeout)
430 elevar CancelledError ()
431 elif self._state == TERMINADO:
-> 432 return self .__ get_result ()
433
434 self._condition.wait (tiempo de espera)

~ \ Anaconda3 \ lib \ concurrent \ futures_base.py en __get_result (self)
386 def __get_result (self):
387 si self._exception:
-> 388 subir self._exception
389 más:
390 retorno self._result

OSError: [Errno 22] Argumento no válido

Versiones


Sistema:
python: 3.8.3 (predeterminado, 2 de julio de 2020, 17:30:36) [MSC v.1916 64 bit (AMD64)]
ejecutable: C: Users \ tlbh9 \ Anaconda3 \ python.exe
máquina: Windows-10-10.0.18362-SP0

Dependencias de Python:
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

Construido con OpenMP: Verdadero

¡Gracias por contribuir!
triage

Todos 3 comentarios

@tluocs ¿Puedes compartir el código completo cuando intenté reproducir el problema? Dice que param_grid no está definido.
Quiero saber cómo asignó param_grid también feature_matrix.
Sería mejor si pudiera compartir todas las variables utilizadas en el código de líneas anterior para reproducir el problema.

Gracias Anshu. El código es bastante, por lo que no parece fácil reproducir el problema. Es por eso que estaba tratando de ingresar toda la información necesaria cuando planteé el problema. Ahora lo acabo de resolver actualizando mi python y scikit-learn a la última versión (aunque mi versión anterior ya era bastante nueva, que estaba fechada en julio de 2020). Así que supongo que este "error" (si lo es) puede haber sido corregido en la última versión.

Gracias @tluocs por contactar y gracias @AnshuTrivedi por
Si comprendo correctamente que el problema se ha solucionado con una actualización, lo cerraré. Siéntase libre de volver a abrir si algo aún necesita ser reparado. Gracias.

¿Fue útil esta página
0 / 5 - 0 calificaciones