Bagaimana Anda menggunakan dataset 'test' setelah validasi silang?


25

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.


1
Anda mengevaluasi model terbaik Anda pada set tes dan melaporkan kinerja itu. Ini adalah perkiraan terbaik Anda dari kinerja model Anda. Saya sarankan Anda untuk membaca dua bab pertama dari buku bagus "Belajar dari Data" oleh Yaser Abu-Mostafa. Sangat ringkas dan sangat mudah diakses. work.caltech.edu/telecourse.html
Vladislavs Dovgalecs

1
Terima kasih untuk buku yang telah Anda sarankan! Tetapi mengenai jawaban Anda atas pertanyaan - Anda mengatakan itu adalah "perkiraan terbaik kinerja model Anda", tetapi sebenarnya adalah perkiraan kinerja model pada set tes kecil (20%) , itu tidak berarti model kinerja secara umum.
Serhiy

2
Sebenarnya ini adalah perkiraan terbaik Anda dari kinerja model secara umum. Model Anda mungkin bias dan / atau menderita varians yang tinggi, tetapi kinerja model pada set pengujian Anda adalah indikator terbaik bagaimana itu akan tampil pada data yang tidak terlihat.
Vladislavs Dovgalecs

Terima kasih xeon! Satu-satunya hal yang masih belum jelas bagi saya, adalah apa yang kita lakukan setelah menilai model menggunakan set data uji ?
Serhiy

Anda bisa mengirimkan model jika Anda senang dengan hasilnya atau menemukan fitur / algoritma / data yang lebih baik untuk meningkatkan model.
Vladislavs Dovgalecs

Jawaban:


20

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:

  1. Jika Anda memiliki banyak sumber daya, idealnya Anda mengumpulkan satu dataset dan melatih model Anda melalui cross-validation. Kemudian Anda akan mengumpulkan dataset lain yang sepenuhnya independen dan menguji model Anda. Namun, seperti yang saya katakan sebelumnya, ini biasanya tidak mungkin bagi banyak peneliti.

Sekarang, jika saya seorang peneliti yang tidak seberuntung apa yang harus saya lakukan? Nah, Anda bisa mencoba meniru skenario yang tepat itu:

  1. Sebelum Anda melakukan pelatihan model apa pun, Anda akan mengambil data Anda dan membiarkannya ke samping ( tidak pernah disentuh selama cross-validation ). Ini untuk mensimulasikan dataset independen yang sama yang disebutkan dalam skenario ideal di atas. Meskipun berasal dari dataset yang sama, pelatihan model tidak akan mengambil informasi apa pun dari sampel tersebut (di mana dengan validasi silang semua data digunakan). Setelah Anda melatih model Anda, Anda kemudian akan menerapkannya ke set tes Anda , sekali lagi yang tidak pernah terlihat selama pelatihan, dan mendapatkan hasil Anda. Ini dilakukan untuk memastikan model Anda lebih dapat digeneralisasikan dan tidak hanya mempelajari data Anda .

Untuk mengatasi masalah Anda yang lain:

Katakanlah kita memiliki akurasi 70% pada set data uji, jadi apa yang kita lakukan selanjutnya? Apakah kita mencoba model lain, dan kemudian yang lain, sampai kita mendapatkan skor tinggi pada set data uji kita?

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 .

Dan juga, bagaimana kita dapat menganggap skor ini sebagai evaluasi umum model, jika dihitung pada set data yang terbatas? Jika skor ini rendah, mungkin kami kurang beruntung memilih data tes "buruk".

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.


3
Terima kasih atas penjelasan terinci seperti itu! Satu-satunya hal yang masih belum jelas bagi saya, adalah apa yang kita lakukan setelah menilai model menggunakan set data uji ? Bagaimana jika hasilnya benar-benar rendah? Apakah kita mencoba model lain?
Serhiy

Seperti yang saya katakan di atas, Anda dapat mengevaluasi kembali validasi silang Anda dan melihat apakah metode Anda dapat ditingkatkan selama Anda tidak menggunakan data 'tes' Anda untuk pelatihan model. Jika hasil Anda rendah, Anda mungkin memiliki pakaian model Anda. Dataset Anda mungkin hanya memiliki banyak daya prediksi.
cdeterman

