Adaptacyjny LASSO służy do spójnego wyboru zmiennych. Problemy, które napotykamy podczas korzystania z LASSO do wyboru zmiennych, to:
- Parametr skurczu musi być większy do wyboru niż prognozowania
- Duże niezerowe parametry będą zbyt małe, aby obciążenie było zbyt duże
- Małe niezerowe parametry nie mogą być konsekwentnie wykrywane
- Wysokie korelacje między predyktorami prowadzą do słabej wydajności selekcji
Zatem LASSO jest spójny tylko przy wyborze zmiennych w pewnych warunkach parametru skurczu, parametrów (warunek beta-min) i korelacji (warunek niereprezentatywny). Szczegółowe wyjaśnienie znajduje się na stronach 101–106 mojej pracy magisterskiej .
LASSO często zawiera zbyt wiele zmiennych przy wyborze parametru strojenia do prognozowania, ale prawdziwy model jest bardzo prawdopodobne, że jest to podzbiór tych zmiennych. Sugeruje to zastosowanie drugiego etapu szacowania, takiego jak adaptacyjny LASSO, który kontroluje odchylenie oszacowania LASSO przy użyciu parametru strojenia optymalnego do przewidywania. Prowadzi to do konsekwentnego wyboru (lub właściwości wyroczni) bez warunków wymienionych powyżej.
Możesz użyć glmnet do adaptacyjnego LASSO. Najpierw potrzebujesz wstępnego oszacowania, albo najmniejszych kwadratów, grzbietu, a nawet oszacowań LASSO, aby obliczyć masy. Następnie możesz zaimplementować adaptacyjną LASSO, skalując macierz X. Oto przykład z wykorzystaniem wstępnych oszacowań metodą najmniejszych kwadratów na danych treningowych:
# 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)