Cross memvalidasi regresi laso di R

10

Fungsi R cv.glm (library: boot) menghitung perkiraan kesalahan prediksi validasi silang K-fold untuk model linier umum dan mengembalikan delta. Apakah masuk akal untuk menggunakan fungsi ini untuk regresi laso (library: glmnet) dan jika demikian, bagaimana hal itu dapat dilakukan? Pustaka glmnet menggunakan cross-validation untuk mendapatkan parameter belokan terbaik, tapi saya tidak menemukan contoh yang cross-memvalidasi persamaan glmnet akhir.

kalakaru
sumber
2
Itu tentu masuk akal, & meskipun LASSO hanya mengoptimalkan lebih dari satu (hyper-) parameter, jika Anda ingin mendapatkan estimasi terbaik, Anda dapat melakukan kinerja out-of-sample, Anda memerlukan loop validasi silang luar. Lihat Bisakah Anda berpakaian berlebihan dengan melatih algoritma pembelajaran mesin menggunakan CV / Bootstrap? & surat-surat yang dikutip.
Scortchi
Dianjurkan untuk menggunakan glmnet daripada glm esp. jika Anda melakukan CV. Jika saya ingat, paket glm menjadi menyakitkan untuk digunakan. Juga, cv.glmnet memperlihatkan lebih banyak parameter daripada cv.glm.
smci

Jawaban:

9

Contoh tentang cara melakukan validasi silang vanilla polos untuk laso glmnetpada mtcars kumpulan data.

  1. Memuat kumpulan data.

  2. Mempersiapkan fitur (variabel independen). Mereka harus dari matrixkelas. Cara termudah untuk mengkonversi yang dfberisi variabel kategori ke matrixadalah melalui model.matrix. Pikiran Anda, secara default glmnetcocok mencegat, sehingga Anda lebih baik menghapus intersep dari matriks model.

  3. Mempersiapkan respons (variabel dependen). Mari kode mobil dengan rata-rata di atas mpgsebagai efisien ('1') dan sisanya tidak efisien ('0'). Ubah variabel ini menjadi faktor.

  4. Jalankan validasi silang melalui cv.glmnet. Ini akan mengambil alpha=1dari glmnetparameter default , yang adalah apa yang Anda minta: lasso regression.

  5. Dengan memeriksa hasil validasi silang, Anda mungkin tertarik pada setidaknya 2 informasi:

    • lambda, yang meminimalkan kesalahan lintas-divalidasi. glmnetsebenarnya menyediakan 2 lambda: lambda.mindan lambda.1se. Ini panggilan penilaian Anda sebagai ahli statistik yang akan digunakan.

    • menghasilkan koefisien yang diatur.

Silakan lihat kode R sesuai instruksi di atas:

# Load data set
data("mtcars")

# Prepare data set 
x   <- model.matrix(~.-1, data= mtcars[,-1])
mpg <- ifelse( mtcars$mpg < mean(mtcars$mpg), 0, 1)
y   <- factor(mpg, labels = c('notEfficient', 'efficient'))

library(glmnet)

# Run cross-validation
mod_cv <- cv.glmnet(x=x, y=y, family='binomial')

mod_cv$lambda.1se
[1] 0.108442

coef(mod_cv, mod_cv$lambda.1se)
                     1
(Intercept)  5.6971598
cyl         -0.9822704
disp         .        
hp           .        
drat         .        
wt           .        
qsec         .        
vs           .        
am           .        
gear         .        
carb         .  

mod_cv$lambda.min
[1] 0.01537137

coef(mod_cv, mod_cv$lambda.min)
                      1
(Intercept)  6.04249733
cyl         -0.95867199
disp         .         
hp          -0.01962924
drat         0.83578090
wt           .         
qsec         .         
vs           .         
am           2.65798203
gear         .         
carb        -0.67974620

Komentar terakhir:

  • perhatikan, output model tidak mengatakan apa-apa tentang signifikansi statistik dari koefisien, hanya nilai.

  • penalizer l1 (lasso), yang Anda minta, terkenal karena ketidakstabilan yang dibuktikan dalam ini posting blog dan stackexchange ini pertanyaan . Cara yang lebih baik adalah dengan melakukan validasi silang alphajuga, yang akan memungkinkan Anda memutuskan campuran yang tepat dari penalizer l1 dan l2.

  • cara alternatif untuk melakukan validasi silang bisa dengan beralih ke tanda sisipan train( ... method='glmnet')

  • dan akhirnya, cara terbaik untuk belajar lebih banyak tentang cv.glmnetdan itu berasal dari default glmnettentu saja ?glmnetdi konsol R))))

Sergey Bushmanov
sumber
Jawaban bagus. .. itu juga layak menjalankan CV beberapa kali dan rata-rata kurva kesalahan (lihat? cv.glmnet) untuk memperhitungkan pengambilan sampel.
user20650
@SergeyBushmanov SANGAT BERMANFAAT!
theforestecologist
Hai, saya tahu ini posting lama, tetapi saya ingin bertanya kepada Anda. Anda menyebutkan bahwa keluaran model tidak mengatakan apa-apa tentang signifikansi statistik dari koefisien, jadi bagaimana Anda menentukan bahwa mereka signifikan atau tidak?
Jun Jang
@JunJang "Tidak ada signifikansi statistik untuk koefisien" adalah pernyataan dari penulis paket, bukan saya. Pernyataan ini diberikan, saya tidak ingat persis, baik di salah satu buku dari penulis paket atau dalam sketsa paket. Dalam kasus seperti itu, daripada mengatakan koefisien signifikan atau tidak, Anda lebih suka mengatakan mereka "berguna" atau tidak dalam menjelaskan target melalui validasi silang.
Sergey Bushmanov