Лассо против адаптивного Лассо


12

LASSO и адаптивный LASSO - это разные вещи, верно? (Для меня штрафы выглядят по-другому, но я просто проверяю, что я что-то упускаю.)

Когда вы вообще говорите об эластичной сетке, это особый случай LASSO или адаптивный LASSO?

Что делает пакет glmnet, если вы выберете alpha = 1?

Адаптивный LASSO работает в более мягких условиях, верно? Оба имеют свойство оракула в подходящих данных, верно?

Ответы:


15

Краткие ответы на ваши вопросы:

  • Лассо и адаптивное лассо разные. (Проверьте Zou (2006), чтобы увидеть, как адаптивное лассо отличается от стандартного лассо.)
  • Лассо - это особый случай эластичной сетки. (См. Zou & Hastie (2005) .)
    Адаптивное лассо не является частным случаем эластичной сетки.
    Эластичная сетка не является частным случаем лассо или адаптивного лассо.
  • Функция glmnetв пакете "glmnet" в R выполняет лассо (не адаптивное лассо) для alpha=1.
  • Работает ли лассо в более мягких условиях, чем адаптивное лассо? Я не могу ответить на этот вопрос (следует проверить Zou (2006) для понимания).
  • Только адаптивное лассо (но не лассо или эластичная сетка) обладает свойством оракула. (См. Zou (2006) .)

Ссылки:


12

Решения LASSO - это решения, которые минимизируют

Q(β|X,y)=12n||yXβ||2+λj|βj|

адаптивное лассо просто добавляет веса к этому, чтобы попытаться противодействовать известной проблеме предвзятости оценок LASSO.

Qa(β|X,y,w)=12n||yXβ||2+λjwj|βj|

wj=1/β~jβ~jβλ

wj(λ)=w(β~j(λ))
glmnetpenalty.factorglmnet

Вы забыли принять абсолютные значения в штрафных санкциях.
Ричард Харди

|β|γγβ

Таким образом, по умолчанию, glmnet выполняет LASSO или эластичную сеть по умолчанию, но вы можете переключить это на адаптивное LASSO (или EN), указав соответствующие веса? Если это так, спасибо миллион!
Г-н Валидация

@MrValidation, обратите внимание, что авторы новых методов, таких как адаптивное лассо, могут иметь код для метода на своих веб-сайтах (иногда они просто дают ссылку на пакет R, который они сами написали).
Ричард Харди

1
Я думаю, что аргумент весов в glmnet относится к весам для наблюдений, а не весам для штрафов
jmb

3

Адаптивный LASSO используется для последовательного выбора переменных. Проблемы, с которыми мы сталкиваемся при использовании LASSO для выбора переменных:

  • Параметр усадки должен быть больше для выбора, чем для прогноза
  • Большие ненулевые параметры будут слишком малы, так что смещение будет слишком большим
  • Небольшие ненулевые параметры не могут быть обнаружены последовательно
  • Высокая корреляция между предикторами приводит к плохой эффективности выбора

Таким образом, LASSO согласуется только для выбора переменной при некоторых условиях по параметру усадки, параметрам (условие бета-минимума) и корреляциям (условие без представления). Смотрите страницы 101-106 моей магистерской диссертации для подробного объяснения.

LASSO часто включает слишком много переменных при выборе параметра настройки для прогнозирования, но истинная модель, скорее всего, является подмножеством этих переменных. Это предполагает использование вторичного этапа оценки, такого как адаптивный LASSO, который управляет смещением оценки LASSO с использованием параметра настройки оптимального прогнозирования. Это приводит к последовательному отбору (или свойству оракула) без условий, упомянутых выше.

Вы можете использовать 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)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.