Bagaimana menafsirkan Lasso menyusutkan semua koefisien ke 0?

8

Saya punya dataset dengan 338 prediktor dan 570 instance (sayangnya tidak dapat diunggah) di mana saya menggunakan Lasso untuk melakukan pemilihan fitur. Secara khusus, saya menggunakan cv.glmnetfungsi dari glmnetsebagai berikut, di mana mydata_matrixmatriks biner 570 x 339 dan hasilnya adalah biner:

library(glmnet)
x_dat <- mydata_matrix[, -ncol(mydata_matrix)]
y <- mydata_matrix[, ncol(mydata_matrix)]
cvfit <- cv.glmnet(x_dat, y, family='binomial')

Plot ini menunjukkan bahwa penyimpangan terendah terjadi ketika semua variabel telah dihapus dari model. Apakah ini benar-benar mengatakan bahwa hanya menggunakan intersepsi lebih prediktif dari hasil daripada menggunakan bahkan satu prediktor, atau apakah saya membuat kesalahan, mungkin dalam data atau dalam pemanggilan fungsi?

Ini mirip dengan pertanyaan sebelumnya , tetapi itu tidak mendapat tanggapan.

plot(cvfit)

masukkan deskripsi gambar di sini

Stuart Lacy
sumber
1
Saya pikir tautan ini dapat menyempurnakan beberapa detail. Intinya, ini mungkin berarti bahwa banyak (jika tidak semua) prediktor Anda tidak terlalu signifikan. Utas di bawah ini menjelaskan hal ini secara lebih rinci. stats.stackexchange.com/questions/182595/...
Dhiraj
3
@Dhiraj Significant adalah istilah teknis yang terkait dengan pengujian signifikansi hipotesis nol. Ini tidak sesuai di sini.
Matthew Drury

Jawaban:

11

Saya tidak berpikir Anda telah membuat kesalahan dalam kode. Ini adalah masalah menafsirkan output.

Lasso tidak menunjukkan individu mana yang "lebih dapat diprediksi" daripada yang lain. Ini hanya memiliki kecenderungan bawaan untuk memperkirakan koefisien sebagai nol. Semakin besar koefisien penalticatatan(λ) adalah, semakin besar kecenderungan itu.

Plot validasi silang Anda menunjukkan bahwa semakin banyak koefisien yang dipaksa ke nol, model melakukan pekerjaan yang lebih baik dan lebih baik dalam memprediksi subset nilai yang telah dihapus secara acak dari dataset. Ketika kesalahan prediksi tervalidasi silang terbaik (diukur sebagai "Penyimpangan Binomial" di sini) tercapai ketika semua koefisien nol, Anda harus menduga bahwa tidak ada kombinasi linear dari setiap subset dari regressor yang mungkin berguna untuk memprediksi hasil.

Anda dapat memverifikasi ini dengan menghasilkan respons acak yang independen dari semua regressor dan menerapkan prosedur pemasangan Anda kepada mereka. Berikut cara cepat untuk mengemulasi dataset Anda:

n <- 570
k <- 338
set.seed(17)
X <- data.frame(matrix(floor(runif(n*(k+1), 0, 2)), nrow=n,
                       dimnames=list(1:n, c("y", paste0("x", 1:k)))))

Kerangka data Xmemiliki satu kolom biner acak bernama "y" dan 338 kolom biner lainnya (yang namanya tidak penting). Saya menggunakan pendekatan Anda untuk mundur "y" terhadap variabel-variabel itu, tetapi - hanya untuk berhati-hati - saya memastikan vektor respons ydan matriks model xcocok (yang mungkin tidak mereka lakukan jika ada nilai yang hilang dalam data) :

f <- y ~ . - 1            # cv.glmnet will include its own intercept
M <- model.frame(f, X)
x <- model.matrix(f, M)
y <- model.extract(M, "response")
fit <- cv.glmnet(x, y, family="binomial")

Hasilnya sangat seperti milik Anda:

plot(fit)

Angka

Memang, dengan data yang sepenuhnya acak ini Lasso masih mengembalikan sembilan perkiraan koefisien bukan nol (meskipun kita tahu, dengan konstruksi, bahwa nilai yang benar semuanya nol). Tetapi kita seharusnya tidak mengharapkan kesempurnaan. Selain itu, karena pemasangan didasarkan pada penghilangan subset data secara acak untuk validasi silang, Anda biasanya tidak akan mendapatkan output yang sama dari satu proses ke proses berikutnya. Dalam contoh ini, panggilan kedua untuk cv.glmnetmenghasilkan kecocokan dengan hanya satu koefisien bukan nol. Untuk alasan ini, jika Anda punya waktu, itu selalu ide yang baik untuk menjalankan kembali prosedur pemasangan beberapa kali dan melacak estimasi koefisien yang secara konsisten bukan nol. Untuk data ini - dengan ratusan regresi - ini akan membutuhkan beberapa menit untuk mengulangi sembilan kali lagi.

sim <- cbind(as.numeric(coef(fit)), 
             replicate(9, as.numeric(coef(cv.glmnet(x, y, family="binomial")))))
plot(1:k, rowMeans(sim[-1,] != 0) + runif(k, -0.025, 0.025), 
     xlab="Coefficient Index", ylab="Frequency not zero (jittered)",
     main="Results of Repeated Cross-Validated Lasso Fits")

Gambar 2

Delapan dari regresi ini memiliki perkiraan nol di sekitar setengah dari kecocokan; sisanya tidak pernah memiliki estimasi nol. Ini menunjukkan sejauh mana Lasso masih akan memasukkan estimasi koefisien bukan nol bahkan ketika koefisien itu sendiri benar-benar nol.

whuber
sumber
1

Jika Anda ingin mendapatkan lebih banyak informasi dapat menggunakan fungsi ini

fit1<-glmnet(x_dat, y, family='binomial', alpha= x)

plot(fit1, xvar = "lambda", label = TRUE)

Grafik harus serupa dengan masukkan deskripsi gambar di sini Label yang memungkinkan untuk mengidentifikasi efek lambda untuk para regressor.

Bisakah Anda menggunakan nilai differents dari x (dalam model disebut faktor alfa) ke 0 (regresi ridge) ke 1 (LASSO Regression). Nilai [0,1] adalah regresi net elastis

Luigi Biagini
sumber
Penurunan alpha ke 0,5 telah membantu memasukkan lebih banyak variabel, terima kasih atas tipnya.
Stuart Lacy
0

Jawabannya bahwa tidak ada kombinasi linear dari variabel yang berguna dalam memprediksi hasil adalah benar dalam beberapa tetapi tidak semua kasus.

Saya memiliki plot seperti di atas yang disebabkan oleh multikolinieritas dalam data saya. Mengurangi korelasi memungkinkan Lasso bekerja tetapi juga menghapus informasi yang berguna tentang hasil. Rangkaian variabel yang lebih baik diperoleh dengan menggunakan kepentingan hutan acak untuk menyaring variabel dan kemudian menggunakan Lasso.

Hujan
sumber
-1

Itu mungkin tapi sedikit mengejutkan. LASSO dapat melakukan hal-hal aneh ketika Anda memiliki collinearity, dalam hal ini Anda mungkin harus menetapkan alpha <1 sehingga Anda memasang jaring elastis sebagai gantinya. Anda dapat memilih alpha dengan validasi silang tetapi pastikan Anda menggunakan lipatan yang sama untuk setiap nilai alpha.

dalam_orang
sumber