Glmnet nasıl yorumlanır?


36

Yaklaşık 60 prediktör değişkenli ve 30 gözlemli çok değişkenli bir lineer regresyon modeline uymaya çalışıyorum, bu yüzden p> n olduğu için düzenli regresyon için glmnet paketini kullanıyorum .

Belgelendirme ve diğer sorulardan geçtim ama sonuçları yine de yorumlayamıyorum, işte örnek bir kod (basitleştirmek için 20 öngörücü ve 10 gözlemle):

Num rows = num gözlemleri ve num cols = num yordayıcıları ve yanıt değişkenini temsil eden bir y vektörüyle bir matris x oluştururum

> x=matrix(rnorm(10*20),10,20)
> y=rnorm(10)

Alfa'yı varsayılan olarak bırakan bir glmnet modeline uyuyorum (= serbest ceza için 1)

> fit1=glmnet(x,y)
> print(fit1)

Anladığım kadarıyla azalan lambda değerleriyle farklı tahminler alıyorum (yani ceza)

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

Şimdi Beta değerlerimi, örneğin, verilen en küçük lambda değerini seçerek tahmin ediyorum. 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

Yerine lambda ile seçerseniz

cv <- cv.glmnet(x,y)
model=glmnet(x,y,lambda=cv$lambda.min)

Tüm değişkenler (.) Olur.

Şüphe ve sorular:

  1. Lamda nasıl seçilir emin değilim.
  2. (.) Olmayan değişkenleri başka bir modele uyacak mıyım? Benim durumumda mümkün olduğunca değişken tutmak istiyorum.
  3. P-değerini nasıl bilebilirim, yani hangi değişkenler cevabı önemli ölçüde tahmin eder?

Zayıf istatistiksel bilgilerim için özür dilerim! Ve herhangi bir yardım için teşekkür ederim.


Belki de CRAN paketinin hdi'sine bir göz atın , bunun yüksek boyutlu modeller için çıkarım sağladığı ...
Tom Wenseleers

Kullanılan yöntemlerin tam açıklaması için sizi bu makaleye atıfta bulunuyorum: projecteuclid.org/euclid.ss/1449670857
Tom Wenseleers

Yanıtlar:


40

İşte sezgisel olmayan bir gerçek - glmnet'e tek bir lambda değeri vermeniz gerekmiyor. Buradaki belgelerden :

Lamda için tek bir değer vermeyin (CV kullanımı sonrası tahminler için bunun yerine). Bunun yerine azalan bir lambda değerleri dizisi. glmnet ısınma hızına başlar ve genellikle bir yolu bulmak için tek bir yoldan daha hızlıdır.

cv.glmnetÖrneklerde bahsettiğin gibi lambda seçmene yardımcı olacak. Glmnet paketinin yazarları cv$lambda.1sebunun yerine önermekteler cv$lambda.min, ancak pratikte ikincisiyle başarılı oldum.

Cv.glmnet dosyasını çalıştırdıktan sonra, glmnet'i tekrar çalıştırmanız gerekmez! Izgaradaki her lambda ( cv$lambda) zaten çalıştırıldı. Bu tekniğe "Sıcak Başlangıç" adı verilir ve bu konuda buradan daha fazla bilgi edinebilirsiniz . Girişten itibaren, Sıcak Başlatma tekniği, daha sonraki bir optimizasyon problemi için başlangıç ​​değeri olarak (örneğin, daha küçük bir lambdalı glmnet gibi) farklı bir optimizasyon probleminin (örneğin daha büyük bir lambdalı glmnet) çözümünü kullanarak yinelemeli metotların çalışma süresini azaltır. ).

İstediğiniz koşuyu ayıklamak için şunu cv.glmnet.fitdeneyin:

small.lambda.index <- which(cv$lambda == cv$lambda.min)
small.lambda.betas <- cv$glmnet.fit$beta[, small.lambda.index]

Revizyon (1/28/2017)

Yukarıda yaptığım gibi glmnet nesnesine dokunmanıza gerek yok; @ almak aşağıda alex23lemm tavsiyesi ve pas s = "lambda.min", s = "lambda.1se"ya da başka bir numara (örneğin, s = .007her ikisi kadar) coefve predict. Katsayılarınızın ve öngörülerinizin, çapraz doğrulama ile belirlenen bu değere bağlı olduğunu unutmayın. Tekrarlanabilirlik için bir tohum kullanın! Ve bir tedarik yoksa unutma "s"içinde coefve predict, sen varsayılan kullanarak olacak s = "lambda.1se". Küçük bir veri durumunda daha iyi çalıştığını gördükten sonra bu varsayılana kadar ısındım.s = "lambda.1se"ayrıca daha fazla düzenlileştirme sağlama eğilimindedir, bu nedenle alfa> 0 ile çalışıyorsanız, daha temel bir modele doğru da eğilim gösterir. Ayrıca aralarında bir yere ulaşmak için plot.glmnet yardımıyla s'nin sayısal değerini de seçebilirsiniz (sadece x ekseninden değerleri yükseltmeyi unutmayın!).


1
Teşekkür ederim! Bu yardımcı olur ... belki 2. ve 3. sorulara bir cevabınız var mı?
Alice

