Uyarlanabilir LASSO, tutarlı değişken seçimi için kullanılır. Değişken seçimi için LASSO kullanılırken karşılaştığımız sorunlar:
- Büzülme parametresi seçim için tahminden daha büyük olmalıdır
- Büyük sıfır olmayan parametreler çok küçük olacaktır, böylece sapma çok büyük olur
- Küçük sıfır olmayan parametreler tutarlı bir şekilde algılanamıyor
- Tahminciler arasındaki yüksek korelasyonlar düşük seçim performansına yol açar
Bu nedenle LASSO sadece büzülme parametresi, parametreler (beta-min koşulu) ve korelasyonlar (yeniden temsil edilemez durum) üzerindeki bazı koşullar altında değişken seçim için tutarlıdır. Master tezimin 101-106. Sayfalarına bakın bir açıklama için .
LASSO, tahmin için ayar parametresini seçerken genellikle çok fazla değişken içerir, ancak gerçek model büyük olasılıkla bu değişkenlerin bir alt kümesidir. Bu, tahmin-optimal ayarlama parametresini kullanarak LASSO tahmininin sapmasını kontrol eden uyarlanabilir LASSO gibi ikincil bir tahmin aşamasının kullanılmasını önerir. Bu, yukarıda belirtilen koşullar olmadan tutarlı seçime (veya oracle özelliğine) yol açar.
Uyarlanabilir LASSO için glmnet kullanabilirsiniz. İlk olarak, ağırlıkları hesaplamak için en küçük kareler, sırt veya hatta LASSO tahminleri gibi bir ilk tahmine ihtiyacınız vardır. Daha sonra X matrisini ölçekleyerek uyarlamalı LASSO uygulayabilirsiniz. Aşağıda, egzersiz verilerine ilişkin en küçük karelerin ilk tahminlerini kullanan bir örnek verilmiştir:
# get data
y <- train[, 11]
x <- train[, -11]
x <- as.matrix(x)
n <- nrow(x)
# standardize data
ymean <- mean(y)
y <- y-mean(y)
xmean <- colMeans(x)
xnorm <- sqrt(n-1)*apply(x,2,sd)
x <- scale(x, center = xmean, scale = xnorm)
# fit ols
lm.fit <- lm(y ~ x)
beta.init <- coef(lm.fit)[-1] # exclude 0 intercept
# calculate weights
w <- abs(beta.init)
x2 <- scale(x, center=FALSE, scale=1/w)
# fit adaptive lasso
require(glmnet)
lasso.fit <- cv.glmnet(x2, y, family = "gaussian", alpha = 1, standardize = FALSE, nfolds = 10)
beta <- predict(lasso.fit, x2, type="coefficients", s="lambda.min")[-1]
# calculate estimates
beta <- beta * w / xnorm # back to original scale
beta <- matrix(beta, nrow=1)
xmean <- matrix(xmean, nrow=10)
b0 <- apply(beta, 1, function(a) ymean - a %*% xmean) # intercept
coef <- cbind(b0, beta)