Я использую пакет 'lars' в R со следующим кодом:
> library(lars)
> set.seed(3)
> n <- 1000
> x1 <- rnorm(n)
> x2 <- x1+rnorm(n)*0.5
> x3 <- rnorm(n)
> x4 <- rnorm(n)
> x5 <- rexp(n)
> y <- 5*x1 + 4*x2 + 2*x3 + 7*x4 + rnorm(n)
> x <- cbind(x1,x2,x3,x4,x5)
> cor(cbind(y,x))
y x1 x2 x3 x4 x5
y 1.00000000 0.74678534 0.743536093 0.210757777 0.59218321 0.03943133
x1 0.74678534 1.00000000 0.892113559 0.015302566 -0.03040464 0.04952222
x2 0.74353609 0.89211356 1.000000000 -0.003146131 -0.02172854 0.05703270
x3 0.21075778 0.01530257 -0.003146131 1.000000000 0.05437726 0.01449142
x4 0.59218321 -0.03040464 -0.021728535 0.054377256 1.00000000 -0.02166716
x5 0.03943133 0.04952222 0.057032700 0.014491422 -0.02166716 1.00000000
> m <- lars(x,y,"step",trace=T)
Forward Stepwise sequence
Computing X'X .....
LARS Step 1 : Variable 1 added
LARS Step 2 : Variable 4 added
LARS Step 3 : Variable 3 added
LARS Step 4 : Variable 2 added
LARS Step 5 : Variable 5 added
Computing residuals, RSS etc .....
У меня есть набор данных с 5 непрерывными переменными, и я пытаюсь подогнать модель к одной (зависимой) переменной y. Двое из моих предикторов тесно связаны друг с другом (x1, x2).
Как вы можете видеть в приведенном выше примере, функция lars с опцией 'stepwise' сначала выбирает переменную, которая наиболее коррелирует с y. Следующая переменная для входа в модель - это та, которая наиболее коррелирует с остатками. Действительно, это х4:
> round((cor(cbind(resid(lm(y~x1)),x))[1,3:6]),4)
x2 x3 x4 x5
0.1163 0.2997 0.9246 0.0037
Теперь, если я сделаю вариант «Лассо»:
> m <- lars(x,y,"lasso",trace=T)
LASSO sequence
Computing X'X ....
LARS Step 1 : Variable 1 added
LARS Step 2 : Variable 2 added
LARS Step 3 : Variable 4 added
LARS Step 4 : Variable 3 added
LARS Step 5 : Variable 5 added
Он добавляет обе коррелированные переменные в модель на первых двух шагах. Это противоположно тому, что я прочитал в нескольких статьях. Большинство из них говорят, что если есть группа переменных, среди которых корреляции очень высоки, то «лассо» имеет тенденцию выбирать только одну переменную из группы случайным образом.
Может ли кто-нибудь привести пример такого поведения? Или объясните, почему мои переменные x1, x2 добавляются в модель одна за другой (вместе)?
R
вызов, который делает OP, и на соответствующий вывод, который он предоставляет, вы увидите, что он действительно использует лассо. Как я уверен, вы знаете, небольшая настройка алгоритма lars дает путь регуляризации лассо.