Saya mencoba untuk menyesuaikan model regresi linier multivariat dengan sekitar 60 variabel prediktor dan 30 pengamatan, jadi saya menggunakan paket glmnet untuk regresi yang diatur karena p> n.
Saya telah melalui dokumentasi dan pertanyaan lain tetapi saya masih belum dapat menginterpretasikan hasilnya, berikut ini contoh kode (dengan 20 prediktor dan 10 pengamatan untuk disederhanakan):
Saya membuat matriks x dengan num rows = num observasi dan num cols = num prediktor dan vektor y yang mewakili variabel respons
> x=matrix(rnorm(10*20),10,20)
> y=rnorm(10)
Saya cocok dengan model glmnet yang menjadikan alpha sebagai default (= 1 untuk penalti laso)
> fit1=glmnet(x,y)
> print(fit1)
Saya mengerti saya mendapatkan prediksi yang berbeda dengan penurunan nilai lambda (yaitu penalti)
Call: glmnet(x = x, y = y)
Df %Dev Lambda
[1,] 0 0.00000 0.890700
[2,] 1 0.06159 0.850200
[3,] 1 0.11770 0.811500
[4,] 1 0.16880 0.774600
.
.
.
[96,] 10 0.99740 0.010730
[97,] 10 0.99760 0.010240
[98,] 10 0.99780 0.009775
[99,] 10 0.99800 0.009331
[100,] 10 0.99820 0.008907
Sekarang saya memperkirakan nilai Beta saya memilih, misalnya, nilai lambda terkecil yang diberikan glmnet
> predict(fit1,type="coef", s = 0.008907)
21 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) -0.08872364
V1 0.23734885
V2 -0.35472137
V3 -0.08088463
V4 .
V5 .
V6 .
V7 0.31127123
V8 .
V9 .
V10 .
V11 0.10636867
V12 .
V13 -0.20328200
V14 -0.77717745
V15 .
V16 -0.25924281
V17 .
V18 .
V19 -0.57989929
V20 -0.22522859
Jika sebaliknya saya memilih lambda dengan
cv <- cv.glmnet(x,y)
model=glmnet(x,y,lambda=cv$lambda.min)
Semua variabel akan menjadi (.).
Keraguan dan pertanyaan:
- Saya tidak yakin tentang cara memilih lambda.
- Haruskah saya menggunakan variabel non (.) Agar sesuai dengan model lain? Dalam kasus saya, saya ingin menyimpan variabel sebanyak mungkin.
- Bagaimana saya tahu nilai-p, yaitu variabel mana yang secara signifikan memprediksi respons?
Saya minta maaf atas pengetahuan statistik saya yang buruk! Dan terima kasih atas bantuannya.
sumber
Jawaban:
Ini fakta yang tidak intuitif - Anda sebenarnya tidak seharusnya memberi glmnet nilai tunggal lambda. Dari dokumentasi di sini :
cv.glmnet
akan membantu Anda memilih lambda, seperti yang Anda singgung dalam contoh Anda. Penulis paket glmnet menyarankancv$lambda.1se
bukancv$lambda.min
, tetapi dalam praktiknya saya telah sukses dengan yang terakhir.Setelah menjalankan cv.glmnet, Anda tidak perlu menjalankan kembali glmnet! Setiap lambda di kisi (
cv$lambda
) telah dijalankan. Teknik ini disebut "Mulai Hangat" dan Anda dapat membaca lebih lanjut di sini . Mengutip dari pengantar, teknik Mulai Hangat mengurangi waktu berjalan dari metode berulang dengan menggunakan solusi dari masalah optimasi yang berbeda (misalnya, glmnet dengan lambda yang lebih besar) sebagai nilai awal untuk masalah optimasi nanti (misalnya, glmnet dengan lambda yang lebih kecil) ).Untuk mengekstrak run yang diinginkan
cv.glmnet.fit
, coba ini:Revisi (28/1/2017)
Tidak perlu kembali ke objek glmnet seperti yang saya lakukan di atas; ikuti saran @ alex23lemm di bawah ini dan berikan nomor
s = "lambda.min"
,s = "lambda.1se"
atau nomor lain (misalnya,s = .007
) kepada keduanyacoef
danpredict
. Perhatikan bahwa koefisien dan prediksi Anda bergantung pada nilai ini yang ditetapkan dengan validasi silang. Gunakan benih untuk reproduksibilitas! Dan jangan lupa bahwa jika Anda tidak menyediakan"s"
incoef
danpredict
, Anda akan menggunakan default daris = "lambda.1se"
. Saya telah melakukan pemanasan ke default itu setelah melihatnya berfungsi lebih baik dalam situasi data kecil.s = "lambda.1se"
juga cenderung memberikan lebih banyak regularisasi, jadi jika Anda bekerja dengan alpha> 0, itu juga akan cenderung ke arah model yang lebih pelit. Anda juga dapat memilih nilai numerik s dengan bantuan plot.glmnet untuk sampai ke suatu tempat di antaranya (jangan lupa untuk mengekspansi nilai dari sumbu x!).sumber
small.lambda.betas <- coef(cv, s = "lambda.min")
Q1) Saya tidak yakin tentang cara memilih lambda. T2) Haruskah saya menggunakan variabel non (.) Agar sesuai dengan model lain? Dalam kasus saya, saya ingin menyimpan variabel sebanyak mungkin.
Sebagai per @ BenOgorek jawaban yang bagus, biasanya Anda membiarkan pas menggunakan seluruh urutan lambda, maka ketika mengekstraksi koefisien optimal menggunakan nilai lambda.1se (tidak seperti apa yang Anda lakukan).
Selama Anda mengikuti tiga peringatan di bawah ini, maka jangan melawan regularisasi atau mengubah model: jika suatu variabel dihilangkan, maka itu karena memberikan penalti keseluruhan yang lebih rendah. Peringatan adalah:
Agar koefisien yang diatur menjadi bermakna, pastikan Anda secara eksplisit menormalkan mean dan stdev variabel sebelumnya
scale()
; jangan mengandalkanglmnet(standardize=T)
. Untuk pembenaran lihat, apakah standardisasi sebelum Lasso benar-benar diperlukan? ; pada dasarnya variabel dengan nilai-nilai besar mungkin dihukum secara tidak adil dalam regularisasi.Agar dapat direproduksi, jalankan dengan
set.seed
beberapa benih acak dan periksa koefisien yang diatur untuk stabilitas.Jika Anda ingin regularisasi yang kurang keras yaitu lebih banyak variabel yang disertakan, gunakan alpha <1 (ie elastic-net) daripada bubungan sederhana. Saya sarankan Anda menyapu alpha dari 0 ke 1. Jika Anda akan melakukannya, maka untuk menghindari overfitting alpha hyperparameter dan kesalahan regresi, Anda harus menggunakan crossvalidation, yaitu menggunakan
cv.glmnet()
daripada sederhanaglmnet()
:.
Jika Anda ingin mengotomatiskan pencarian jaringan seperti itu dengan CV, Anda dapat mengkodekannya sendiri atau menggunakan paket caret di atas glmnet; caret melakukan ini dengan baik. Untuk
cv.glmnet nfolds
nilai parameter, pilih 3 (minimum) jika dataset Anda kecil, atau 5 atau 10 jika itu besar.T3) Bagaimana saya tahu nilai-p, yaitu variabel mana yang secara signifikan memprediksi respons?
Jangan, itu tidak berarti . Seperti yang dijelaskan secara terperinci dalam Mengapa tidak disarankan untuk mendapatkan informasi ringkasan statistik untuk koefisien regresi dari model glmnet?
Biarkan saja
cv.glmnet()
lakukan pemilihan variabel secara otomatis. Dengan peringatan di atas. Dan tentu saja distribusi variabel respons harus normal (dengan asumsi Anda menggunakanfamily='gaussian'
).sumber