Bukankah validasi silang hanya berulang kali dibagi menjadi pelatihan dan set tes (misalnya set tes menjadi 20% pertama kemudian 20% kedua lalu ketiga dan seterusnya, atau semua memilih secara acak 20% untuk tes n kali dan menghitung akurasi rata-rata) dan melakukan hal yang persis sama, yang Anda jelaskan lakukan dengan set tes? Tidak menunjukkannya ke algoritma sama sekali sampai tes?
Zelphir Kaltstahl

2
@ Zelphir tidak, setiap lipatan dievaluasi beberapa kali dengan setiap kombinasi hiperparameter. Cukup memilih hasil terbaik cenderung melaporkan hasil yang lebih tinggi daripada pada set tes 'independen'. Idenya adalah untuk melihat parameter mana yang menggeneralisasi lipatan ini dan menggunakan arsitektur itu pada set tes yang belum pernah dilihatnya untuk menentukan seberapa 'generalisasi' model tersebut.
cdeterman

1
Saya ingin menambahkan bahwa sebenarnya tindakan melihat kinerja pada set tes independen Anda dan memutuskan untuk kembali dan melatih kembali model Anda membuat set tes Anda tidak lagi sepenuhnya independen . Bahkan Anda bisa melakukan ini berkali-kali hingga Anda mendapatkan akurasi yang sempurna. Berkenaan dengan referensi akademis, saya merekomendasikan buku "Belajar dari data", ada juga kursus online gratis oleh penulis ( work.caltech.edu/telecourse.html ).
Michael

4

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


1

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.


Bagaimana jawaban ini berbeda dari jawaban yang diterima ?
Jan Kukacka

Pertanyaan asli secara eksplisit menanyakan tentang alur kerja yang tidak termasuk validasi silang. Saya membaca pertanyaannya untuk menanyakan cara kerjanya dan mengapa itu bisa diandalkan. Jawaban yang diterima membahas alur kerja yang masih menyertakan validasi silang. Saya ingin menjelaskan bagaimana orang melakukannya tanpa harus menggunakan validasi silang jika seseorang adalah pemula dan mungkin belum pada saat itu. Maaf jika memposting ini salah - saya adalah pengguna baru dan tidak bermaksud melanggar aturan.
John D

0

Mari kita lihat dengan cara berikut

  1. Praktek umum

    a) Data pelatihan - digunakan untuk memilih parameter model.

     i) E.g., finding intercept and slope parameters for an ordinary linear 
        regression model. 
    
     ii) The noise in the training data-set is used in some extent 
         in over-fitting model parameters. 
    

    b) Data validasi - digunakan untuk memilih parameter-hiper.

     i)  E.g., we may want to test three different models at step 1.a, say 
         linear model with one, two or three variables.   
    
     ii) The validation data-set is independent from training data, and thus, they provide 
         'unbiased' evaluation to the models, which help to decide which 
         hyper-parameter to use. 
    
     iii) We note that, a model trained in 1.a, say y = b_0+b_1*x_1, does 
         not learn anything from this data-set. So, the noise in this data- 
         set is not used to over-fit the parameters (b_0, b_1), but, over- 
         fit exists in choosing which linear model to use (in terms of 
         number of variables). 
    

    c) Data uji - digunakan untuk mendapatkan kepercayaan dari hasil dari dua langkah di atas

    i) Used once a model is completely trained
    
  2. Cara lain untuk melihat bagian 1

    a) Kumpulan kandidat model kami adalah set 5-dimenson, yaitu,

    i) Dimension 1: number of variables to keep in the regression model, 
       e.g., [1, 2, 3].
    
    ii) Dimension 2-5: (b_0, b_1, b_2, b_3). 
    

    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

    i)  Sequentially reducing the model pool to zero-dimension.
    
    ii) Allocating data noise overfitting to different steps of dimension 
        reductions (overfitting the noise in the data is not avoidable but 
        could be allocated smartly). 
    
  3. 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

    i) At each step of reducing the dimensions, the output is satisfactory, 
      e.g., not using just 10 data points with large noise to estimate a 
      six-parameter liner model. 
    
    ii) There are enough data for you to reduce the dimension to zero 
       finally. 
    

    c) Bagaimana jika Anda tidak dapat mencapai b

    i) Use model and data insight to reduce the overall dimensionality of 
      your model pool. E.g., liner regression is sensitive to outliers thus 
      not good for data with many large outliers. 
    
    ii) Choose robust non-parametric models or models with less number of 
       parameter if possible. 
    
    iii) Smartly allocating the data available at each step of reducing the 
        dimensionality. There is some goodness of fit tests to help us decide 
        whether the data we use to train the model is enough or not. 
    
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.