Когда LASSO выбирает коррелированные предикторы?

13

Я использую пакет '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 добавляются в модель одна за другой (вместе)?

ThomasH_MB
источник
Это регрессия с наименьшим углом, которая дает объяснение шагов лассо.
Майкл Р. Черник
@MichaelChernick: Если вы посмотрите на Rвызов, который делает OP, и на соответствующий вывод, который он предоставляет, вы увидите, что он действительно использует лассо. Как я уверен, вы знаете, небольшая настройка алгоритма lars дает путь регуляризации лассо.
кардинал
Мое «предположение» заключается в том, что, поскольку x2 включает в себя 4 единицы x1, x1 и x2 вместе взятые, имеют наибольшую дисперсию (9 единиц). Если вы снизите коэффициент с x2 до 2, вы должны увидеть, что x4 выбран перед x1 и x2.
Можете ли вы предоставить некоторые ссылки для доказательства этой «случайности»? Спасибо.
Ziyuang
Я думаю, что вы можете найти свой ответ на этом документе: arxiv.org/pdf/1204.1605.pdf
TPArrow

Ответы:

15

Проблема коллинеарности переоценена!

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

Коллинеарность - это малоинформационная проблема. Посмотрите на эту пародию на коллинеарность от Art Goldberger в блоге Дэйва Джайлза . То, как мы говорим о коллинеарности, будет звучать глупо, если применять его к среднему значению вместо коэффициента частичной регрессии.

Все еще не убежден? Пришло время для некоторого кода.

set.seed(34234)

N <- 1000
x1 <- rnorm(N)
x2 <- 2*x1 + .7 * rnorm(N)
cor(x1, x2) # correlation is .94
plot(x2 ~ x1)

Я создал сильно коррелированные переменные x1 и x2, но на графике ниже вы можете видеть, что, когда x1 равен -1, мы все еще видим изменчивость в x2. введите описание изображения здесь

Теперь пришло время добавить «правду»:

y <- .5 * x1 - .7 * x2 + rnorm(N) # Data Generating Process

Может ли обычная регрессия быть успешной в условиях коллинеарной проблемы?

summary(lm(y ~ x1 + x2))

Ах, да, это может:

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept) -0.0005334  0.0312637  -0.017    0.986    
x1           0.6376689  0.0927472   6.875 1.09e-11 ***
x2          -0.7530805  0.0444443 -16.944  < 2e-16 ***

Теперь я не говорил о LASSO, на котором сосредоточился ваш вопрос. Но позвольте мне спросить вас об этом. Если регрессия старой школы и обратная ликвидация не одурачены коллинеарностью, почему вы думаете, что LASSO современного уровня сделает это?

Бен Огорек
источник
К вашему последнему пункту, хотя OLS является вращательно-эквивариантным, я не ожидал бы того же свойства от LASSO из-за нормы . Является ли LASSO модным или нет, вероятно, не имеет значения. L1
steveo'america
Идея заключалась в том, что для объяснения описанного феномена OP можно использовать более простые концепции, и что эти концепции не претерпят существенных изменений путем добавления термина регуляризации, управляемой данными.
Бен Огорек
7

Ответ Бена вдохновил меня пойти еще дальше по пути, который он указал, что произойдет, если «правда», y, окажется в других ситуациях.

В исходном примере y зависит от двух сильно коррелированных переменных x1 и x2. Предполагая, что есть другая переменная, х3, скажем,

x3 = c (1: N) / 250 # N определено ранее, N = 1000, x3 находится в той же шкале, что и x1, а шкала x3 влияет на результаты линейной регрессии, представленные ниже.

«Истина» у теперь определяется следующим образом

y = .5 * x1 - .7 * x3 + rnorm (N) # Процесс генерации данных

Что будет с регрессией?

резюме (лм (у ~ х1 + х2))

Существует сильный эффект коллинеарности. Стандартная ошибка x2 слишком велика. Однако, линейная регрессия идентифицирует x2 как незначимую переменную.

     Coefficients:
        Estimate Std. Error t value Pr(>|t|)    
(Intercept) -1.39164    0.04172 -33.354  < 2e-16 ***
x1           0.65329    0.12550   5.205 2.35e-07 ***
x2          -0.07878    0.05848  -1.347    0.178 

