Scikit-learn: GridSearchCV.fit(...、n_job = -1)には、並列処理のバグが含まれている可能性があります

作成日 2020年09月11日  ·  3コメント  ·  ソース: scikit-learn/scikit-learn

バグを送信する前に、過去の問題を検索して、問題がまだ解決されていないことを確認してください。

バグを説明する

呼び出しGridSearchCV.fit()してn_jobs=-1 ':[errnoを22]無効な引数OSErrorの'例外が発生します。
n_jobs=None GridSearchCV.fit()を呼び出すと完全に機能します

n_jobs=None場合、出力はn_jobs = 1を解決することを示しています(他のプログラムでは、GridSearchCVを正常に実行すると、同じマシンでn_jobs = 6が解決されますが、これは大きな問題ではない可能性があります。参考までに)。

以下のトレースバックに示すように、問題は(1)lib \ site-packages \ joblib \ parallel.pyまたは_parallel_backends.pyまたは(2)lib \ current \ futures_base.pyにある可能性があります。

再現する手順/コード

コードを実行することでエラーを再現できる最小限の例を追加してください。 できるだけ簡潔にし、外部データに依存しないでください。 つまり、コードをコピーして貼り付けるだけで、同じ結果が得られると期待しています。 例:md5-0c48dcb0a123e7134795a5b1cc42e4f2コードが長すぎる場合は、自由に公開の要点に入れて、問題にリンクしてください: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)

推測される結果


エラーはスローされません。

実績


OSError:[Errno22]引数が無効です

詳細なトラックバックは以下に添付されています。


_RemoteTracebackトレースバック(最後の最後の呼び出し)
_RemoteTraceback:
"" "
トレースバック(最後の最後の呼び出し):
ファイル "C:Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ joblib \ externals \ loky \ process_executor.py"、行431、_process_worker
r = call_item()
ファイル "C:Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ joblib \ externals \ loky \ process_executor.py"、285行目、 __call__
self.fn( self.args、* self.kwargs)を返します
ファイル "C:Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ joblib_parallel_backends.py"、行595、 __call__
self.func( args、* kwargs)を返します
ファイル "C:Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ joblib \ parallel.py"、252行目、 __call__
return [func( args、* kwargs)
ファイル "C:Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ joblib \ parallel.py"、252行目
return [func( args、* kwargs)
ファイル "C:Users \ tlbh9 \ Anaconda3 \ lib \ site-packages \ sklearn \ model_selection_validation.py"、行505、_fit_and_score
print( "[CV]%s%s"%(msg、(64 --len(msg))* '。'))
OSError:[Errno22]引数が無効です
"" "

上記の例外は、次の例外の直接の原因でした。

OSErrorトレースバック(最後の最後の呼び出し)

.....。
212 search = GridSearchCV(RandomForestClassifier()、param_grid、cv = 3、n_jobs = -1、return_train_score = True、verbose = 2)
-> 213 search.fit(feature_matrix、labels)
.....。

〜\ 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結果を返す
735
-> 736 self._run_search(evaluate_candidates)
737
738#マルチメトリック評価の場合、best_index_、best_params_、および

〜\ Anaconda3 \ lib \ site-packages \ sklearn \ model_selection_search.py​​ in _run_search(self、evaluate_candidates)
1186 def _run_search(self、evaluate_candidates):
1187 "" "param_grid内のすべての候補を検索" ""
-> 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_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 in __call__ (自己、反復可能)
1040
1041 with self._backend.retrieval_context():
-> 1042 self.retrieve()
1043#完了したことを示す最後のメッセージが表示されることを確認します
1044経過時間= time.time()-self._start_time

〜\ Anaconda3 \ lib \ site-packages \ joblib \ parallel.py in retrieve(self)
919試してみてください:
920 if getattr(self._backend、 'supports_timeout'、False):
-> 921 self._output.extend(job.get(timeout = self.timeout))
922その他:
923 self._output.extend(job.get())

〜\ Anaconda3 \ lib \ site-packages \ joblib_parallel_backends.py in wrap_future_result(future、timeout)
マルチプロセッシングからの540AsyncResults.get。 "" "
541試してみてください:
-> 542 return future.result(timeout = timeout)
eとしてのCfTimeoutErrorを除く543:
544eからTimeoutErrorを発生させます

〜\ Anaconda3 \ lib \ current \ futures_base.py in result(self、timeout)
430はCancelledError()を発生させます
431 elif self._state ==終了:
-> 432 return self .__ get_result()
433
434 self._condition.wait(timeout)

〜\ Anaconda3 \ lib \ current \ futures_base.py in __get_result(self)
386 def __get_result(self):
self._exceptionの場合は387:
-> 388レイズセルフ._exception
389その他:
390 return self._result

OSError:[Errno22]引数が無効です

バージョン


システム:
python:3.8.3(デフォルト、2020年7月2日、17:30:36)[MSC v.1916 64ビット(AMD64)]
実行可能ファイル:C:Users \ tlbh9 \ Anaconda3 \ python.exe
マシン:Windows-10-10.0.18362-SP0

Pythonの依存関係:
ピップ:20.1.1
setuptools:49.2.0.post20200714
sklearn:0.23.1
numpy:1.18.5
scipy:1.5.0
Cython:0.29.21
パンダ:1.0.5
matplotlib:3.2.2
joblib:0.16.0
threadpoolctl:2.1.0

OpenMPで構築:True

貢献してくれてありがとう!
triage

全てのコメント3件

@tluocs param_gridが定義されていないという問題を再現しようとしたときに、完全なコードを共有できますか。
param_gridとfeature_matrixをどのように割り当てたか知りたいです。
上記の行コードで使用されているすべての変数を共有して、問題を再現できるとよいでしょう。

あんしゅありがとう。 コードが非常に多いため、問題を再現するのは簡単ではないようです。 そのため、問題を提起するときに必要なすべての情報を入力しようとしていました。 今、私はpythonとscikit-learnを最新のものにアップグレードすることでそれを解決しました(私の以前のバージョンはすでにかなり新しく、2020年7月の日付でしたが)。 したがって、この「バグ」(ある場合)は最新リリースで修正されている可能性があります。

連絡してくれた@AnshuTrivediに感謝します。
更新によって問題が修正されたことを正しく理解している場合は、問題を解決します。 それでも修正が必要な場合は、お気軽に再開してください。 ありがとう。

このページは役に立ちましたか?
0 / 5 - 0 評価