Değişken seçimi için R 'de larass (veya glmnet) paketinden LASSO kullanımı


39

Bu soru biraz basit gelirse özür dilerim.

R'da çoklu lineer regresyon modeli için LASSO değişken seçimini kullanmaya çalışıyorum, biri kategorik (15 soruna neden olur?) Olan 15 öngörücüm var. ve ayarlarımı yaptıktan sonra aşağıdaki komutları kullanıyorum:yxy

model = lars(x, y)
coef(model)

Benim sorunum kullandığım zaman coef(model). Bu, her seferinde bir ekstra tahminci eklenerek, 15 satırlı bir matris döndürür. Ancak hangi modelin seçileceğine dair bir öneri yoktur. Bir şey mi kaçırdım? Sadece bir " en iyi " model geri dönmek için lars paketini alabileceğim bir yol var mı ?

glmnetBunun yerine kullanılmasını öneren başka yayınlar var ama bu daha karmaşık görünüyor. Bir deneme, aynı ve kullanarak aşağıdaki gibidir . Burada bir şey mi kaçırdım? yxy

cv = cv.glmnet(x, y)
model = glmnet(x, y, type.gaussian="covariance", lambda=cv$lambda.min)
predict(model, type="coefficients")

Son komut, bazıları = 0 olmasına rağmen değişkenlerimin bir listesini verir, çoğu katsayılıdır. Bu, LASSO tarafından seçilen " en iyi " modelin doğru seçimi mi? O zaman katsayıları olan tüm değişkenlerimle doğrusal bir modele uyarsamnot=0 , çok benzer, ancak biraz farklı, katsayı tahminleri alırım. Bu farkın bir nedeni var mı? Doğrusal modeli, LASSO tarafından seçilen bu değişkenlerle tekrar takıp son modelim olarak kabul etmek kabul edilebilir mi? Aksi halde, anlamlılık için herhangi bir p değeri göremiyorum. Bir şey mi kaçırdım?

mu

type.gaussian="covariance" 

Bunun glmnetçoklu lineer regresyon kullandığından emin olun ?

Değişkenlerin otomatik olarak normalleşmesi katsayıları etkiler mi? LASSO prosedürüne etkileşim terimlerini dahil etmenin bir yolu var mı?

Bu prosedürü, LASSO'nun, herhangi bir şeyi değiştirirse önemli bir çıkarım / tahmin için kullanılacak olan herhangi bir modelden daha fazla nasıl kullanılacağının bir göstergesi olarak kullanacağını düşünüyorum.

Bunu okumak için zaman ayırdığınız için teşekkür ederiz. LASSO / lars / glmnet ile ilgili genel yorumlar da büyük memnuniyetle karşılanacaktır.


4
Bir yan yorum olarak, sonucu yorumlamak istiyorsanız, kement tarafından seçilen değişken kümesinin kararlı olduğunu gösterdiğinizden emin olun. Bu, Monte Carlo simülasyonu kullanılarak veya kendi veri kümenizi önyükleyerek yapılabilir.
Frank Harrell

Yanıtlar:


28

Http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html adresindekiglmnet mükemmel skeç sayesinde onu kavradıktan sonra kullanmak gerçekten çok kolaydır (ayrıca CRAN paket sayfasını da kontrol edebilirsiniz). En iyi lambda gelince , başparmak kuralı kullanmaktırglmnet

cvfit <- glmnet::cv.glmnet(x, y)
coef(cvfit, s = "lambda.1se")

yerine lambda.min.

Aynısını larsyapmak için elle yapmak zorundasınız. İşte benim çözümüm

cv <- lars::cv.lars(x, y, plot.it = FALSE, mode = "step")
idx <- which.max(cv$cv - cv$cv.error <= min(cv$cv))
coef(lars::lars(x, y))[idx,]

Bunun tamamen aynı olmadığını aklınızda bulundurun, çünkü bu herhangi bir noktada değil, bir değişken düğüm girdiğinde (bir değişken düğüme girdiğinde) durur.

Lütfen glmnetşimdi tercih edilen paketin, aktif olarak sürdürüldüğünden ve daha önce cevaplanıp karşılanmadığına larsdair sorular olduğunu unutmayın (kullanılan algoritmalar farklıdır).glmnetlars

Değişkenleri seçmek ve sonra da OLS'ye uydurmak için kement kullanma sorunuz gelince, bu devam eden bir tartışmadır. OLS için Google, Kement'i yayınlar ve konuyu tartışan bazı makaleler vardır. İstatistiksel Öğrenme Öğelerinin yazarları bile bunun mümkün olduğunu kabul eder.

Düzenleme : İşte ne daha doğru çoğaltmak için kod glmnetburadalars

  cv <- lars::cv.lars(x, y, plot.it = FALSE)
  ideal_l1_ratio <- cv$index[which.max(cv$cv - cv$cv.error <= min(cv$cv))]
  obj <- lars::lars(x, y)
  scaled_coefs <- scale(obj$beta, FALSE, 1 / obj$normx)
  l1 <- apply(X = scaled_coefs, MARGIN = 1, FUN = function(x) sum(abs(x)))
  coef(obj)[which.max(l1 / tail(l1, 1) > ideal_l1_ratio),]

+1 Harika cevap! Siz ya da herhangi biri lambda.min yerine lambda.1se'nin neden kural olduğuna karar verebilir misiniz?
Erosennin

