Адаптивний LASSO використовується для послідовного вибору змінної. Проблеми, з якими ми стикаємось при використанні LASSO для вибору змінної:
- Параметр усадки повинен бути більшим для вибору, ніж прогнозування
- Великі ненульові параметри будуть занадто малі, щоб зміщення було занадто великим
- Невеликі ненульові параметри неможливо виявити послідовно
- Висока кореляція між прогнозами призводить до поганої ефективності відбору
Таким чином, LASSO узгоджується лише для вибору змінної за певних умов параметра усадки, параметрів (умова бета-хв) та кореляцій (умова непредставима). Детальні пояснення див. На сторінках 101-106 моєї магістерської дисертації .
LASSO часто включає занадто багато змінних при виборі параметру настройки для прогнозування, але справжня модель, швидше за все, є підмножиною цих змінних. Це дозволяє використовувати вторинну стадію оцінки, наприклад адаптивний LASSO, який контролює зміщення оцінки LASSO, використовуючи параметр налаштування оптимального прогнозування. Це призводить до послідовного вибору (або властивості Oracle) без вищезазначених умов.
Ви можете використовувати glmnet для адаптивного LASSO. Спочатку для розрахунку ваги вам потрібна початкова оцінка, або найменші квадрати, гребеня або навіть оцінки LASSO. Тоді ви можете реалізувати адаптивний LASSO шляхом масштабування матриці X. Ось приклад з використанням найменших квадратів початкових оцінок щодо навчальних даних:
# 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)