Pemilihan model dan validasi silang: Cara yang benar

34

Ada banyak utas di CrossValidated pada topik pemilihan model dan validasi silang. Berikut ini beberapa di antaranya:

Namun, jawaban atas utas tersebut cukup umum dan sebagian besar menyoroti masalah dengan pendekatan khusus untuk lintas validasi dan pemilihan model.

Untuk membuat hal-hal sekonkret mungkin , katakan misalnya kita bekerja dengan SVM dengan kernel RBF: , dan itu Saya memiliki dataset fitur X dan label y , dan yang saya inginkanK(x,x)=(γ|x-x|)2

  1. Temukan nilai terbaik dari model saya ( danγC )
  2. Latih SVM dengan dataset saya (untuk penerapan akhir)
  3. Perkirakan kesalahan generalisasi dan ketidakpastian (varians) di sekitar kesalahan ini

Untuk melakukannya, saya pribadi akan melakukan pencarian kotak, misalnya saya mencoba setiap kombinasi yang mungkin dari dan . Untuk mempermudah, kita dapat mengasumsikan rentang berikut:Cγ

  • C{10,100,1000}
  • γ{0,1,0,2,0,5,1.0}

Lebih khusus lagi, menggunakan dataset lengkap saya, saya melakukan hal berikut:

  1. Untuk setiap pasangan ( , ), saya melakukan iterasi berulang (mis. 100 pengulangan acak) dari validasi silang lipat (misalnya ), pada dataset saya, yaitu saya melatih SVM saya pada lipatan dan mengevaluasi kesalahan di flip kiri, iterasi semua lipatanSecara keseluruhan, saya mengumpulkan 100 x 10 = 1000 kesalahan tes.CγKK=10K-1K
  2. Untuk setiap pasangan ( , ) tersebut, saya menghitung nilai mean dan varians dari 1000 kesalahan pengujian .CγμM.,σM.

Sekarang saya ingin memilih model terbaik (parameter kernel terbaik) yang akan saya gunakan untuk melatih SVM akhir saya pada dataset lengkap. Pemahaman saya adalah bahwa memilih model yang memiliki mean kesalahan terendah dan varians dan σ M akan menjadi pilihan yang tepat, dan bahwa model ini μ M adalah σ M adalah perkiraan terbaik saya tentang bias kesalahan generalisasi dan varians model ketika pelatihan dengan dataset lengkap.μM.σM.μM.σM.

TETAPI, setelah membaca jawaban di utas-utas di atas, saya mendapat kesan bahwa metode ini untuk memilih SVM terbaik untuk penyebaran dan / atau untuk memperkirakan kesalahannya (kinerja generalisasi), cacat, dan bahwa ada cara yang lebih baik untuk memilih SVM terbaik dan melaporkan kesalahannya. Jika demikian, apakah mereka? Saya mencari jawaban yang konkret.

Berpegang teguh pada masalah ini, seberapa spesifik saya bisa memilih model terbaik dan memperkirakan kesalahan generalisasi dengan tepat ?

Amelio Vazquez-Reina
sumber
Untuk membuat hal sekonkret mungkin, beri tahu kami: Berapa banyak kasus yang secara statistik independen Anda miliki dalam kumpulan data Anda? Apa fungsi target yang Anda evaluasi untuk optimasi / Apa ukuran kesalahan yang Anda gunakan? Apakah Anda benar-benar mengamati perilaku konsisten ukuran kesalahan yang dipilih di atas kisi parameter Anda? Jika Anda berbicara tentang klasifikasi dan ukuran kesalahan Anda memungkinkan ini: bagaimana hasil validasi silang iterated dibandingkan dengan varians yang Anda harapkan (tetapi tidak dapat diukur) karena ukuran sampel yang terbatas?
cbeleites mendukung Monica
Artikel yang menurut Anda menarik: optimalprediction.com/files/pdf/V2A5.pdf
user31256
2
+1 untuk pertanyaan yang sangat jelas dan terperinci, serta pertanyaan yang sangat relevan dengan komunitas sains data pada umumnya.
NickBraunagel

Jawaban:

20

Makalah saya di JMLR membahas pertanyaan persis ini, dan menunjukkan mengapa prosedur yang disarankan dalam pertanyaan (atau setidaknya satu sangat menyukainya) menghasilkan perkiraan kinerja yang bias secara optimis:

Gavin C. Cawley, Nicola LC Talbot, "Pada Over-fitting dalam Pemilihan Model dan Seleksi Selanjutnya Bias dalam Evaluasi Kinerja", Journal of Machine Learning Research, 11 (Jul): 2079−2107, 2010. ( www )

Hal utama yang perlu diingat adalah bahwa validasi silang adalah teknik untuk memperkirakan kinerja generalisasi untuk metode menghasilkan model, bukan model itu sendiri. Jadi jika memilih parameter kernel adalah bagian dari proses pembuatan model, Anda perlu memvalidasi silang proses pemilihan model juga, jika tidak, Anda akan berakhir dengan perkiraan kinerja yang bias secara optimis (seperti yang akan terjadi dengan prosedur yang Anda usulkan).

Asumsikan Anda memiliki fungsi fit_model, yang menggunakan dataset yang terdiri dari atribut X dan respons yang diinginkan Y, dan yang mengembalikan model yang sesuai untuk dataset tersebut, termasuk penyetelan parameter-hiper (dalam hal ini kernel dan parameter regularisasi). Penyetelan parameter-hiper ini dapat dilakukan dengan banyak cara, misalnya meminimalkan kesalahan validasi silang pada X dan T.

Langkah 1 - Paskan model dengan semua data yang tersedia, menggunakan fungsi fit_model. Ini memberi Anda model yang akan Anda gunakan dalam operasi.

