Bagaimana saya tahu metode validasi silang mana yang terbaik?


36

Saya mencoba mencari tahu metode validasi silang mana yang terbaik untuk situasi saya.

Data berikut ini hanyalah contoh untuk bekerja melalui masalah (dalam R), tetapi Xdata saya yang sebenarnya ( xmat) berkorelasi satu sama lain dan berkorelasi dengan derajat yang berbeda dengan yvariabel ( ymat). Saya memberikan kode R, tetapi pertanyaan saya bukan tentang R melainkan tentang metode. Xmattermasuk variabel X V1 ke V100 sambil ymatmenyertakan variabel y tunggal.

set.seed(1233)
xmat           <- matrix(sample(-1:1, 20000, replace = TRUE), ncol = 100)
colnames(xmat) <- paste("V", 1:100, sep ="")
rownames(xmat) <- paste("S", 1:200, sep ="")
  # the real y data are correlated with xmat
ymat           <- matrix(rnorm(200, 70,20), ncol = 1)
rownames(ymat) <- paste("S", 1:200, sep="")

Saya ingin membangun model untuk memprediksi yberdasarkan semua variabel dalam xmat. Jadi itu akan menjadi model regresi linier y ~ V1 + V2 + V3+ ... + V100. Dari ulasan, saya dapat melihat tiga metode validasi silang berikut:

  1. Bagi data menjadi sekitar setengah dan gunakan satu untuk pelatihan dan setengah lainnya untuk pengujian (validasi silang):

    prop       <- 0.5 # proportion of subset data
    set.seed(1234)
      # training data set 
    training.s <- sample (1:nrow(xmat), round(prop*nrow(xmat),0))
    xmat.train <- xmat[training.s,]
    ymat.train <- ymat[training.s,]
    
      # testing data set 
    testing.s <- setdiff(1:nrow(xmat), training)
    xmat.test <- xmat[testing.s,]
    ymat.test <- ymat[testing.s,]
    
  2. K-fold cross validation - menggunakan 10 fold cross validation:

    mydata <- data.frame(ymat, xmat)
    fit    <- lm(ymat ~ ., data=mydata)
    library(DAAG)
    cv.lm(df=mydata, fit, m=10) # ten-fold cross validation 
    
  3. Menyamarkan satu nilai atau beberapa nilai sekaligus : Dalam metode ini kami secara acak menyembunyikan nilai dalam dataset (y) dengan menggantinya dengan NA dan memprediksinya. Proses ini diulangi sebanyak n kali.

    n = 500 
    predicted.v <- rep(NA, n)
    real.v      <- rep(NA, n)
    
    for (i in 1:n){
      masked.id <- sample (1:nrow(xmat), 1)
      ymat1     <- ymat 
      real.v[i] <- ymat[masked.id,]
      ymat1[masked.id,] <- NA
      mydata            <- data.frame(ymat1, xmat)
      fit               <- lm(ymat1 ~ ., data=mydata)
      predicted.v[i]    <- fit$fitted.values[masked.id]
    }
    

Bagaimana saya tahu yang terbaik untuk situasi apa pun? Apakah ada metode lain? Bootstrap validationvs CV? Contoh yang dikerjakan akan dihargai.


Apakah Anda tertarik untuk memeriksa validitas data atau memverifikasi perkiraan perkiraan atau nilai koefisien-b.
Subhash C. Davar

Saya tertarik memverifikasi perkiraan prediksi atau nilai koefisien-b
rdorlearn

Masalah yang saya miliki dengan metode # 1 adalah bahwa ukuran sampel jauh lebih kecil daripada yang Anda miliki dalam kenyataan. Oleh karena itu estimasi pita kepercayaan / variabilitas cenderung jauh lebih besar. Juga, saya menebak metode # 2 dan metode # 3 akan serupa dalam kinerja. Jika saya jadi Anda, mulailah dengan validasi silang K-fold untuk K = 5,6, ..., 14,15 dan lihat saja apakah hasil Anda cukup mirip.
Kian

Juga, apakah Anda bermaksud melakukan pemilihan model untuk mengurangi jumlah kovariat? 100 sepertinya cukup banyak.
Kian

@ user2432701 Tidak, saya ingin menggunakan semua 100.
rdorlearn

Jawaban:


34

Karena OP telah memberikan hadiah pada pertanyaan ini, ia harus menarik perhatian, dan karenanya merupakan tempat yang tepat untuk membahas beberapa ide umum, bahkan jika ia tidak menjawab OP secara langsung.

Nama pertama:

a) validasi silang adalah nama umum untuk semua teknik estimasi / pengukuran yang menggunakan set tes berbeda dari set kereta. Sinonim: estimasi out-of-sample atau extra-sample. Antonim: estimasi dalam sampel.

Estimasi sampel adalah teknik yang menggunakan beberapa informasi pada set pelatihan untuk memperkirakan kualitas model (tidak harus kesalahan). Ini sangat umum jika model memiliki bias tinggi - yaitu - membuat asumsi yang kuat tentang data. Dalam model linier (model bias tinggi), seperti pada contoh pertanyaan, seseorang menggunakan R-squared, AIC, BIC, deviance, sebagai ukuran kualitas model - semua ini adalah penduga dalam sampel. Dalam SVM, misalnya, data rasio dalam vektor dukungan terhadap jumlah data adalah estimasi kesalahan sampel model.

