Scikit-learn: GridSearchCV.fit (..., n_job = -1) pode conter bug em paralelismo

Criado em 11 set. 2020  ·  3Comentários  ·  Fonte: scikit-learn/scikit-learn

Antes de enviar um bug, certifique-se de que o problema já não tenha sido resolvido pesquisando os problemas anteriores.

Descreva o bug

Chamar GridSearchCV.fit() com n_jobs=-1 levanta a exceção ' OSError: [Errno 22] Argumento inválido '.
Chamar GridSearchCV.fit() com n_jobs=None funciona perfeitamente

No caso de n_jobs=None , a saída mostra que ele resolve n_jobs = 1 (embora em meus outros programas, qualquer execução bem-sucedida de GridSearchCV resolverá n_jobs = 6 na mesma máquina, isso pode não ser um grande problema. Apenas para sua informação).

Possivelmente, o problema pode estar em (1) lib \ site-packages \ joblib \ parallel.py ou _parallel_backends.py ou (2) lib \ concurrent \ futures_base.py, conforme mostrado no traceback abaixo.

Etapas / código para reproduzir

Adicione um exemplo mínimo de que possamos reproduzir o erro executando o código. Seja o mais sucinto possível, não dependa de dados externos. Resumindo, vamos copiar e colar seu código e esperamos obter o mesmo resultado que você. Exemplo: md5-0c48dcb0a123e7134795a5b1cc42e4f2 Se o código for muito longo, sinta-se à vontade para colocá-lo em uma essência pública e vinculá-lo ao problema: 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 esperados


Nenhum erro é lançado.

Resultados reais


OSError: [Errno 22] Argumento inválido

O trackback detalhado está anexado abaixo:


_RemoteTraceback Traceback (última chamada mais recente)
_RemoteTraceback:
"" "
Traceback (última chamada mais recente):
Arquivo "C: Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ joblib \ externals \ loky \ process_executor.py", linha 431, em _process_worker
r = call_item ()
Arquivo "C: Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ joblib \ externals \ loky \ process_executor.py", linha 285, em __call__
return self.fn ( self.args, * self.kwargs)
Arquivo "C: Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ joblib_parallel_backends.py", linha 595, em __call__
return self.func ( args, * kwargs)
Arquivo "C: Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ joblib \ parallel.py", linha 252, em __call__
return [func ( args, * kwargs)
Arquivo "C: Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ joblib \ parallel.py", linha 252, em
return [func ( args, * kwargs)
Arquivo "C: Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ sklearn \ model_selection_validation.py", linha 505, em _fit_and_score
print ("[CV]% s% s"% (msg, (64 - len (msg)) * '.'))
OSError: [Errno 22] Argumento inválido
"" "

A exceção acima foi a causa direta da seguinte exceção:

OSError Traceback (última chamada mais recente)
no
.......
212 search = GridSearchCV (RandomForestClassifier (), param_grid, cv = 3, n_jobs = -1, return_train_score = True, verbose = 2)
-> 213 search.fit (feature_matrix, rótulos)
.......

~ \ Anaconda3 \ lib \ site-packages \ sklearn \ utils \ validation.py in inner_f (* args, kwargs)71 FutureWarning)72 kwargs.update ({k: arg for k, arg in 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 resultados de retorno
735
-> 736 self._run_search (avaliar_candidatos)
737
738 # Para avaliação multimétrica, armazene o best_index_, best_params_ e

~ \ Anaconda3 \ lib \ site-packages \ sklearn \ model_selection_search.py ​​em _run_search (self, avaliar_candidatos)
1186 def _run_search (self, avaliar_candidatos):
1187 "" "Pesquisar todos os candidatos em param_grid" ""
-> 1188 avaliar_candidatos (ParameterGrid (self.param_grid))
1189
1190

~ \ Anaconda3 \ lib \ site-packages \ sklearn \ model_selection_search.py ​​em avaliar_candidatos (candidatos_params)
706 n_splits, n_candidates, n_candidates * n_splits))
707
-> 708 out = paralelo (atrasado (_fit_and_score) (clone (base_estimator),
709 X, y,
710 treinar = treinar, testar = testar,

~ \ Anaconda3 \ lib \ site-packages \ joblib \ parallel.py em __call__ (auto, iterável)
1040
1041 com self._backend.retrieval_context ():
-> 1042 self.retrieve ()
1043 # Certifique-se de receber uma última mensagem dizendo que terminamos
1044 elapsed_time = time.time () - self._start_time

~ \ Anaconda3 \ lib \ site-packages \ joblib \ parallel.py em recuperação (self)
919 tentativa:
920 se getattr (self._backend, 'supported_timeout', False):
-> 921 self._output.extend (job.get (timeout = self.timeout))
922 mais:
923 self._output.extend (job.get ())

~ \ Anaconda3 \ lib \ site-packages \ joblib_parallel_backends.py em wrap_future_result (futuro, tempo limite)
540 AsyncResults.get de multiprocessamento. "" "
541 tentativa:
-> 542 return future.result (timeout = timeout)
543 exceto CfTimeoutError como e:
544 aumento TimeoutError de e

~ \ Anaconda3 \ lib \ concurrent \ futures_base.py no resultado (self, timeout)
430 aumento CancelledError ()
431 elif self._state == TERMINADO:
-> 432 return self .__ get_result ()
433
434 self._condition.wait (tempo limite)

~ \ Anaconda3 \ lib \ concurrent \ futures_base.py em __get_result (self)
386 def __get_result (self):
387 se self._exception:
-> 388 aumento self._exception
389 mais:
390 return self._result

OSError: [Errno 22] Argumento inválido

Versões


Sistema:
python: 3.8.3 (padrão, 2 de julho de 2020, 17:30:36) [MSC v.1916 64 bits (AMD64)]
executável: C: Users \ tlbh9 \ Anaconda3 \ python.exe
máquina: Windows-10-10.0.18362-SP0

Dependências do Python:
pip: 20.1.1
setuptools: 49.2.0.post20200714
sklearn: 0.23.1
entorpecido: 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

Construído com OpenMP: True

Obrigado por contribuir!
triage

Todos 3 comentários

@tluocs Você pode compartilhar o código completo enquanto eu tentei reproduzir o problema, ele está dizendo que param_grid não está definido.
Quero saber como você atribuiu param_grid e feature_matrix.
Seria melhor se você pudesse compartilhar todas as variáveis ​​usadas no código de linhas acima para reproduzir o problema.

Obrigado, Anshu. O código é muito grande, então não parece fácil reproduzir o problema. É por isso que tentei inserir todas as informações necessárias ao levantar o problema. Agora, acabei de resolver isso atualizando meu python e scikit-learn para o mais recente (embora minha versão anterior já fosse bastante nova, que foi datada de julho de 2020). Então eu acho que esse "bug" (se for) pode ter sido corrigido na versão mais recente.

Obrigado @tluocs por contato e obrigado @AnshuTrivedi por dar uma olhada nisso.
Se bem entendi, o problema foi corrigido com uma atualização, vou encerrá-lo. Sinta-se à vontade para reabrir se algo ainda precisar ser consertado. Obrigado.

Esta página foi útil?
0 / 5 - 0 avaliações