Bagaimana cara melakukan validasi silang dengan cv.glmnet (regresi LASSO dalam R)?

10

Saya bertanya-tanya bagaimana cara pendekatan dengan benar pelatihan dan pengujian model LASSO menggunakan glmnet di R?

  • Secara khusus, saya bertanya-tanya bagaimana cara melakukannya jika kurangnya set data uji eksternal mengharuskan saya gunakan validasi silang (atau pendekatan serupa lainnya) untuk menguji model LASSO saya.

Biarkan saya memecah skenario saya:

Saya hanya memiliki satu set data untuk menginformasikan dan melatih model glmnet saya. Akibatnya, saya harus menggunakan validasi silang untuk membagi data saya untuk juga menghasilkan cara untuk menguji model saya.

Saya sudah menggunakan cv.glmnet, yang menurut detail paket :

Apakah k-fold cross-validation untuk glmnet, menghasilkan plot, dan mengembalikan nilai untuk lambda.

  • Apakah validasi silang dilakukan pada cv.glmnet hanya untuk memilih lambda terbaik, atau apakah itu juga berfungsi sebagai prosedur validasi silang yang lebih umum?

    • Dengan kata lain, apakah saya masih perlu melakukan langkah validasi silang lain untuk "menguji" model saya?

Saya bekerja dengan asumsi bahwa, "ya saya lakukan."

Karena itu, bagaimana cara saya mendekati memvalidasi cv.glmnetmodel saya ?

  • Apakah saya harus melakukannya secara manual, atau mungkin caretfungsi ini berguna untuk model glmnet?

  • Apakah saya menggunakan dua "loop" konsentris lintas validasi? ... Apakah saya menggunakan "loop dalam" melalui CV cv.glmnetuntuk menentukan nilai lambda terbaik dalam setiap lipatan k "loop eksternal" dari pemrosesan validasi silang k-fold ?

    • Jika saya melakukan validasi silang dari cv.glmnetmodel validasi silang yang sudah saya lakukan, bagaimana cara mengisolasi model "terbaik" (dari nilai lambda "terbaik") dari masing-masing cv.glmnetmodel dalam setiap lipatan dari "loop eksternal" validasi silang saya?

      • Catatan: Saya mendefinisikan model "terbaik" sebagai model yang terkait dengan lambda yang menghasilkan MSE dalam 1 SE dari minimum ... ini adalah $lambda.1sedalam cv.glmnetmodel.

Konteks:

Saya mencoba memprediksi usia pohon ("umur") berdasarkan diameter pohon ("D"), D ^ 2, dan spesies ("faktor (SPEC)"). [persamaan yang dihasilkan: Age ~ D + factor(SPEC) + D^2]. Saya memiliki ~ 50 ribu baris data, tetapi datanya longitudinal (melacak individu melalui waktu) dan terdiri dari ~ 65 spesies.

ahli hutan
sumber
1
Bagi mereka yang memilih untuk menutup tanpa berkomentar: itu tidak membantu ... beri tahu saya apa masalah Anda di komentar dan saya akan mencoba memperbaikinya.
theforestecologist
1
Mereka tidak memilih untuk menutup, mereka memilih untuk bermigrasi ke CrossValidated. Saya baru saja menambahkan suara saya untuk itu.
Hack-R
@theforestecologist: Anda harus dapat melihat alasan yang dikutip untuk penutupan / migrasi dengan mengklik tombol 'tutup'.
DWin
Terima kasih telah bertanya, saya memiliki pertanyaan ini. Dan saya tidak dapat menggunakan tanda sisipan karena saya memiliki Y multivarian. Tetapi apakah Anda telah memeriksa kode sumber dan mengonfirmasi bahwa tidak diperlukan CV tambahan? Kode sumber bisa sangat sulit diikuti.
qoheleth

Jawaban:

3

