PCA dan validasi silang k-fold dalam paket caret di R

16

Saya baru saja menonton ulang kuliah dari kursus Machine Learning on Coursera. Di bagian di mana profesor membahas PCA untuk pra-pemrosesan data dalam aplikasi pembelajaran yang diawasi, ia mengatakan PCA hanya boleh dilakukan pada data pelatihan dan kemudian pemetaan digunakan untuk mengubah validasi silang dan set tes. Lihat juga PCA dan split kereta / tes .

Namun, dalam caretpaket R, data pelatihan yang Anda berikan ke train()fungsi sudah diproses oleh PCA. Jadi ketika algoritma melakukan validasi k-fold cross, set validasi silang telah diproses dengan PCA via preProcess()dan predict()sebenarnya digunakan dalam "fitting" PCA.

Apakah pemahaman saya tentang situasi itu benar? Ie caret's prosedur untuk validasi silang dengan PCA (atau bahkan, dengan metode rescaling / centering) adalah "salah" karena pra-pemrosesan data dilakukan pada set validasi silang serta set pelatihan? Dan jika demikian, seberapa besar dampak ini pada hasil?

mchangun
sumber
1
Pertanyaan menarik. Apakah Profesor Ng memberikan alasan mengapa "PCA hanya dilakukan pada data pelatihan dan kemudian pemetaan digunakan untuk mengubah validasi silang dan set tes"? Intuisi saya adalah bahwa dampaknya minimal, karena data kereta / cv / tes diasumsikan berasal dari distribusi yang sama, dan PCA tidak melibatkan output / variabel dependen.
miura
1
@miura Ya, benar. Saat melakukan PCA, kita perlu memecahkan dimensi k angka minimum dalam vektor output yang diperlukan untuk mencapai "varian yang dipertahankan" yang diinginkan. Parameter k ini sekarang berlaku (dalam pemahaman saya) parameter tambahan dari algoritma kami yang perlu kami sesuaikan. Jika kami melakukan PCA pada set validasi silang juga, kami pada dasarnya melatih sebagian dari algoritma kami pada set CV, sehingga mengurangi nilai validasi silang.
mchangun
Saya pikir Anda membingungkan PCA dan MDS tetapi dalam kedua metode Anda tidak menetapkan varian yang diinginkan. Tetapi Anda dapat menghitungnya dari ajustment yang mereka bawa untuk mengurangi ke dimensi k. Anda tidak perlu menyesuaikannya karena dimensi pertama akan selalu mengurangi lebih banyak varians daripada yang kedua, dan yang kedua lebih dari yang ketiga ...
llrs

Jawaban:

18

Saya tidak melihat ceramah, jadi saya tidak bisa mengomentari apa yang dikatakan.

My $ 0,02: Jika Anda ingin mendapatkan estimasi kinerja yang baik menggunakan resampling, Anda harus benar-benar melakukan semua operasi selama resampling alih-alih sebelumnya. Ini benar-benar berlaku untuk pemilihan fitur [1] serta operasi non-sepele seperti PCA. Jika itu menambah ketidakpastian hasil, sertakan dalam resampling.

Pikirkan tentang regresi komponen utama: PCA diikuti oleh regresi linier pada beberapa komponen. Parameter estimasi PCA (dengan noise) dan jumlah komponen juga harus dipilih (nilai yang berbeda akan menghasilkan hasil yang berbeda => lebih banyak noise).

Katakanlah kita menggunakan CV 10 kali lipat dengan skema 1:

conduct PCA
pick the number of components
for each fold:
   split data
   fit linear regression on the 90% used for training
   predict the 10% held out
end:

atau skema 2:

for each fold:
   split data
   conduct PCA on the 90% used for training
   pick the number of components
   fit linear regression
   predict the 10% held out
end:

Itu harus jelas daripada pendekatan kedua harus menghasilkan perkiraan kesalahan yang mencerminkan ketidakpastian yang disebabkan oleh PCA, pemilihan jumlah komponen dan regresi linier. Akibatnya, CV dalam skema pertama tidak tahu apa yang mendahuluinya.

Saya bersalah karena tidak selalu melakukan semua operasi dengan resampling, tetapi hanya ketika saya tidak terlalu peduli dengan perkiraan kinerja (yang tidak biasa).

Apakah ada banyak perbedaan antara kedua skema tersebut? Itu tergantung pada data dan pra-pemrosesan. Jika Anda hanya memusatkan dan menskalakan, mungkin tidak. Jika Anda memiliki banyak data, mungkin tidak. Ketika ukuran pelatihan ditetapkan turun, risiko mendapatkan estimasi yang buruk naik, terutama jika n mendekati p.

Saya dapat mengatakan dengan pasti dari pengalaman bahwa tidak termasuk pemilihan fitur yang diawasi dalam resampling adalah ide yang sangat buruk (tanpa set pelatihan besar). Saya tidak melihat mengapa pra-pemrosesan akan kebal terhadap ini (sampai taraf tertentu).

@mchangun: Saya pikir jumlah komponen adalah parameter penyetelan dan Anda mungkin ingin memilihnya menggunakan perkiraan kinerja yang dapat digeneralisasikan. Anda dapat secara otomatis memilih K sedemikian sehingga setidaknya X% dari varians dijelaskan dan menyertakan proses itu dalam resampling sehingga kami memperhitungkan kebisingan dalam proses itu.

Maks

[1] Ambroise, C., & McLachlan, G. (2002). Bias seleksi dalam ekstraksi gen berdasarkan data ekspresi gen microarray. Prosiding National Academy of Sciences, 99 (10), 6562-6566.

topepo
sumber
21

Jangan melakukan pra-pemrosesan data sebelum menjalankan trainfungsi! Gunakan preProcess argumen untuk fungsi kereta, dan pra-pemrosesan akan diterapkan pada setiap iterasi pengambilan sampel ulang.

mis. jangan lakukan ini:

library(caret)
dat <- iris
pp <- preProcess(dat[,-5], method="pca")
dat[,-5] <- predict(pp, dat[,-5])
knnFit1 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))

melakukan hal ini!

dat <- iris
knnFit2 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))
Zach
sumber
1
Jika saya melakukan prProcess seperti yang Anda sarankan, apakah saya perlu melakukan preProcess data baru ketika saya ingin menggunakan model untuk prediksi? Saat ini, saya hanya melakukan: di pred <- predict(knnFit2, newdata) mana newdatatidak diskalakan. Apakah Caret cukup pintar untuk mengetahui bahwa ia perlu melakukan praProses newdatasebelum menggunakannya untuk prediksi?
mchangun
7
@mchangun no. caret menyimpan parameter pra-pemrosesan, dan akan melakukan pra-proses data baru dalam panggilan predict.caret. itu sangat licin!
Zach