R - Lasso Regression - Lambda berbeda per regressor


11

Saya ingin melakukan hal berikut:

1) Regresi OLS (tanpa istilah hukuman) untuk mendapatkan koefisien beta ; adalah variabel yang digunakan untuk regresi. Saya melakukan ini denganbjj

lm.model = lm(y~ 0 + x)
betas    = coefficients(lm.model)

2) Regresi Lasso dengan masa hukuman, kriteria pemilihannya adalah Kriteria Informasi Bayesian (BIC), yang diberikan oleh

λj=log(T)T|bj|

di mana berarti variabel / angka regresi, untuk jumlah pengamatan, dan untuk beta awal yang diperoleh pada langkah 1). Saya ingin mendapatkan hasil regresi untuk nilai khusus ini , yang berbeda untuk setiap regressor yang digunakan. Karenanya jika ada tiga variabel, akan ada tiga nilai yang berbeda .jTbjλjλj

Masalah optimasi OLS-Lasso kemudian diberikan oleh

minbϵRn={t=1T(ytbXt)2+Tj=1m(λt|bj|)}

Bagaimana saya bisa melakukan ini dalam R dengan paket lars atau glmnet? Saya tidak dapat menemukan cara untuk menentukan lambda dan saya tidak 100% yakin jika saya mendapatkan hasil yang benar jika saya menjalankan

lars.model <- lars(x,y,type = "lasso", intercept = FALSE)
predict.lars(lars.model, type="coefficients", mode="lambda")

Saya menghargai bantuan apa pun di sini.


Memperbarui:

Saya telah menggunakan kode berikut sekarang:

fits.cv = cv.glmnet(x,y,type="mse",penalty.factor = pnlty)
lmin    = as.numeric(fits.cv[9]) #lambda.min
fits    = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty)
coef    = coef(fits, s = lmin)

Pada baris 1 saya menggunakan validasi silang dengan faktor penalti yang ditentukan ( ), yang berbeda untuk setiap regresi . Baris 2 memilih "lambda.min" dari fits.cv, yang merupakan lambda yang memberikan kesalahan validasi silang rata-rata minimum. Baris 3 melakukan laso fit ( ) pada data. Sekali lagi saya menggunakan faktor penalti . Baris 4 mengekstrak koefisien dari kecocokan yang termasuk ke dalam "optimal" dipilih pada baris 2.λλλj=log(T)T|bj|alpha=1λλ

Sekarang saya memiliki koefisien beta untuk regressor yang menggambarkan solusi optimal dari masalah minimisasi

minbϵRn={t=1T(ytbXt)2+Tj=1m(λt|bj|)}

dengan faktor penalti . Rangkaian koefisien optimal kemungkinan besar adalah subset dari regressor yang awalnya saya gunakan, ini adalah konsekuensi dari metode Lasso yang menyusutkan jumlah regressor yang digunakan.λj=log(T)T|bj|

Apakah pemahaman dan kode saya benar?


2
Anda dapat menggunakan markup LATEX di posting Anda, terlampir dalam tanda dolar. $\alpha$menjadi . Tolong buat ini, karena itu akan membuat orang lebih mudah memahami pertanyaan Anda, dan karenanya menjawabnya. α
Sycorax berkata Reinstate Monica

Jawaban:


15

Dari glmnetdokumentasi ( ?glmnet), kami melihat bahwa dimungkinkan untuk melakukan penyusutan diferensial. Ini membuat kita setidaknya sebagian untuk menjawab pertanyaan OP.

penalty.factor: Faktor penalti yang terpisah dapat diterapkan untuk masing-masing koefisien. Ini adalah angka yang berlipat ganda lambdauntuk memungkinkan penyusutan diferensial. Dapat 0 untuk beberapa variabel, yang menyiratkan tidak ada penyusutan, dan variabel itu selalu termasuk dalam model. Default adalah 1 untuk semua variabel (dan secara tak terhingga tak terbatas untuk variabel yang tercantum dalam exclude). Catatan: faktor-faktor penalti diubah secara internal untuk dijumlahkan nvars, dan lambdaurutannya akan mencerminkan perubahan ini.