3
Endişelenme. (.) S, sıfırları temsil eder. Lasso ile gittiğinden beri, "seyrek" bir çözüm istediğinizi belirttiniz (yani, çok fazla sıfır). Hepsinin değere sahip olmasını istiyorsanız, alpha = 0 olarak ayarlayın. Şimdi Kement'ten Ridge regresyonuna geçtiniz. glmnet için p değerleri kavramsal olarak zordur. Örneğin, "kement için p-değerler" google arama yaparsanız, örneğin, son zamanlarda çok araştırma ve tartışma göreceksiniz. Yazarın p-değerlerinin kement ve sırt regresyonu gibi önyargılı regresyonlar için anlam ifade etmediğini savunduğu bir hesabı bile (kaynak amnezi) okudum.
Ben Ogorek

6
Minimum cvm'yi veren lambda değeriyle ilişkili katsayıları çıkarmanın alternatif bir yolu şudur:small.lambda.betas <- coef(cv, s = "lambda.min")
alex23lemm 24:15

1
@BenOgorek, mükemmel güncelleme! Bir başka yararlı referans Friedman J, Hastie T, Hoefling H, Tibshirani R. Pathwise koordinat optimizasyonu. Uygulamalı İstatistiklerin Yıllıkları. 2007, 2 (1): 302-332. ( arxiv.org/pdf/0708.1485.pdf )
dv_bn

1
@ erosennin, cv.glmnet'in lambda argümanına bakın: "İsteğe bağlı kullanıcı tarafından sağlanan lambda dizisi; varsayılan değer NULL, ve glmnet kendi dizisini seçer." İlgilendiğiniz
menzile inmeden

2

S1) Lambda'nın nasıl seçileceğinden emin değilim. S2) Başka bir modele uyması için (.) Olmayan değişkenleri kullanmalı mıyım? Benim durumumda mümkün olduğunca değişken tutmak istiyorum.

@ BenOgorek'in büyük cevabına göre, tipik olarak bir lambda dizisinin tamamını kullanmanıza izin verirsiniz, sonra optimal katsayıları çıkarırken lambda.1se değerini kullanın (yaptığınızdan farklı olarak).

Aşağıdaki üç uyarıyı takip ettiğiniz sürece, normalizasyonla mücadele etmeyin veya modeli çimdiklemeyin: eğer bir değişken ihmal edilirse, bunun nedeni daha düşük toplam ceza vermesidir. Uyarılar:

  1. Düzenlenmiş katsayıların anlamlı olması için değişkenin ortalamasını ve stdev'ini önceden ile normalleştirdiğinizden emin olun scale(); güvenme glmnet(standardize=T). Gerekçe için bakınız Kement'ten önce standardizasyon gerçekten gerekli mi? ; Temel olarak büyük değerlere sahip bir değişken düzenlileştirmede haksız yere cezalandırılabilir.

  2. Tekrar üretilebilir olmak için, set.seedbirkaç rastgele-tohumla çalıştırın ve stabilize için düzenli katsayıları kontrol edin.

  3. Daha az sert regülasyon, yani daha fazla değişken dahil etmek istiyorsanız, basit çıkıntı yerine alfa <1 (uygun elastik-net) kullanın. Alfa'yı 0'dan 1'e kadar taramanızı öneririm. Bunu yapacaksanız, hiperparametre alfa ve regresyon hatasını cv.glmnet()fazla takmamak için çapraz değerleme kullanmalısınız, yani basit değil glmnet();

.

for (alpha in c(0,.1,.3,.5,.7,.9,1)) {
  fit <- cv.glmnet(..., alpha=alpha, nfolds=...)
  # Look at the CVE at lambda.1se to find the minimum for this alpha value...
}

Böyle bir arama araştırmasını CV ile otomatikleştirmek istiyorsanız, onu kendiniz kodlayabilir veya glmnet'in üstündeki şapka paketini kullanabilirsiniz; şapka bunu iyi yapar. İçin cv.glmnet nfoldsbu büyük olursa parametre değeri, 3 senin veri kümesi küçükse (minimum) veya 5 veya 10 almak.

S3) p değerini nasıl bilebilirim, yani hangi değişkenler cevabı anlamlı bir şekilde tahmin eder?

Yapma, anlamlı değiller . Detaylı olarak açıklandığı gibi , regresyon katsayıları için istatistiksel özet bilgilerin glmnet modelinden neden elde edilmesi tavsiye edilmez?

Sadece cv.glmnet()değişken seçimini otomatik olarak yapalım . Yukarıdaki uyarılarla. Ve elbette, cevap değişkeninin dağılımı normal olmalıdır (kullandığınız varsayılarak family='gaussian').


Çok yararlı yorum için teşekkürler! Ayrıca değişkenlerin standartlaştırılmasının glmnet kullanmaktan çok işe yaramış gibi göründüğünü de gördüm (standardize = T).
Michelle

Smci, cvglmnet tarafından döndürülen beta değerleri hakkında bir sorum var. Denenmiş lambda değerlerinin her bir ızgara noktasındaki beta değerleri olduğunu anlıyorum. Bununla birlikte, her lambda değeri (1) için döndürülen beta değerleri, 10 katlamanın ortalama katsayı değerlerinin (10 katCV kullandığım varsayılırsa), (2) katlamanın beta değerlerini, en iyi doğruluk veren katsayıları (3), modelin tüm veri kümesinde yeniden çalıştırılması?
Michelle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.