Bunu 4 yıl yazdıktan sonra (ve bir süre kement kullanmamış olmak) hafızam az önce kayboldu. Üzgünüm!
Juancentro

8

Doğru soruyu çözdüğümü düşündüğümden bu yana bir süre önce bu soruya dönüyorum.

İşte mtcars veri setini kullanan bir kopyası:

library(glmnet)
`%ni%`<-Negate(`%in%')
data(mtcars)

x<-model.matrix(mpg~.,data=mtcars)
x=x[,-1]

glmnet1<-cv.glmnet(x=x,y=mtcars$mpg,type.measure='mse',nfolds=5,alpha=.5)

c<-coef(glmnet1,s='lambda.min',exact=TRUE)
inds<-which(c!=0)
variables<-row.names(c)[inds]
variables<-variables[variables %ni% '(Intercept)']

'değişkenler' size en iyi çözümü çözen değişkenlerin listesini verir.


1
Kodu inceliyordum ve "test" in henüz tanımlanmadığını ve bu nedenle de kodun: "final.list <-testing [-removed] #removing değişkenleri" hatası veriyor: nesne bulunamadı. Diyelim ki "test" kullanmak yerine, "cp.list" kullanılmalıdır, böylece kod şöyle olacaktır: final.list <-cp.list [-removed] #removing değişkenleri final.list <-c (final.list, kopyalar) # Her ikisi de kaldırılmış ve daha sonra eklenmiş olan varyasyonlara ekleme yapmak Bunun doğru olup olmadığını bana bildirin Saygılarımla

3
`% Ni%` <-Negate ( '% Ni%'); ## yanlış görünüyor. %% Ni% `<-Negate (%’ de%); ## doğru görünüyor. Bence stackexchange formatter bu işi mahvetti ...
Chris

nfolds=5Ve alpha=0.5parametrelerini nasıl seçtiğinizi detaylandırabilir misiniz ?
colin

7

Belki ileriye doğru seçim kademeli regresyon ile karşılaştırma yardımcı olacaktır (yazarlardan biri tarafından bir siteye aşağıdaki linke bakınız http://www-stat.stanford.edu/~tibs/lasso/simple.html). İstatistiki Öğrenmenin Elemanları Bölüm 3.4.4'te kullanılan yaklaşım budur (çevrimiçi olarak ücretsiz). Bu kitapta Bölüm 3.6'nın en küçük kareler, en iyi alt küme ve kement arasındaki ilişkiyi anlamaya yardımcı olduğunu düşündüm (artı birkaç prosedür daha). Ayrıca, t (coef (model)) ve write.csv katsayısının aktarılmasını da faydalı buluyorum, böylelikle Excel'de yandaki çizimin (model) bir kopyasıyla birlikte açabiliyorum. Tahmini en düşük kareleri içeren son sütuna göre sıralamak isteyebilirsiniz. Ardından, her parçanın her adımında nasıl bir değişken eklendiğini ve sonuçların katsayıların nasıl değiştiğini açıkça görebilirsiniz. Tabii ki bu bütün hikaye değil, ama umarım bir başlangıç ​​olacaktır.


3

larsve glmnetham matrislerde çalışır. Etkileşim terimlerini dahil etmek için matrisleri kendiniz yapılandırmanız gerekir. Bu, etkileşim başına bir sütun anlamına gelir (faktörleriniz varsa, faktör başına seviye başınadır). İçine bak lm()nasıl bunu yapar görmek için (uyarı: ejderhalar var).

Şu anda yapmak için, şunun gibi bir şey yapın: Bir etkileşim terimini elle yapmak için şunları yapabilirsiniz (ama belki de yapmamalı , çünkü yavaş):

int = D["x1"]*D["x2"]
names(int) = c("x1*x2")
D = cbind(D, int)

Ardından bunu lars olarak kullanmak için ( ytekmelediğinizi varsayarak ):

lars(as.matrix(D), as.matrix(y))

Keşke diğer sorularda sana daha fazla yardım edebilseydim. Bunu buldum çünkü lars bana keder veriyor ve içindeki ve web üzerindeki belgeler çok ince.


2
"Uyarı: ejderhalar var" Bu oldukça kolaydır model.matrix().
Gregor

2

LARS ENTIRE çözüm yolunu çözer. Çözüm yolu parçalı olarak doğrusaldır - çözümün değiştiği sınırlı sayıda "çentik" noktası (yani normalleştirme parametresinin değerleri) vardır.

Bu yüzden elde ettiğiniz çözüm matrisi olası tüm çözümlerdir. Döndüğü listede, sırayla düzenleme parametresinin değerlerini de vermelidir.


Cevabınız için teşekkür ederim. Düzenleme parametresinin değerlerini göstermenin bir yolu var mı? Ek olarak, bu parametreye dayanan çözümler arasında seçim yapmanın bir yolu var mı? (Ayrıca lambda parametresi nedir?)
James

Parçalı-doğrusallığın, çizgilerin yatay olduğu ve dolayısıyla çözümün lambda ile her zaman değiştiği anlamına gelmediğine dikkat edin. Örneğin, öngörücü amaçlar için bir tanesinde sadece düğümlerde değil , aynı zamanda düğümlerin arasında bir lambda değerleri ızgarası olacaktır . Budaklar arasındaki bir noktanın en iyi daha iyi tahmin performansı vermesi oldukça muhtemeldir.
Richard Hardy,
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.