VIF (лм (у ~ х1 + х2))

x1       x2 
9.167429 9.167429 

Как насчет другого случая регрессии?

резюме (лм (у ~ х1 + х2 + х3))

Coefficients:
        Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.02100    0.06573   0.319    0.749    
x1           0.55398    0.09880   5.607 2.67e-08 ***
x2          -0.02966    0.04604  -0.644    0.520    
x3          -0.70562    0.02845 -24.805  < 2e-16 ***

Переменная x2 несущественна, и ее рекомендуется удалить с помощью линейной регрессии.

VIF (лм (у ~ х1 + х2 + х3))

x1       x2       x3 
9.067865 9.067884 1.000105 

Из приведенных выше результатов коллинеарность не является проблемой в линейной регрессии, и проверка VIF не очень полезна.

Давайте посмотрим на другую ситуацию. x3 = c (1: N) # N определено ранее, N = 1000, x3 не в том же масштабе, что и x1.

«Истина» у определяется так же, как и выше

y = .5 * x1 - .7 * x3 + rnorm (N) # Процесс генерации данных

Что будет с регрессией?

резюме (лм (у ~ х1 + х2))

Существует сильный эффект коллинеарности. Стандартные ошибки x1, x2 слишком велики. Линейная регрессия не может определить важную переменную x1.

   Coefficients:
        Estimate Std. Error t value Pr(>|t|)    
(Intercept) -350.347      6.395 -54.783   <2e-16 ***
x1            25.207     19.237   1.310    0.190    
x2           -12.212      8.963  -1.362    0.173  

VIF (лм (у ~ х1 + х2))

    x1       x2 
9.167429 9.167429 

Как насчет другого случая регрессии?

резюме (лм (у ~ х1 + х2 + х3))

Coefficients:
          Estimate Std. Error   t value Pr(>|t|)    
(Intercept)  0.0360104  0.0610405     0.590    0.555    
x1           0.5742955  0.0917555     6.259 5.75e-10 ***
x2          -0.0277623  0.0427585    -0.649    0.516    
x3          -0.7000676  0.0001057 -6625.170  < 2e-16 ***

Переменная x2 несущественна, и ее рекомендуется удалить с помощью линейной регрессии.

VIF (лм (у ~ х1 + х2 + х3))

x1       x2       x3 
9.182507 9.184419 1.001853 

Примечание: регрессия у на х1 и х3. Обратите внимание, что стандартная ошибка x1 составляет всего 0,03.

резюме (лм (у ~ х1 + х3))

Coefficients:
              Estimate Std. Error   t value Pr(>|t|)    
(Intercept) -0.1595528  0.0647908    -2.463    0.014 *  
x1           0.4871557  0.0321623    15.147   <2e-16 ***
x3          -0.6997853  0.0001121 -6240.617   <2e-16 ***

Основываясь на приведенных выше результатах, я пришел к выводу, что

  • когда переменные предиктора находятся в похожих масштабах, коллинеарность не является проблемой в линейной регрессии;
  • когда переменные предиктора не находятся в подобных масштабах,
    • когда две истинно коррелированные переменные находятся в истинной модели, коллинеарность не является проблемой;
    • когда только одна из двух сильно коррелированных переменных находится в истинной модели,
      • Если другие «истинные» переменные включены в линейную регрессию, линейная регрессия идентифицирует незначимые переменные, которые связаны со значимой переменной.
      • Если другие «истинные» переменные не включены в линейную регрессию, проблема коллинеарности является серьезной, что приводит к стандартной инфляции ошибок.
vtshen
источник
Интересно, хотя эти результаты предполагают линейные отношения между предикторами / признаками и y. Они далеко не исчерпывающие. Что произойдет, если в ваших предикторах будут сильные нелинейные отношения (например, члены взаимодействия x1 * x2, функции пошаговой функции / пустые переменные (1, если x1> c для некоторой константы) и т. Д.)? Если вы работаете с данными с низким отношением сигнал / шум, как при создании функций для алгоритмической торговли, вы всегда экономите на моделях, чтобы уменьшить переоснащение (потому что ваши сигналы слабые), поэтому есть все еще веские причины иметь дело с мультиколлинеарностью
FXQuantTrader