Langkah 2 - Evaluasi kinerja. Lakukan validasi silang berulang dengan menggunakan semua data yang tersedia. Di setiap flip, data dipartisi ke dalam set pelatihan dan set tes. Paskan model menggunakan set pelatihan (catat nilai parameter-hiper untuk model yang dipasang) dan evaluasi kinerja pada set uji. Gunakan nilai tengah untuk semua set tes sebagai perkiraan kinerja (dan mungkin lihat juga penyebaran nilai-nilai).

Langkah 3 - Variabilitas pengaturan hiper-parameter - melakukan analisis nilai hiper-parameter yang dikumpulkan pada langkah 3. Namun saya harus menunjukkan bahwa tidak ada yang istimewa tentang hiper-parameter, mereka hanya parameter model yang telah diperkirakan (secara tidak langsung ) dari data. Mereka diperlakukan sebagai parameter hyper daripada parameter untuk kenyamanan komputasi / matematika, tetapi ini tidak harus menjadi kasus.

Masalah dengan menggunakan validasi silang di sini adalah bahwa data pelatihan dan tes bukan sampel independen (karena mereka berbagi data) yang berarti bahwa estimasi varians dari estimasi kinerja dan parameter-hiper cenderung bias (yaitu lebih kecil dari itu untuk sampel data yang benar-benar independen di setiap lipatan). Daripada cross-validasi berulang, saya mungkin akan menggunakan bootstrap sebagai gantinya dan tas model yang dihasilkan jika ini layak secara komputasi.

Poin kuncinya adalah bahwa untuk mendapatkan perkiraan kinerja yang tidak bias, prosedur apa pun yang Anda gunakan untuk menghasilkan model akhir (fit_model) harus diulang secara keseluruhan secara independen di setiap lipatan prosedur validasi silang.

Dikran Marsupial
sumber
Ini jawaban yang bagus. Ketika Anda mengatakan rather than repeated cross-validation you would go for bootstrapping- Apa perbedaan sebenarnya? Kedua melibatkan beberapa pengulangan membagi data ke dalam traindan testkemudian melatih di traindan mengevaluasi di test, bukan?
Josh
4
Bootstrapping (pengambilan sampel dengan penggantian) tampaknya merupakan cara yang lebih alami untuk melakukan sejumlah besar sampel ulang, karena lebih acak daripada validasi silang berulang. Untuk bootstrap, penggunaan enkles dalam tas adalah fitur yang bagus, dengan kesalahan out-of-bag sebagai perkiraan kinerja. Tidak ada jumlah besar untuk dipilih di antara keduanya.
Dikran Marsupial
Terima kasih @Dikran - Ini membuat saya bertanya-tanya, dengan asumsi bahwa orang menggunakan misal bootstrap, bagaimana Anda memilih model yang baik dengan mempertimbangkan mean dan varians di seluruh pengulangan? (yaitu protokol pemilihan model apa yang akan Anda ikuti?). Ini pertanyaan menimbulkan persis pertanyaan ini. Mendapatkan masukan Anda di utas itu akan sangat berharga!
Josh
@DikranMarsupial Bisakah Anda memposting kode (mis., Python atau R) untuk langkah 1-3? Saya merasa jauh lebih mudah untuk memahami prosedur seperti itu ketika melihat kode konkret.
tobip
1
Pesan utama: "Poin utamanya adalah untuk mendapatkan estimasi kinerja yang tidak bias, prosedur apa pun yang Anda gunakan untuk menghasilkan model akhir (fit_model) harus diulang secara keseluruhan secara independen di setiap lipatan prosedur validasi silang." Pesan persis ini juga disampaikan dalam The Elements of Statistics Learning (lihat bagian 7.10.2): web.stanford.edu/ ~ hastie
Papers
0

γC

Prosedur yang mengoptimalkan hiperparameter ini dan melatih SVM dengan ini juga hanyalah algoritma pembelajaran mesin . Alih-alih hanya mengoptimalkan parameter internal SVM (vektor dukungan) itu juga mengoptimalkan hyperparameters.

Sekarang Anda memiliki dua masalah [yang dapat diselesaikan secara mandiri]:

Baca penyalahgunaan validasi silang (melaporkan kinerja untuk nilai hyperparameter terbaik) untuk memastikan bahwa Anda tidak mencampuradukkannya.


Solusi spesifik (mungkin tidak optimal) untuk masalah konkret pertanyaan Anda:

k = 5
loss_CV = zeros(k)
for i in 1:k 
    Xi_train, Xi_test = folds(X,k)[i]
    loss = zeros((3,3))
    for lambda in {0.1,0.2,0.5,1.0}
        for C in {10,100,1000}
            for j in 1:k
                Xj_train, Xj_test = folds(Xi_train,k)[j]
                model = SVM(Xj_train,lambda, C)
                loss[lambda,C] += test_error(model,Xj_test)
    lambda, C = argmax(loss)
    model = SVM(Xi_train,lambda, C)
    loss_CV += test_error(model,Xi_test)

loss = zeros((3,3))
for lambda in {0.1,0.2,0.5,1.0}
    for C in {10,100,1000}
        for j in 1:k
            Xj_train, Xj_test = folds(Xi_train,k)[j]
            model = SVM(Xj_train,lambda, C)
            loss[lambda,C] += test_error(model,Xj_test)
lambda, C = argmax(loss)
model = SVM(Xi_train,lambda, C)

Di sini, modelakan menjadi "model terbaik" Anda dan loss_CV"perkiraan yang tepat untuk kesalahan generalisasi" (walaupun bias ke atas, tetapi Anda tidak dapat memiliki kue dan memakannya juga).

jan-glx
sumber