Untuk sepenuhnya menjawab pertanyaan, saya pikir ada dua pendekatan yang tersedia untuk Anda, tergantung pada apa yang ingin Anda capai.

  1. Pertanyaan Anda adalah bagaimana menerapkan diferensial yang menyusut glmnetdan mengambil koefisien untuk nilai tertentu . Menyediakan beberapa nilai bukan 1 menghasilkan penyusutan diferensial pada nilai . Untuk mencapai susut, susut untuk setiap adalah , kita hanya perlu melakukan beberapa aljabar. Biarkan menjadi faktor penalti untuk , apa yang akan diberikan . Dari dokumentasi, kita dapat melihat bahwa nilai-nilai ini diskalakan ulang dengan faktor st . Ini berarti bahwaλ b j ϕ j = log Tλpenalty.factorλbjφjbjCφj=φ ' j m=CΣ m j = 1 logTϕj=logTT|bj|ϕjbjpenalty.factorCϕj=ϕjϕj ϕjCϕj λ=1m=Cj=1mlogTT|bj|ϕjmenggantikan dalam ekspresi optimisasi di bawah ini. Jadi selesaikan untuk , berikan nilai to , dan kemudian ekstrak koefisien untuk . Saya akan merekomendasikan menggunakan .ϕjCϕjglmnetλ=1coef(model, s=1, exact=T)

  2. Yang kedua adalah cara "standar" untuk digunakan glmnet: Seseorang melakukan -validasi silang berulang untuk memilih sehingga Anda meminimalkan MSE out-of-sample. Inilah yang saya jelaskan di bawah ini secara lebih rinci. Alasan kami menggunakan CV dan memeriksa MSE di luar sampel adalah karena MSE dalam sampel akan selalu diminimalkan untuk , yaitu adalah MLE biasa. Menggunakan CV sambil memvariasikan memungkinkan kita untuk memperkirakan kinerja model pada data out-of-sample , dan memilih yang optimal (dalam arti tertentu).λ λ = 0 b λ λkλλ=0bλλ

Itu glmnetpanggilan tidak menentukan (atau harus itu, karena menghitung seluruh yang lintasan secara default untuk alasan kinerja). akan kembali koefisien untuk nilai . Namun, apa pun pilihan Anda berikan, hasilnya akan mencerminkan penalti diferensial yang Anda terapkan dalam panggilan yang sesuai dengan model.λ λ λλλcoef(fits,s=something)λsomethingλ

Cara standar untuk memilih nilai optimal dari adalah menggunakan , daripada . Validasi silang digunakan untuk memilih jumlah penyusutan yang meminimalkan kesalahan out-of-sample, sedangkan spesifikasi akan menyusutkan beberapa fitur lebih dari yang lain, sesuai dengan skema pembobotan Anda.λcv.glmnetglmnetpenalty.factor

Prosedur ini optimal

minbRmt=1T(ytbXt)2+λj=1m(ϕj|bj|)

di mana adalah faktor penalti untuk fitur (apa yang Anda berikan dalam argumen). (Ini sedikit berbeda dari ekspresi optimisasi Anda; perhatikan bahwa beberapa subskrip berbeda.) Perhatikan bahwa istilah adalah sama di semua fitur, jadi satu-satunya cara beberapa fitur menyusut lebih banyak daripada yang lain adalah melalui . Yang penting, dan tidak sama; adalah skalar dan adalah vektor! Dalam ungkapan ini, diperbaiki / diasumsikan dikenal; yaitu, optimasi akan memilih optimal , bukan optimalϕjjthpenalty.factorλϕjλϕλϕλbλ.

Ini pada dasarnya adalah motivasi glmnetseperti yang saya pahami: untuk menggunakan regresi yang dihukum untuk memperkirakan model regresi yang tidak terlalu optimis tentang kinerja out-of-sample. Jika ini adalah tujuan Anda, mungkin ini adalah metode yang tepat untuk Anda.


+1 Ini benar. Saya juga akan menambahkan bahwa regularisasi regresi dapat dilihat sebagai bayesian prior, yaitu maksimum a posteriori (MAP) diatur kemungkinan maksimum yang diatur (ML). Bekerja dalam kerangka itu memberi diri Anda lebih banyak fleksibilitas dalam regularisasi jika diperlukan.
TLJ

Jika saya menjalankan pnlty = log(24)/(24*betas); fits = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty) bagaimana cara saya mengekstrak betas regresor yang sesuai dengan lambda yang saya tentukan, karena lambda berbeda untuk setiap faktor risiko?
Dom

1
@ Tom Saya sadar sedikit terlambat bahwa ada cara yang jelas untuk mendapatkan apa yang ingin Anda gunakan glmnet. Lihat jawaban saya yang telah direvisi.
Sycorax berkata Reinstate Monica

2
Waspadalah terhadap penyesuaian penalti secara terpisah untuk setiap prediktor. Itu akan berjumlah tidak lebih dari pemilihan variabel bertahap dalam beberapa kasus. Regresi yang dihukum mengurangi kesalahan kuadrat rata-rata dengan mengasumsikan jumlah parameter penalti yang sangat terbatas dan meminjam informasi lintas prediktor.
Frank Harrell

2
@FrankHarrell Terima kasih atas komentarnya! Tampaknya menggunakan penalti yang berbeda untuk masing-masing prediktor sama dengan model Bayesian yang mengasumsikan berbeda sebelumnya untuk setiap parameter. Itu tidak menurut saya sebagai ancaman unik atas kesimpulan Bayesian secara umum. Juga, dapatkah Anda menguraikan bagaimana hukuman dipinjamkan meminjamkan informasi lintas prediktor? Saya tidak yakin sepenuhnya memahami bagaimana itu terjadi dalam skenario seperti itu.
Sycorax mengatakan Reinstate Monica
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.