Bagaimana cara menggunakan output dari GridSearch?

23

Saat ini saya sedang bekerja dengan Python dan Scikit belajar untuk keperluan klasifikasi, dan melakukan beberapa pembacaan di sekitar GridSearch. Saya pikir ini adalah cara yang bagus untuk mengoptimalkan parameter estimator saya untuk mendapatkan hasil terbaik.

Metodologi saya adalah ini:

  1. Bagi data saya menjadi pelatihan / tes.
  2. Gunakan GridSearch dengan validasi 5Fold Cross untuk melatih dan menguji estimator saya (Hutan Acak, Peningkatan Gradien, antara lain) untuk mendapatkan estimator terbaik dengan kombinasi optimal parameter hiper.
  3. Saya kemudian menghitung metrik pada masing-masing estimator saya seperti Precision, Recall, FMeasure dan Matthews Correlation Coefficient, menggunakan set pengujian saya untuk memprediksi klasifikasi dan membandingkannya dengan label kelas aktual.

Pada tahap ini saya melihat perilaku aneh dan saya tidak yakin bagaimana untuk melanjutkan. Apakah saya mengambil .best_estimator_ dari GridSearch dan menggunakan ini sebagai output 'optimal' dari pencarian grid , dan melakukan prediksi menggunakan estimator ini? Jika saya melakukan ini, saya menemukan bahwa metrik tahap 3 biasanya jauh lebih rendah daripada jika saya hanya melatih semua data pelatihan dan menguji pada set tes. Atau, apakah saya hanya mengambil objek GridSearchCV keluaran sebagai penaksir baru ? Jika saya melakukan ini, saya mendapatkan skor yang lebih baik untuk metrik tahap 3 saya, tetapi rasanya aneh menggunakan objek GridSearchCV alih-alih classifier yang dimaksud (Misalnya Hutan acak) ...

EDIT: Jadi pertanyaan saya adalah apa perbedaan antara objek GridSearchCV yang dikembalikan dan atribut .best_estimator_? Yang mana yang harus saya gunakan untuk menghitung metrik lebih lanjut? Dapatkah saya menggunakan output ini seperti classifier biasa (misalnya menggunakan predict), atau bagaimana saya harus menggunakannya?

Dan Carter
sumber

Jawaban:

27

Memutuskan untuk pergi dan menemukan jawaban yang akan memuaskan pertanyaan saya, dan menuliskannya di sini untuk orang lain yang bertanya-tanya.

Atribut .best_estimator_ adalah turunan dari tipe model yang ditentukan, yang memiliki kombinasi 'terbaik' dari parameter yang diberikan dari param_grid. Apakah instance ini berguna atau tidak tergantung pada apakah parameter refit diatur ke True (standarnya). Sebagai contoh:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
optimised_random_forest = clf.best_estimator_
return optimised_random_forest

Akan mengembalikan RandomForestClassifier. Ini semua cukup jelas dari dokumentasi . Apa yang tidak jelas dari dokumentasi adalah mengapa sebagian besar contoh tidak secara khusus menggunakan .best_estimator_ dan sebaliknya melakukan ini:

clf = GridSearchCV(estimator=RandomForestClassifier(), 
                    param_grid=parameter_candidates,
                    cv=5,
                    refit=True,
                    error_score=0,
                    n_jobs=-1)

clf.fit(training_set, training_classifications)
return clf

Pendekatan kedua ini mengembalikan contoh GridSearchCV, dengan semua lonceng dan peluit dari GridSearchCV seperti .best_estimator_, .best_params, dll, yang dengan sendirinya dapat digunakan seperti classifier terlatih karena:

Optimised Random Forest Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]
GridSearchCV Accuracy:  0.916970802919708
[[139  47]
 [ 44 866]]

Itu hanya menggunakan contoh estimator terbaik yang sama ketika membuat prediksi. Jadi dalam praktiknya tidak ada perbedaan antara keduanya kecuali Anda secara spesifik hanya menginginkan instance estimator itu sendiri. Sebagai catatan, perbedaan saya dalam metrik tidak terkait dan turun ke fungsi pembobotan kelas kereta.

Dan Carter
sumber
Terima kasih atas postingan Anda @Dan, ini sangat membantu. Saya ingin meminta satu klarifikasi. Pada kasus yang terakhir, jika saya miliki refit=Falsemaka clf.fittidak akan dilakukan dengan classifier terbaik?
Poete Maudit
@PoeteMaudit Parameter refit memberitahu fungsi GridSearchCV untuk mengambil parameter terbaik yang ditemukan, dan melatih ulang model menggunakan parameter-parameter tersebut pada seluruh dataset. Jika refit = Salah, maka best_estimator tidak tersedia, sesuai dengan dokumentasi: scikit-learn.org/stable/modules/generated/…
Dan Carter
0

GridSearchCV memungkinkan Anda menggabungkan estimator dengan pembukaan pencarian kotak untuk menyetel parameter-hiper. Metode ini mengambil parameter optimal dari pencarian grid dan menggunakannya dengan estimator yang dipilih oleh pengguna. GridSearchCV mewarisi metode dari classifier, jadi ya, Anda dapat menggunakan metode .score, .predict, dll. Langsung melalui antarmuka GridSearchCV. Jika Anda ingin mengekstrak parameter hiper terbaik yang diidentifikasi oleh pencarian kotak, Anda dapat menggunakan .best_params_ dan ini akan mengembalikan parameter hiper terbaik. Anda kemudian dapat meneruskan parameter-hiper ini ke estimator Anda secara terpisah.

Menggunakan .predict secara langsung akan menghasilkan hasil yang sama dengan mendapatkan parameter-hiper terbaik melalui .best_param_ dan kemudian menggunakannya dalam model Anda. Dengan memahami cara kerja menggarisbawahi pencarian grid kita dapat melihat mengapa hal ini terjadi.


Pencarian Grid

Teknik ini digunakan untuk menemukan parameter optimal untuk digunakan dengan suatu algoritma. Ini BUKAN bobot atau model, itu dipelajari menggunakan data. Ini jelas sangat membingungkan sehingga saya akan membedakan antara parameter-parameter ini, dengan memanggil satu parameter-hiper.

Hyper-parameter seperti k di k-Nearest Neighbors (k-NN). k-NN mengharuskan pengguna untuk memilih tetangga yang akan dipertimbangkan saat menghitung jarak. Algoritme kemudian menyetel parameter, ambang, untuk melihat apakah contoh novel termasuk dalam distribusi yang dipelajari, ini dilakukan dengan data.

Bagaimana kita memilih k?

Beberapa orang hanya pergi dengan rekomendasi berdasarkan studi terakhir dari tipe data. Lainnya menggunakan pencarian kotak. Metode ini akan dapat menentukan k mana yang paling optimal untuk digunakan untuk data Anda.

Bagaimana cara kerjanya?

[1,2,3,...,10]

Ini bertentangan dengan prinsip tidak menggunakan data uji !!

nnn-1n

Nilai parameter-hiper yang dipilih adalah nilai yang mencapai kinerja rata-rata tertinggi di seluruh lipatan-n. Setelah Anda puas dengan algoritma Anda, maka Anda dapat mengujinya pada set pengujian. Jika Anda langsung menuju set pengujian maka Anda berisiko overfitting.

JahKnows
sumber
Hai Jah, ini adalah jawaban yang bagus tapi saya tetap tidak bijaksana untuk menjawab pertanyaan saya. Saya telah memperbarui judul pertanyaan dan pertanyaan itu sendiri untuk mencoba dan membuat segalanya menjadi lebih jelas.
Dan Carter
Tulis pencarian kotak Anda sendiri. Ini benar-benar membuat array, lalu menambahkan loop for di sekitar model Anda. Kemudian pada akhir for for Anda catat kinerja yang dihasilkan ke dalam array. Setelah Anda melewati semua nilai yang mungkin ada di kisi Anda, lihatlah susunan pertunjukan, dan pilih yang terbaik. Itu adalah nilai optimal untuk parameter-hiper Anda. Mengandalkan fungsi bawaan untuk dasar-dasar sangat tidak disarankan untuk ilmu data. Data sangat bervariasi dan sangat baik bagi Anda untuk memiliki kendali!
JahKnows
Itu akan menjadi saran yang bagus jika saya hanya memiliki satu hyperparameter untuk dioptimalkan, tetapi jika saya punya 4? 5? 4/5 kali bersarang untuk loop jelek dan saya melihat tidak perlu menemukan kembali roda di sini, itu akan membuang-buang waktu, dan itu alasan paket seperti ini ada.
Dan Carter
GridSearchCV memungkinkan Anda menggabungkan estimator dengan pengaturan GridSearchCV. Jadi itu tepat seperti apa yang baru saja kita diskusikan. Kemudian mengambil parameter optimal dan menggunakannya dengan estimator yang Anda pilih. GridSearchCV mewarisi metode dari classifier, jadi ya, Anda dapat menggunakan metode .score, .predict, dll. Langsung melalui antarmuka GridSearchCV. Saya tidak merekomendasikan melakukan ini, alat yang lebih mudah berarti lebih sedikit kontrol. Untuk sesuatu yang sangat sederhana seperti pencarian kotak, cukup kodekan sendiri.
JahKnows
1
Jawaban ini tidak menjawab pertanyaan, yang terkait dengan penggunaan GridSearchCV.
Hobbes