Dalam beberapa kuliah dan tutorial yang saya lihat, mereka menyarankan untuk membagi data Anda menjadi tiga bagian: pelatihan, validasi, dan tes. Tetapi tidak jelas bagaimana dataset uji harus digunakan, atau bagaimana pendekatan ini lebih baik daripada validasi silang atas seluruh kumpulan data.
Katakanlah kita telah menyimpan 20% data kita sebagai set uji. Kemudian kami mengambil sisanya, membaginya menjadi k lipatan dan, menggunakan cross-validation, kami menemukan model yang membuat prediksi terbaik pada data yang tidak diketahui dari dataset ini. Katakanlah model terbaik yang kami temukan memberi kami akurasi 75% .
Berbagai tutorial dan banyak pertanyaan di berbagai situs web T&J mengatakan bahwa sekarang kami dapat memverifikasi model kami pada set data (tes) yang disimpan. Tetapi saya masih belum bisa mengerti bagaimana tepatnya hal itu dilakukan, atau apa gunanya.
Katakanlah kita memiliki akurasi 70% pada dataset uji. Jadi apa yang akan kita lakukan selanjutnya? Apakah kita mencoba model lain, dan kemudian yang lain, sampai kita akan mendapatkan skor tinggi pada dataset uji kita? Tetapi dalam kasus ini sepertinya kita hanya akan menemukan model yang sesuai dengan set tes terbatas kami (hanya 20%) . Itu tidak berarti bahwa kita akan menemukan model yang terbaik secara umum.
Selain itu, bagaimana kita dapat menganggap skor ini sebagai evaluasi umum model, jika hanya dihitung pada set data yang terbatas? Jika skor ini rendah, mungkin kami kurang beruntung dan memilih data tes "buruk".
Di sisi lain, jika kita menggunakan semua data yang kita miliki dan kemudian memilih model menggunakan k-fold cross-validation, kita akan menemukan model yang membuat prediksi terbaik pada data yang tidak diketahui dari seluruh kumpulan data yang kita miliki.
Jawaban:
Ini mirip dengan pertanyaan lain yang saya jawab mengenai validasi silang dan set tes . Konsep kunci untuk dipahami di sini adalah kumpulan data independen . Pertimbangkan hanya dua skenario:
Sekarang, jika saya seorang peneliti yang tidak seberuntung apa yang harus saya lakukan? Nah, Anda bisa mencoba meniru skenario yang tepat itu:
Untuk mengatasi masalah Anda yang lain:
Agaknya, idenya adalah Anda menciptakan model terbaik yang Anda bisa dari data Anda dan kemudian mengevaluasinya pada beberapa data yang belum pernah dilihat sebelumnya. Anda dapat mengevaluasi kembali skema validasi silang Anda, tetapi begitu Anda memiliki model yang dicari (yaitu parameter hiper) Anda bergerak maju dengan model itu karena itu adalah yang terbaik yang bisa Anda lakukan. Kuncinya adalah TIDAK PERNAH MENGGUNAKAN DATA UJI ANDA UNTUK MENYETEL . Hasil Anda dari data uji adalah kinerja model Anda pada data 'umum'. Mereplikasi proses ini akan menghapus independensi dataset (yang merupakan keseluruhan poin). Ini juga ditujukan pada pertanyaan lain tentang data uji / validasi .
Ini tidak mungkin jika Anda telah membagi data Anda dengan benar. Anda harus memisahkan data Anda secara acak (meskipun berpotensi bertingkat untuk penyeimbangan kelas). Jika dataset Anda cukup besar sehingga Anda membagi data Anda menjadi tiga bagian, bagian pengujian Anda harus cukup besar sehingga peluangnya sangat rendah sehingga Anda hanya memilih data yang buruk. Kemungkinan besar model Anda sudah overfit.
sumber
Jika semua yang akan Anda lakukan adalah melatih model dengan pengaturan default pada dataset mentah atau minimal yang telah diproses sebelumnya (mis. Penyandian satu-panas dan / atau menghapus NAs), Anda tidak perlu set tes terpisah, Anda bisa melatih pada Anda latih perangkat dan uji pada set validasi Anda, atau bahkan lebih baik, latih seluruh set menggunakan validasi silang untuk memperkirakan kinerja Anda.
Namun, begitu pengetahuan Anda tentang data menyebabkan Anda melakukan perubahan apa pun dari strategi awal Anda, kini Anda telah "mencemari" hasil Anda. Beberapa contoh termasuk:
Pilihan model: Anda menguji mesin logistik, laso, hutan acak, XGBoost, dan dukungan dan pilih model terbaik
Penyetelan parameter: Anda menyetel XGBoost untuk menemukan hiperparameter optimal
Pemilihan fitur: Anda menggunakan seleksi mundur, algoritma genetika, boruta, dll. Untuk memilih subset fitur yang optimal untuk dimasukkan dalam model Anda
Hilang imputasi: Anda memasukkan variabel yang hilang dengan mean, atau dengan model sederhana berdasarkan variabel lain
Transformasi fitur: Anda memusatkan dan menskalakan variabel numerik Anda untuk menggantinya dengan skor-z (jumlah standar deviasi dari rata-rata)
Dalam semua kasus di atas, menggunakan satu set ketidaksepakatan, atau bahkan validasi silang, tidak akan memberi Anda perkiraan kinerja dunia nyata yang realistis karena Anda menggunakan informasi yang tidak akan Anda miliki tentang data masa depan dalam keputusan Anda. Alih-alih, Anda memilih model terbaik, hiperparameter terbaik, set fitur terbaik, dll. Untuk data Anda, dan Anda cenderung sedikit "melengkapi" strategi Anda dengan data Anda. Untuk mendapatkan perkiraan kinerja dunia nyata yang jujur, Anda perlu memberi skor pada data yang tidak masuk ke dalam proses pengambilan keputusan sama sekali, karenanya praktik umum menggunakan set tes independen terpisah dari pelatihan (pemodelan) dan validasi Anda ( memilih set model, fitur, hiperparameter, dll.).
Sebagai alternatif untuk memegang set tes, Anda bisa menggunakan teknik yang disebut validasi silang bersarang. Ini mengharuskan Anda untuk membuat kode seluruh strategi pemodelan Anda (transformasi, imputasi, pemilihan fitur, pemilihan model, penyetelan hyperparameter) sebagai fungsi non-parametrik dan kemudian melakukan validasi silang pada seluruh fungsi tersebut seolah-olah itu hanya fungsi model fit. Ini sulit dilakukan di sebagian besar paket ML, tetapi dapat diimplementasikan dengan cukup mudah dalam R dengan paket mlr dengan menggunakan pembungkus untuk menentukan strategi pelatihan Anda dan kemudian menguji kembali pembelajar Anda yang dibungkus:
https://mlr.mlr-org.com/articles/tutorial/nested_resampling.html
sumber
Saya berasumsi bahwa Anda sedang melakukan klasifikasi.
Ambil data Anda dan bagi 70/30 menjadi himpunan data data / testData. Ambil subset trainingData dan bagilah 70/30 lagi menjadi subset trainingData / validateData. Sekarang Anda memiliki 3 himpunan bagian dari data asli Anda - trainingData (.7 * .7), validateData (.7 * .3), dan testData (.3).
Anda melatih model Anda dengan data training. Kemudian, Anda memeriksa kinerja model yang menggunakan validateData, yang dapat kita anggap independen dari trainingData dan karena itu evaluasi yang baik tentang seberapa baik model tersebut menggeneralisasi. Mari kita berpura-pura bahwa Anda mencapai akurasi 75%.
Sekarang Anda melatih model Anda beberapa kali secara acak. Setiap pelatihan ulang, Anda mengevaluasi serangkaian hiperparameter yang berbeda (parameter diumpankan ke model Anda di tempat pertama vs yang dioptimalkan oleh model Anda) tetapi masih menggunakan subset trainingData. Setiap pelatihan ulang, Anda juga kembali memeriksa seberapa baik model baru digeneralisasi dengan memeriksa kinerja pada validateData.
Setelah Anda memeriksa setiap kombinasi hiperparameter yang ingin Anda nilai, Anda memilih set hiperparameter yang memberi Anda kinerja terbaik Anda pada validateData - mari berpura-pura kinerja terbaik Anda pada validateData adalah akurasi 80%. Ini adalah hiperparameter akhir Anda dan model yang ditentukan oleh hiperparameter tersebut adalah yang akan Anda gunakan untuk langkah selanjutnya.
Sekarang Anda mengambil model yang menggunakan hyperparameters akhir Anda dan mengevaluasi testData. Ini adalah pertama kalinya testData tersentuh sejak seluruh proses ini dimulai! Jika Anda mendapatkan kinerja testData yang sebanding dengan kinerja Anda di validateData (meskipun biasanya itu akan sedikit lebih rendah), maka Anda dapat merasa yakin bahwa model Anda berfungsi seperti yang diharapkan dan digeneralisasikan dengan baik! Jika itu terjadi, ini adalah model akhir Anda!
Kenapa melakukan semua ini? Anda berusaha menghindari overfitting. Selalu ada risiko bahwa Anda terlalu cocok dengan data yang Anda gunakan saat Anda melatih dan menyetel (alias memvalidasi) model Anda. Jika Anda melatih, menyetel (memvalidasi), dan menguji hanya dengan menggunakan satu set data, ada kemungkinan Anda akan menyesuaikan data itu dan itu tidak akan digeneralisasikan dengan baik. Dengan memecah pelatihan dan menguji data yang terpisah (dan dengan asumsi Anda menyetel menggunakan data uji), Anda memiliki kesempatan untuk memeriksa diri Anda secara internal, tetapi masih ada kemungkinan bahwa Anda hanya melengkapi data uji sekarang. Itu sebabnya kami membagi set data ketiga, validasi, jadi kami memiliki lapisan tambahan untuk menjaga diri kami jujur secara internal. Menyetel dengan validateData membuat kita tidak overfitting ke trainingData. Pengujian akhir dengan testData menjaga kita dari overfitting ke validateData.
sumber
Mari kita lihat dengan cara berikut
Praktek umum
a) Data pelatihan - digunakan untuk memilih parameter model.
b) Data validasi - digunakan untuk memilih parameter-hiper.
c) Data uji - digunakan untuk mendapatkan kepercayaan dari hasil dari dua langkah di atas
Cara lain untuk melihat bagian 1
a) Kumpulan kandidat model kami adalah set 5-dimenson, yaitu,
b) Langkah 1a mengurangi kandidat model dari 5-dimensi menjadi 1-dimensi.
c) Langkah 1b mengurangi kandidat model dari 1-dimensi menjadi 0-dimensi, yang merupakan model tunggal.
d) Namun, OP mungkin berpikir output 'final' di atas tidak berkinerja cukup baik pada set data uji, dan dengan demikian mengulangi seluruh proses lagi, katakanlah menggunakan regresi ridge alih-alih regresi linear biasa. Kemudian set data uji digunakan beberapa kali dan dengan demikian kebisingan dalam data ini mungkin menghasilkan beberapa overfitting dalam memutuskan apakah akan menggunakan regresi linier atau regresi ridge.
e) Untuk menangani kumpulan model dimensi tinggi dengan parameter, hiperparameter, tipe model, dan metode pra-pemrosesan, setiap pemisahan pada data yang tersedia bagi kami pada dasarnya adalah mendefinisikan proses pengambilan keputusan yang
Kesimpulan dan jawaban untuk pertanyaan OP
a) Dua-split (pelatihan dan tes), tiga-split (pelatihan, validasi dan pengujian) atau jumlah split yang lebih tinggi pada dasarnya tentang mengurangi dimensi dan mengalokasikan data (terutama kebisingan dan risiko pemasangan berlebihan).
b) Pada tahap tertentu, Anda dapat menemukan kumpulan calon model 'final', dan kemudian, Anda dapat memikirkan bagaimana merancang proses mengurangi dimensi secara berurutan sehingga
c) Bagaimana jika Anda tidak dapat mencapai b
sumber