Scikit-learn: GridSearchCV.fit(...,n_job=-1) mungkin mengandung bug dalam paralelisme

Dibuat pada 11 Sep 2020  ·  3Komentar  ·  Sumber: scikit-learn/scikit-learn

Sebelum mengirimkan bug, pastikan masalah tersebut belum diatasi dengan menelusuri masalah sebelumnya.

Jelaskan bugnya

Memanggil GridSearchCV.fit() dengan n_jobs=-1 memunculkan pengecualian ' OSError: [Errno 22] Invalid argument '.
Memanggil GridSearchCV.fit() dengan n_jobs=None berfungsi dengan baik

Dalam kasus n_jobs=None , output menunjukkan bahwa itu menyelesaikan n_jobs=1 (walaupun di program saya yang lain, setiap menjalankan GridSearchCV yang berhasil akan menyelesaikan n_jobs=6 pada mesin yang sama, ini mungkin bukan masalah besar. Sekedar informasi).

Mungkin, masalahnya terletak pada (1) lib\site-packages\joblib\parallel.py atau _parallel_backends.py atau (2) lib\concurrent\futures_base.py, seperti yang ditunjukkan pada traceback di bawah ini.

Langkah/Kode untuk Mereproduksi

Harap tambahkan contoh minimal bahwa kami dapat mereproduksi kesalahan dengan menjalankan kode. Buat sesingkat mungkin, jangan bergantung pada data eksternal. Singkatnya, kami akan menyalin-tempel kode Anda dan kami berharap mendapatkan hasil yang sama seperti Anda. Contoh: md5-0c48dcb0a123e7134795a5b1cc42e4f2 Jika kodenya terlalu panjang, jangan ragu untuk memasukkannya ke dalam inti publik dan tautkan dalam masalah: 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)

Hasil yang diharapkan


Tidak ada kesalahan yang dilemparkan.

Hasil nyata


OSError: [Errno 22] Argumen tidak valid

Trackback rinci terlampir di bawah ini:


_RemoteTraceback Traceback (panggilan terakhir terakhir)
_RemoteTraceback:
"""
Traceback (panggilan terakhir terakhir):
File "C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\externals\loky\process_executor.py", baris 431, di _process_worker
r = barang_panggilan()
File "C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\externals\loky\process_executor.py", baris 285, di __call__
return self.fn( self.args, * self.kwargs)
File "C:Users\tlbh9\Anaconda3\lib\site-packages\joblib_parallel_backends.py", baris 595, di __call__
return self.func( args, * kwargs)
File "C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\parallel.py", baris 252, di __call__
kembalikan [func( args, * kwargs)
File "C:Users\tlbh9\Anaconda3\lib\site-packages\joblib\parallel.py", baris 252, di
kembalikan [func( args, * kwargs)
File "C:Users\tlbh9\Anaconda3\lib\site-packages\sklearn\model_selection_validation.py", baris 505, dalam _fit_and_score
print("[CV] %s %s" % (pesan, (64 - len(pesan)) * '.'))
OSError: [Errno 22] Argumen tidak valid
"""

Pengecualian di atas adalah penyebab langsung dari pengecualian berikut:

OSError Traceback (panggilan terakhir terakhir)
di dalam
.......
212 pencarian = GridSearchCV(RandomForestClassifier(), param_grid, cv=3, n_jobs=-1, return_train_score=Benar, verbose=2)
--> 213 search.fit(feature_matrix, labels)
.......

~\Anaconda3\lib\site-packages\sklearn\utils\validation.py di inner_f(*args, kwargs)71 Peringatan Masa Depan)72 kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})---> 73 kembali f( kwargs)
74 kembalikan inner_f
75

~\Anaconda3\lib\site-packages\sklearn\model_selection_search.py ​​in fit(self, X, y, groups, **fit_params)
734 hasil pengembalian
735
--> 736 self._run_search(evaluate_candidates)
737
738 # Untuk evaluasi multi-metrik, simpan best_index_, best_params_ dan

~\Anaconda3\lib\site-packages\sklearn\model_selection_search.py ​​di _run_search(self, evaluation_candidates)
1186 def _run_search(sendiri, evaluasi_kandidat):
1187 """Cari semua kandidat di param_grid"""
-> 1188 evaluation_candidates(ParameterGrid(self.param_grid))
1189
1190