Ada banyak teknik validasi silang:

b) bertahan adalah metode # 1 di atas. Bagi set menjadi pelatihan dan satu tes. Ada sejarah panjang diskusi dan praktik tentang ukuran relatif pelatihan dan set tes.

c) k -fold - metode # 2 di atas. Cukup standar.

d) Tinggalkan satu - keluar - metode # 3 di atas.

e) bootstrap : jika set Anda memiliki data N , pilih secara acak sampel N DENGAN PENGGANTIAN dari set dan gunakan sebagai pelatihan. Data dari set asli yang belum menjadi sampel setiap saat digunakan sebagai set uji. Ada berbagai cara untuk menghitung estimasi akhir dari kesalahan model yang menggunakan kesalahan untuk set tes (di luar sampel) dan kesalahan untuk set kereta (dalam-sampel). Lihat misalnya, .632 bootstrap. Saya pikir ada juga rumus .632+ - mereka adalah rumus yang memperkirakan kesalahan sebenarnya dari model menggunakan kesalahan di luar sampel dan di dalam sampel.

f) Orthogonal untuk pemilihan metode di atas adalah masalah pengulangan. Kecuali untuk cuti satu, semua metode di atas dapat diulang beberapa kali. Bahkan seseorang dapat berbicara tentang hold-out REPEATED, atau REPEATED k -fold. Agar adil, hampir selalu metode bootstrap digunakan secara berulang.


Pertanyaan selanjutnya adalah, metode mana yang "lebih baik". Masalahnya adalah apa artinya "lebih baik".

1) Jawaban pertama adalah apakah masing-masing metode ini bias untuk estimasi kesalahan model (untuk jumlah data masa depan yang tak terbatas).

2) Alternatif kedua adalah seberapa cepat atau seberapa baik masing-masing metode ini bertemu dengan kesalahan model yang sebenarnya (jika mereka tidak bias). Saya percaya ini masih menjadi topik penelitian. Izinkan saya menunjukkan dua makalah ini (di balik dinding berbayar) tetapi abstraknya memberi kita pemahaman tentang apa yang ingin mereka capai. Perhatikan juga bahwa sangat umum untuk memanggil k -fold sebagai "cross-validation" dengan sendirinya.

Mungkin ada banyak makalah lain tentang topik ini. Itu hanya beberapa contoh.

3) Aspek lain dari "lebih baik" adalah: diberikan ukuran tertentu dari kesalahan model menggunakan salah satu teknik di atas, seberapa yakin Anda bahwa kesalahan model yang benar sudah dekat.

Secara umum, dalam hal ini Anda ingin mengambil banyak ukuran kesalahan dan menghitung interval kepercayaan (atau interval yang kredibel jika Anda mengikuti pendekatan Bayesian). Dalam hal ini, masalahnya adalah seberapa banyak Anda bisa mempercayai varians dari serangkaian tindakan kesalahan. Perhatikan bahwa kecuali untuk cuti satu, semua teknik di atas akan memberi Anda banyak ukuran berbeda (pengukuran k untuk lipatan k , n pengukuran untuk penahan berulang n ) dan dengan demikian Anda dapat mengukur varians (atau standar deviasi) ) dari set ini dan menghitung interval kepercayaan untuk ukuran kesalahan.

Di sini segalanya menjadi agak rumit. Dari apa yang saya pahami dari makalah. Tidak ada penaksir yang tidak bias dari varian k -fold cross-validation (bukan di belakang paywall), orang tidak bisa mempercayai varian yang Anda dapatkan dari k -fold - jadi orang tidak dapat membangun interval kepercayaan yang baik dari k - lipatan. Juga dari apa yang saya mengerti dari kertas Tes statistik Perkiraan untuk Membandingkan Diawasi Klasifikasi Belajar Algoritma (tidak di belakang paywall), teknik yang menggunakan tindakan berulang (diulang k-lipat, tahan terus-menerus - tidak yakin tentang bootstrap) akan men-sub-estimasi varians sebenarnya dari ukuran kesalahan (agak mudah untuk melihatnya - karena Anda mengambil sampel dari himpunan terbatas jika Anda mengulangi pengukuran dengan jumlah yang sangat besar) Terkadang, nilai yang sama akan terus berulang, yang berarti tetap sama, tetapi mengurangi varians). Dengan demikian teknik pengukuran yang diulang akan terlalu optimis pada interval kepercayaan.

Makalah terakhir ini menyarankan untuk melakukan 5 kali lipat 2 kali lipat - yang dia sebut 5 × 2 CV - sebagai keseimbangan yang baik dari banyak tindakan (10) tetapi tidak terlalu banyak pengulangan.

EDIT:

Tentu saja ada jawaban yang bagus di Cross yang divalidasi untuk beberapa pertanyaan ini (meskipun kadang-kadang mereka tidak setuju di antara mereka sendiri). Inilah beberapa:

Validasi silang atau bootstrap untuk mengevaluasi kinerja klasifikasi?

Perbedaan antara validasi silang dan bootstrap untuk memperkirakan kesalahan prediksi

Validasi silang atau bootstrap untuk mengevaluasi kinerja klasifikasi?

Memahami bootstrap untuk validasi dan pemilihan model

Secara umum, tag adalah teman Anda di sini.


Jadi apa solusi terbaik? Saya tidak tahu Saya telah menggunakan CV 5 × 2 ketika saya harus sangat teliti, ketika saya perlu memastikan bahwa satu teknik lebih baik daripada yang lain, terutama di publikasi. Dan saya menggunakan penahan jika saya tidak berencana untuk mengukur varians atau standar deviasi, atau jika saya memiliki batasan waktu - hanya ada satu model yang belajar dalam penunda .


Adapun sifat varians rumit validasi silang, saya pikir orang perlu berhati-hati apa varians yang akan diukur. IIRC, Bengio et al. fokus pada varians untuk kumpulan data ukuran n untuk masalah yang dihadapi. Yang berbeda (dan lebih besar) dari ketidakpastian acak untuk prediksi model dilatih dalam kumpulan data yang saya miliki di tangan. Lihat juga masalah taksonomi dalam makalah Dietterich yang ditautkan di atas.
cbeleites mendukung Monica

7

Silakan merujuk ke halaman wikipedia untuk definisi metode (mereka melakukan pekerjaan yang jauh lebih baik daripada yang bisa saya lakukan di sini).

Setelah Anda melihat halaman itu, berikut ini mungkin bisa membantu Anda. Biarkan saya fokus pada bagian pertanyaan di mana orang ingin memilih salah satu dari metode ini untuk proses pemodelan mereka. Karena ini adalah pilihan yang cukup sering dibuat seseorang, dan mereka dapat mengambil manfaat dari pengetahuan tambahan, inilah jawaban saya untuk dua situasi:

  1. Situasi apa pun : Gunakan k-fold cross validationdengan beberapa pengulangan yang sesuai (katakanlah 5 atau 10).

    • Membagi data menjadi 1 babak, melatih di babak pertama dan memvalidasi di sisi lain adalah satu langkah dalam validasi silang 2 kali lipat (langkah lain mengulangi latihan yang sama dengan kedua babak dipertukarkan). Karenanya, singkirkan strategi 'memecah data menjadi setengah'.

    • Banyak makalah pembelajaran mesin dan data mining menggunakan validasi k-fold cross (tidak memiliki kutipan), jadi gunakan kecuali Anda harus sangat berhati-hati dalam langkah ini.

    • Sekarang, tinggalkan satu metode dan metode lain seperti ' tinggalkan p ' dan ' split acak dan ulangi ' (pada dasarnya proses seperti bootstrap dijelaskan di atas) adalah pesaing yang sangat bagus.

    • Jika ukuran data Anda adalah N, maka validasi N-fold cross pada dasarnya sama dengan meninggalkan satu.

    • 'tinggalkan p keluar' dan 'bootstrap' sedikit lebih berbeda dari validasi k fold cross, tetapi perbedaannya pada dasarnya adalah bagaimana lipatan didefinisikan dan jumlah pengulangan 'k' yang terjadi.

    • Seperti yang dikatakan halaman wiki, k-fold dan ' leave p out ' adalah penaksir yang layak untuk ' kinerja / kecocokan yang diharapkan ' (meskipun taruhan dibatalkan sehubungan dengan varians dari penaksir ini).

  2. Situasi Anda: Anda hanya memiliki ukuran sampel 200 dibandingkan dengan jumlah fitur (100). Saya pikir ada peluang yang sangat tinggi bahwa ada beberapa model linier yang memberikan kinerja yang sama. Saya akan menyarankan menggunakan validasi k-fold cross dengan> 10 repeats . Pilih nilai ak 3 atau 5.

    • Alasan untuk nilai k: pilihan umum.

    • Alasan untuk nilai pengulangan: Nilai pengulangan yang cukup tinggi mungkin sangat penting di sini karena output dari perhitungan validasi silang k-fold tunggal mungkin berhasil untuk melipat variabilitas pemisahan / keacakan yang kami perkenalkan.

Pikiran tambahan:

  • Mungkin saya juga akan menggunakan metode ' tinggalkan p ' dan ' bootstrap seperti pengulangan split acak ' (selain k-fold cross validation) untuk kinerja / ukuran yang sama untuk memeriksa apakah output metode k-fold cross validation saya terlihat baik-baik saja.

  • Meskipun Anda ingin menggunakan semua 100 fitur, seperti yang disarankan seseorang, perhatikan multikolinieritas / korelasi dan mungkin kurangi jumlah fitur.



Saya akan memotong banyak ini dan langsung ke bootstrap optimisme Efron-Gong seperti yang diterapkan dalam rmspaket R validatedan calibratefungsi.
Frank Harrell
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.