(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:
- Datang dari bidang terapan, model (pas / terlatih) bagi saya adalah model yang siap digunakan. Yaitu model berisi semua informasi yang diperlukan untuk menghasilkan prediksi untuk data baru. Dengan demikian, model tersebut juga mengandung hiperparameter . Seperti yang akan Anda lihat, sudut pandang ini terkait erat dengan pendekatan 2 di bawah ini.
- OTOH, algoritme pelatihan menurut pengalaman saya tidak didefinisikan dengan baik dalam pengertian berikut: untuk mendapatkan model (pas), tidak hanya - sebut saja "fitting utama" - parameter model "normal" perlu dilakukan, tetapi juga hiperparameter perlu diperbaiki. Dari perspektif aplikasi saya, sebenarnya tidak ada banyak perbedaan antara parameter dan hyperparamers: keduanya merupakan bagian dari model , dan perlu diperkirakan / diputuskan selama pelatihan.
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:
- hal
- Tetapi kecuali jika tidak ada keputusan yang terlibat karena semua pemisahan menghasilkan parameter yang sama, ini akan merusak independensi di lingkaran luar: data uji masing-masing pemisahan sudah memasuki keputusan yang ditetapkan parameter yang menang karena melatih data di semua pemisahan lainnya dan dengan demikian digunakan untuk mengoptimalkan parameter.
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 diterapkan tunedmodel = train_tuned (trainingdata)
yang juga mengurus perbaikan hyperparameters.
train_tuned
dapat diimplementasikan misalnya dengan membungkus pengoptimal berbasis validasi silang di sekitar algoritma pelatihan telanjang train_naked
.
train_tuned
kemudian dapat digunakan seperti algoritma pelatihan lainnya yang tidak memerlukan input hyperparameter, misalnya outputnya tunedmodel
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:
- model akhir dalam pendekatan 1 akan
train_naked (all data, hyperparameters from optimization)
- sedangkan pendekatan 2 akan menggunakan
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 penalti C
) 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:
> table (rbf1, rbf10)
rbf10
rbf1 correct wrong
correct 124 5
wrong 0 3
> mcnemar.exact(rbf1, rbf10)
Exact McNemar test (with central confidence intervals)
data: rbf1 and rbf10
b = 5, c = 0, p-value = 0.0625
alternative hypothesis: true odds ratio is not equal to 1
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]}
menghasilkan
({'kernel': 'linear', 'C': 1}, 0.95238095238095233, 0.97674418604651159)
({'kernel': 'rbf', 'C': 1}, 0.95238095238095233, 0.98449612403100772)
({'kernel': 'linear', 'C': 1}, 1.0, 0.97727272727272729)
({'kernel': 'linear', 'C': 1}, 0.94444444444444442, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 0.94444444444444442, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 1.0, 0.98484848484848486)
({'kernel': 'linear', 'C': 1}, 1.0, 0.96212121212121215)
Pendekatan 2:
Di sini, clf
adalah model terakhir Anda. Dengan random_state = 2
, rbf dengan C = 1 menang:
In [310]: clf.grid_scores_
[...snip warning...]
Out[310]:
[mean: 0.97333, std: 0.00897, params: {'kernel': 'linear', 'C': 1},
mean: 0.98000, std: 0.02773, params: {'kernel': 'rbf', 'C': 1},
mean: 0.96000, std: 0.03202, params: {'kernel': 'linear', 'C': 10},
mean: 0.95333, std: 0.01791, params: {'kernel': 'rbf', 'C': 10}]
(terjadi sekitar 1 dalam 5 kali, 1 dalam 6 kali linear
dan rbf
dengan C = 1
terikat pada peringkat 1)