~\Anaconda3\lib\site-packages\sklearn\model_selection_search.py ​​di evaluation_candidates(candidate_params)
706 n_splits, n_candidates, n_candidates * n_splits))
707
--> 708 keluar = paralel(tertunda(_fit_and_score)(klon(dasar_estimator),
709 X, y,
710 kereta = kereta, tes = tes,

~\Anaconda3\lib\site-packages\joblib\parallel.py di __call__ (sendiri, dapat diubah)
1040
1041 dengan self._backend.retrieval_context():
-> 1042 self.retrieve()
1043 # Pastikan kita mendapatkan pesan terakhir yang memberitahu kita bahwa kita sudah selesai
1044 elapsed_time = time.time() - self._start_time

~\Anaconda3\lib\site-packages\joblib\parallel.py dalam mengambil (mandiri)
919 coba:
920 jika getattr(self._backend, 'supports_timeout', False):
-> 921 self._output.extend(job.get(timeout=self.timeout))
922 lainnya:
923 self._output.extend(pekerjaan.get())

~\Anaconda3\lib\site-packages\joblib_parallel_backends.py di wrap_future_result (masa depan, batas waktu)
540 AsyncResults.dapatkan dari multiproses."""
541 coba:
-> 542 kembalikan future.result(timeout=timeout)
543 kecuali CfTimeoutError sebagai e:
544 meningkatkan TimeoutError dari e

~\Anaconda3\lib\concurrent\futures_base.py dalam hasil (mandiri, batas waktu)
430 meningkatkan CancelledError()
431 elif self._state == SELESAI:
-> 432 kembalikan diri.__get_result()
433
434 self._condition.wait(batas waktu)

~\Anaconda3\lib\concurrent\futures_base.py di __get_result(self)
386 def __get_result(sendiri):
387 jika self._exception:
-> 388 meningkatkan diri._pengecualian
389 lainnya:
390 kembalikan diri._hasil

OSError: [Errno 22] Argumen tidak valid

Versi


Sistem:
python: 3.8.3 (default, 2 Juli 2020, 17:30:36) [MSC v.1916 64 bit (AMD64)]
dapat dieksekusi: C:Users\tlbh9\Anaconda3\python.exe
mesin: Windows-10-10.0.18362-SP0

Ketergantungan python:
pip: 20.1.1
setuptools: 49.2.0.post20200714
sklearn: 0.23.1
numpy: 1.18.5
sip: 1.5.0
Cython: 0.29.21
panda: 1.0.5
matplotlib: 3.2.2
joblib: 0.16.0
threadpoolctl: 2.1.0

Dibangun dengan OpenMP: Benar

Terima kasih telah berkontribusi!
triage

Semua 3 komentar

@tluocs Bisakah Anda membagikan kode lengkap ketika saya mencoba mereproduksi masalah yang dikatakan param_grid tidak ditentukan.
Saya ingin tahu bagaimana Anda menetapkan param_grid juga feature_matrix.
Akan lebih baik jika Anda dapat membagikan semua variabel yang digunakan dalam kode baris di atas untuk mereproduksi masalah.

Terima kasih Anshu. Kodenya cukup banyak sehingga sepertinya tidak mudah untuk mereproduksi masalah. Itu sebabnya saya mencoba memasukkan semua info yang diperlukan ketika saya mengangkat masalah ini. Sekarang saya baru saja menyelesaikannya dengan memutakhirkan python dan scikit-learn saya ke yang terbaru (walaupun versi saya sebelumnya sudah cukup baru, yang bertanggal Juli 2020). Jadi saya kira "bug" ini (jika ya) mungkin telah diperbaiki di rilis terbaru.

Terima kasih @tluocs telah menjangkau, dan terima kasih @AnshuTrivedi telah melihat ini.
Jika saya memahami dengan benar bahwa masalah telah diperbaiki dengan pembaruan, saya akan menutupnya. Jangan ragu untuk membuka kembali jika masih ada yang perlu diperbaiki. Terima kasih.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat