Saya telah membaca posting berikut untuk validasi silang bersarang dan masih belum 100% yakin apa yang harus saya lakukan dengan pemilihan model dengan validasi silang bersarang:
- Validasi silang bersarang untuk pemilihan model
- Pemilihan model dan validasi silang: Cara yang benar
Untuk menjelaskan kebingungan saya, izinkan saya mencoba menjalani pemilihan model dengan metode validasi silang bersarang langkah demi langkah.
- Buat loop CV luar dengan K-Lipat. Ini akan digunakan untuk memperkirakan kinerja parameter-hiper yang "memenangkan" setiap loop CV dalam.
- Gunakan GridSearchCV untuk membuat loop CV bagian dalam di mana di setiap loop bagian dalam, GSCV menelusuri semua kombinasi ruang parameter yang mungkin dan menghasilkan set parameter terbaik.
- Setelah GSCV menemukan parameter terbaik di loop dalam, itu diuji dengan set tes di loop luar untuk mendapatkan estimasi kinerja.
- Lingkaran luar kemudian diperbarui ke flip berikutnya sebagai set tes dan sisanya sebagai set pelatihan, dan 1-3 diulang. Parameter total yang mungkin "menang" adalah jumlah lipatan yang ditunjuk di lingkaran luar. Jadi jika loop luar 5 kali lipat, maka Anda akan memiliki estimasi kinerja suatu algoritma dengan 5 set parameter hiper yang berbeda , BUKAN kinerja satu set parameter hiper tertentu.
Pendekatan ini diilustrasikan pada halaman contoh SKLearn: http://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html
Pertanyaan: Setelah 4. , bagaimana Anda menentukan parameter hiper mana yang paling berhasil? Saya mengerti bahwa Anda ingin melatih algoritme Anda (mis. Regresi Logistik, Hutan Acak, dll.) Dengan kumpulan data COMPLETE di bagian akhir. Tetapi bagaimana Anda menentukan parameter hiper mana yang paling berhasil dalam validasi silang bersarang Anda? Pemahaman saya adalah bahwa untuk setiap loop dalam, satu set parameter hiper yang berbeda akan menang. Dan untuk loop luar, Anda mendapatkan estimasi kinerja GridSearchCV Anda, tetapi Anda tidak mendapatkan satu set parameter hiper tertentu. Jadi, dalam pembuatan model akhir, bagaimana Anda tahu parameter hiper apa yang digunakan? Itulah logika yang hilang yang saya kesulitan mengerti dari tapak lainnya.
Terima kasih sebelumnya atas tipnya, terutama jika @Dikran Marsupial dan @cbeleites dapat berbaur!
Sunting: Jika Anda bisa, harap dalam jawaban Anda gunakan istilah seperti "algoritma" dan "parameter hiper". Saya pikir salah satu sumber kebingungan bagi saya adalah ketika orang menggunakan istilah "model" atau "pemilihan model". Saya bingung apakah mereka berbicara tentang memilih algoritma yang digunakan atau parameter hiper apa yang digunakan.
Sunting 2: Saya telah membuat buku catatan yang menunjukkan dua cara melakukan validasi bersarang silang. Cara pertama adalah yang ditunjukkan pada contoh SKLearn, dan cara lain yang lebih panjang adalah yang saya tulis. Cara yang ditunjukkan di SKLearn tidak mengekspos hyperparameters "menang", tetapi cara saya yang lebih panjang. Namun pertanyaannya tetap sama. Setelah saya menyelesaikan validasi salib bersarang, bahkan dengan hiperparameter terbuka, apa yang harus saya lakukan sekarang? Seperti yang dapat Anda lihat dari hyperparameters di akhir notebook, mereka sedikit berbeda.
sumber
Jawaban:
(Saya yakin saya sudah menulis sebagian besar jawaban ini - tetapi tidak dapat menemukannya sekarang. Jika ada yang menemukan jawaban itu, harap tautkan). Saya melihat 2 pendekatan yang sedikit berbeda di sini, yang menurut saya masuk akal.
Tetapi pertama-tama beberapa terminologi:
Saya kira perbedaan di antara mereka terkait dengan perbedaan antara seseorang yang mengembangkan algoritma pelatihan baru yang biasanya menggambarkan kelas algoritma pelatihan bersama dengan beberapa parameter kemudi ( hyperparameters) yang sulit / tidak mungkin untuk diperbaiki (atau setidaknya untuk memperbaiki bagaimana mereka harus diputuskan / diperkirakan) tanpa pengetahuan aplikasi / domain.
Pendekatan 1: membutuhkan hasil optimasi yang stabil
Dengan pendekatan ini, "pelatihan model" adalah pemasangan parameter model "normal", dan diberikan hiperparameter . Validasi silang misalnya dalam menangani optimasi hiperparameter.
Langkah / asumsi penting di sini untuk menyelesaikan dilema yang set hiperparameternya harus dipilih adalah mengharuskan optimasi agar stabil . Validasi silang untuk tujuan validasi mengasumsikan bahwa semua model pengganti cukup mirip dengan model akhir (diperoleh dengan algoritma pelatihan yang sama yang diterapkan pada seluruh kumpulan data) untuk memungkinkan memperlakukannya sama (di antara mereka sendiri maupun dengan model akhir). Jika asumsi ini rusak dan
model pengganti masih sama (atau setara) di antara mereka tetapi tidak dengan model akhir, kita berbicara tentang bias pesimistik yang terkenal dari validasi silang.
Jika juga model pengganti tidak sama / setara satu sama lain, kami memiliki masalah dengan ketidakstabilan .
Untuk hasil optimasi loop dalam ini berarti bahwa jika optimasi stabil, tidak ada konflik dalam memilih hyperparameters . Dan jika variasi yang cukup diamati di seluruh hasil validasi silang dalam, optimasi tidak stabil . Situasi pelatihan yang tidak stabil memiliki masalah yang jauh lebih buruk daripada hanya keputusan yang mana dari hyperparameter yang akan dipilih, dan saya benar-benar merekomendasikan untuk mundur dalam kasus itu dan memulai proses pemodelan di seluruh
Ada pengecualian, di sini, meskipun: mungkin ada beberapa minimum lokal dalam optimasi menghasilkan kinerja yang sama untuk tujuan praktis. Membutuhkan juga pilihan di antara mereka untuk menjadi stabil mungkin merupakan persyaratan kuat yang tidak perlu - tetapi saya tidak tahu bagaimana keluar dari dilema ini.
Perhatikan bahwa jika tidak semua model menghasilkan set parameter kemenangan yang sama, Anda tidak boleh menggunakan perkiraan loop luar sebagai kesalahan generalisasi di sini:
Pendekatan 2: perlakukan penyetelan hyperparameter sebagai bagian dari pelatihan model
Pendekatan ini menjembatani perspektif "pengembang algoritma pelatihan" dan pengguna algoritma pelatihan yang diterapkan.
Pengembang algoritma pelatihan menyediakan algoritma pelatihan "telanjang"
model = train_naked (trainingdata, hyperparameters)
. Sebagai kebutuhan pengguna yang diterapkantunedmodel = train_tuned (trainingdata)
yang juga mengurus perbaikan hyperparameters.train_tuned
dapat diimplementasikan misalnya dengan membungkus pengoptimal berbasis validasi silang di sekitar algoritma pelatihan telanjangtrain_naked
.train_tuned
kemudian dapat digunakan seperti algoritma pelatihan lainnya yang tidak memerlukan input hyperparameter, misalnya outputnyatunedmodel
dapat dikenai validasi silang. Sekarang hiperparameter diperiksa stabilitasnya seperti parameter "normal" harus diperiksa stabilitasnya sebagai bagian dari evaluasi validasi silang.Ini sebenarnya yang Anda lakukan dan evaluasi dalam validasi silang bersarang jika Anda rata-rata kinerja semua model yang menang terlepas dari set parameter individu mereka.
Apa bedanya?
Kita mungkin berakhir dengan model akhir yang berbeda mengambil 2 pendekatan:
train_naked (all data, hyperparameters from optimization)
train_tuned (all data)
dan - saat menjalankan lagi optimasi hiperparameter pada kumpulan data yang lebih besar - ini mungkin berakhir dengan serangkaian hiperparameter yang berbeda.Tetapi sekali lagi logika yang sama berlaku: jika kita menemukan bahwa model akhir memiliki parameter yang secara substansial berbeda dari model pengganti validasi silang, itu adalah gejala asumsi 1 yang dilanggar. Jadi IMHO, sekali lagi kita tidak memiliki konflik tetapi memeriksa apakah asumsi (implisit) kita dibenarkan. Dan jika tidak, kita tidak boleh bertaruh terlalu banyak untuk memiliki estimasi kinerja model akhir yang bagus.
Saya mendapat kesan (juga dari melihat sejumlah pertanyaan / kebingungan serupa di sini di CV) bahwa banyak orang berpikir tentang validasi silang bersarang melakukan pendekatan 1. Tetapi kesalahan generalisasi biasanya diperkirakan berdasarkan pendekatan 2, jadi itulah cara yang harus dilakukan untuk model akhir juga.
Contoh Iris
Ringkasan: Optimalisasi pada dasarnya tidak ada gunanya. Ukuran sampel yang tersedia tidak memungkinkan perbedaan antara kinerja setiap parameter yang ditetapkan di sini.
Dari sudut pandang aplikasi, kesimpulannya adalah bahwa tidak masalah mana dari 4 set parameter yang Anda pilih - yang bukan berita buruk: Anda menemukan dataran tinggi parameter yang relatif stabil. Inilah keuntungan dari validasi bersarang model tuned yang tepat: sementara Anda tidak dapat mengklaim bahwa itu adalah model yang optimal, Anda masih dapat mengklaim bahwa model yang dibangun pada seluruh data menggunakan pendekatan 2 akan memiliki akurasi sekitar 97% (interval kepercayaan 95% untuk 145 yang benar dari 150 kasus uji: 92 - 99%)
Perhatikan bahwa pendekatan 1 juga tidak sejauh yang terlihat - lihat di bawah ini: optimasi Anda secara tidak sengaja melewatkan "pemenang" yang relatif jelas karena ikatan (itu sebenarnya adalah gejala yang sangat jelas dari masalah ukuran sampel).
Walaupun saya tidak cukup dalam ke SVM untuk "melihat" bahwa C = 1 harus menjadi pilihan yang baik di sini, saya akan menggunakan kernel linear yang lebih ketat. Selain itu, saat Anda melakukan optimasi, tidak ada yang salah dengan memilih set parameter yang menang bahkan jika Anda sadar bahwa semua set parameter menghasilkan kinerja yang hampir sama.
Namun, di masa depan, pertimbangkan apakah pengalaman Anda menghasilkan perkiraan kasar tentang kinerja apa yang dapat Anda harapkan dan kira-kira model apa yang akan menjadi pilihan yang baik. Kemudian buat model itu (dengan hiperparameter yang diperbaiki secara manual) dan hitung interval kepercayaan untuk kinerjanya. Gunakan ini untuk memutuskan apakah mencoba mengoptimalkan itu masuk akal atau tidak. (Saya dapat menambahkan bahwa saya sebagian besar bekerja dengan data di mana mendapatkan 10 lebih banyak kasus independen tidak mudah - jika Anda berada di bidang dengan ukuran sampel independen yang besar, semuanya terlihat jauh lebih baik untuk Anda)
versi panjang:
Adapun contoh hasil pada
iris
set data.iris
memiliki 150 kasing, SVM dengan kisi 2 x 2 parameter (2 kernel, 2 urutan besarnya untuk penaltiC
) dipertimbangkan.Loop dalam memiliki perpecahan 129 (2x) dan 132 (6x) kasus. Set parameter "terbaik" tidak dapat diputuskan antara kernel linear atau rbf, keduanya dengan C = 1. Namun, keakuratan tes dalam semuanya (termasuk selalu kehilangan C = 10) dalam akurasi 94 - 98,5% yang diamati. Perbedaan terbesar yang kita miliki dalam salah satu pemisahan adalah 3 vs 8 kesalahan untuk rbf dengan C = 1 vs 10.
Tidak mungkin ini perbedaan yang signifikan. Saya tidak tahu bagaimana cara mengekstrak prediksi untuk masing-masing kasus di CV, tetapi bahkan dengan asumsi bahwa 3 kesalahan dibagi, dan model C = 10 membuat tambahan 5 kesalahan:
Ingatlah bahwa ada 6 perbandingan berpasangan di kisi 2 x 2, jadi kami harus mengoreksi beberapa perbandingan juga.
Pendekatan 1
Dalam 3 dari 4 pemisahan luar di mana rbf "menang" atas kernel linier, mereka sebenarnya memiliki akurasi estimasi yang sama (saya kira min dalam kasus ikatan mengembalikan indeks yang cocok pertama).
Mengubah kisi untuk
params = {'kernel':['linear', 'rbf'],'C':[1,10]}
menghasilkanPendekatan 2:
Di sini,
clf
adalah model terakhir Anda. Denganrandom_state = 2
, rbf dengan C = 1 menang:(terjadi sekitar 1 dalam 5 kali, 1 dalam 6 kali
linear
danrbf
denganC = 1
terikat pada peringkat 1)sumber
Saya sudah membaca pertanyaan Anda dan jawabannya di atas 2 kali (pertama kali 3 bulan lalu). Saya tertarik dan juga ingin menemukan cara mutlak yang tepat untuk melakukan validasi silang untuk data saya. Setelah banyak berpikir & membaca, sepertinya saya menemukan lubangnya dan inilah yang saya perbaiki:
Pemikiran:
sumber
Anda tidak menggunakan validasi silang bersarang untuk memilih parameter hiper algoritma, metode ini digunakan untuk memperkirakan kesalahan generalisasi prosedur pembuatan model Anda . Di mana dengan prosedur pembuatan model, saya bermaksud semua langkah yang Anda terapkan untuk mencapai model akhir yang akan Anda gunakan di lapangan.D dan menghasilkan output sebuah "algoritma", terdiri dari tetap set preprocessing transformasi, fitur dan nilai-nilai parameter akhirnya hiper.
Prosedur pembuatan model dapat disusun oleh aturan yang Anda terapkan untuk memutuskan preprocessing mana yang akan diterapkan pada data, fitur mana yang digunakan dan akhirnya parameter hiper mana yang digunakan. Anggap ini sebagai semacam "meta-algoritma" yang menerima sebagai input dataset tertentu
Misalnya katakanlah Anda punyaX, y sebagai matriks desain dan target dan Anda ingin melatih classifier: x fitur dalam X yang memiliki korelasi tertinggi dengan y .
1. yang hanya menggunakan yang pertama
2. Anda memilih nilai parameter hiper dengan meminimalkan estimasi kesalahan validasi silang 10 kali lipat.
Jika Anda menerapkan dua langkah ini untuk pasangan tertentuX′, y′ Anda akan mendapatkan algoritme tertentu dengan serangkaian fitur dan parameter hiper tetap yang tidak harus sama dengan yang Anda dapatkan untuk X, y meskipun prosedur pembangunan model akan sama yaitu: langkah 1 + 2 yang tidak terikat pada dataset tertentu.
Katakanlah Anda melakukan semua hal di atas tanpa membagi data Anda menjadi tes kereta karena Anda memiliki dataset kecil, bagaimana Anda memperkirakan kesalahan generalisasi dari classifier yang baru saja Anda buat? Bisakah Anda menggunakan kesalahan terbaik yang Anda temukan di validasi silang pada langkah 2?
Tidak , masalah besar pertama adalah pada langkah 1 di mana Anda menggunakan semua data untuk memilih fitur yang akan digunakan. Oleh karena itu, bahkan ketika Anda melakukan validasi silang pada langkah 2, fitur-fiturnya sudah akan melihat dan mengingat beberapa informasi yang ada dalam flip tes di setiap menjalankan validasi silang. Hasilnya akan menjadi perkiraan yang terlalu optimis dari kesalahan pengujian dan ini disebutbias pemilihan fitur . Untuk memperhitungkan ini dalam estimasi Anda, Anda perlu memasukkan langkah pemilihan fitur di dalam loop validasi silang dari langkah 2.
Oke, sekarang apakah kita baik-baik saja? Apakah kesalahan terbaik ditemukan dalam validasi silang dengan langkah pemilihan fitur di dalam loop adalah perkiraan yang adil dari kesalahan generalisasi?
Secara teori jawabannya masih tidak , masalahnya adalah bahwa parameter hiper Anda telah dipilih untuk meminimalkan kesalahan validasi silang pada dataset tertentu yang Anda inginkan, sehingga dalam arti tertentu Anda menyesuaikan parameter hiper ke data Anda dengan risiko over-fitting mereka, dan ini disebut bias pemilihan model. Tetapi apakah ini merupakan keprihatinan dalam praktik? Itu tergantung oleh aplikasi spesifik: itu mungkin menjadi lebih parah, seperti overfitting dalam pelatihan, ketika dataset kecil dan jumlah parameter hiper yang akan disetel relatif besar. Untuk memperhitungkan ini ketika memperkirakan kesalahan generalisasi Anda akan menerapkan validasi silang bersarang seperti yang Anda jelaskan, yang kemudian akan memberi Anda estimasi yang benar dari kesalahan generalisasi Anda.
Akhirnya untuk menjawab pertanyaan terakhir Anda, setelah memiliki perkiraan yang adil dari kesalahan generalisasi “model building procedure” Anda dengan validasi silang bersarang, Anda cukup menerapkan prosedur (langkah 1 + 2) untuk seluruh dataset Anda mendapatkan model dengan set tetap. fitur dan menetapkan nilai parameter hiper, tetapi perlu diingat bahwa kesalahan yang kami harapkan model ini miliki pada data yang tidak terlihat adalah estimasi validasi silang bersarang .
sumber