Apakah validasi silang dilakukan di cv.glmnet hanya untuk memilih lambda terbaik, atau apakah itu juga berfungsi sebagai prosedur validasi silang yang lebih umum?

Ia melakukan hampir semua yang dibutuhkan dalam validasi silang. Sebagai contoh, ini cocoklambda nilai yang pada data, memilih model terbaik dan akhirnya melatih model dengan parameter yang sesuai.

Misalnya, di objek yang dikembalikan ::

cvmadalah galat yang divalidasi silang rata-rata. cvsdadalah estimasi standar deviasi.

Seperti nilai yang dikembalikan lainnya, ini dihitung pada set tes. Akhirnya,

glmnet.fit memberikan model yang dilatih pada semua data (pelatihan + tes) dengan parameter terbaik.

Apakah saya harus melakukannya secara manual, atau mungkin fungsi caret berguna untuk model glmnet?

Anda tidak perlu melakukan ini secara manual. 'Caret' akan sangat berguna, dan merupakan salah satu paket favorit saya karena berfungsi untuk semua model lain dengan sintaks yang sama. Saya sendiri sering menggunakan caretdaripada cv.glmnet. Namun, dalam skenario Anda pada dasarnya sama.

Apakah saya menggunakan dua "loop" konsentris validasi silang? ... Apakah saya menggunakan "loop dalam" dari CV melalui cv.glmnet untuk menentukan nilai lambda terbaik dalam setiap lipatan k "loop eksternal" dari k-fold pemrosesan validasi silang?

Anda bisa melakukan ini dan konsep ini sangat mirip dengan ide Nested Cross-Validation Nested cross validation untuk pemilihan model .

Jika saya melakukan validasi silang dari model cv.glmnet saya yang sudah divalidasi silang, bagaimana cara mengisolasi model "terbaik" (dari nilai lambda "terbaik") dari setiap model cv.glmnet dalam setiap lipatan dari loop eksternal saya jika tidak " "validasi silang?

Jalankan saja loop di mana Anda menghasilkan data pelatihan dan data uji dijalankan cv.glmnetpada data pelatihan dan gunakan model glmnet.fituntuk memprediksi data uji.

disiplin
sumber
@dupupulus: Terima kasih. Bisakah Anda memberikan semacam bukti untuk itu? (Yaitu, tolong bantu saya melewatinya). Juga, mengingat jawaban Anda, apakah itu berarti bahwa tidak ada proses validasi silang lebih lanjut yang diperlukan untuk melaporkan metrik kinerja untuk data? (Saya bisa melaporkan MSE dari kasus lambda.1se sebagai kinerja model akhir saya?)
theforestecologist
Ya, tidak perlu melakukan validasi silang lebih lanjut. Sebagai bukti, Anda dapat melihat kode sumber cv.glmnetfungsi seperti Ropensource. Cukup ketik cv.glmnetkonsol.
Disiplin
3
@discipulus. Saya mengirim surel kepada Trevor Hastie dengan menanyakan "apakah cv.glmnet (implementasi R) hanya melakukan CV untuk memilih lambda? Atau apakah juga melakukan CV luar untuk memvalidasi lambda yang dipilih? Dengan kata lain, apakah kita harus mengkodekan CV luar kita sendiri jika kita ingin memvalidasi lambda yang dipilih? " dan dia menjawab (agak cepat) "Ya, hanya untuk memilih lambda", yang saya artikan hanya CV dalam, dan kita harus membuat kode CV luar kita sendiri.
qoheleth
@theforestecologist Saya mencoba mempelajari lebih lanjut tentang validasi silang dan menemukan pos Anda mendidik. Saya tidak mengerti apa yang Anda maksud dengan cv.glmnet juga berfungsi sebagai prosedur validasi silang yang lebih umum. Saya pikir satu-satunya parameter yang tersedia untuk dipilih adalah lambda - apa lapisan luar validasi silang ada? Akan berterima kasih jika Anda bisa membalas. Terima kasih!
user2450223