Kiedy LASSO wybiera skorelowane predyktory?

13

Korzystam z pakietu „lars” w języku R z następującym kodem:

> 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 .....

Mam zestaw danych z 5 zmiennymi ciągłymi i próbuję dopasować model do jednej (zależnej) zmiennej y. Dwa z moich predyktorów są ze sobą wysoce skorelowane (x1, x2).

Jak widać w powyższym przykładzie, funkcja lars z opcją „krokową” najpierw wybiera zmienną najbardziej skorelowaną z y. Następną zmienną, która wchodzi do modelu, jest ta, która jest najbardziej skorelowana z resztami. Rzeczywiście, jest to x4:

> round((cor(cbind(resid(lm(y~x1)),x))[1,3:6]),4)
    x2     x3     x4     x5 
0.1163 0.2997 0.9246 0.0037  

Teraz, jeśli zrobię opcję „lasso”:

> 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

Dodaje obie skorelowane zmienne do modelu w pierwszych dwóch krokach. Jest to przeciwieństwo tego, co przeczytałem w kilku artykułach. Większość z nich twierdzi, że jeśli istnieje grupa zmiennych, wśród których korelacje są bardzo wysokie, wówczas „lasso” ma tendencję do wybierania tylko jednej zmiennej z grupy losowo.

Czy ktoś może podać przykład takiego zachowania? Lub wyjaśnij, dlaczego moje zmienne x1, x2 są dodawane do modelu jedna po drugiej (razem)?

ThomasH_MB
źródło
Jest to regresja najmniejszego kąta, która daje wyjaśnienie kroków lasso.
Michael R. Chernick
@MichaelChernick: Jeśli spojrzysz na Rwywołanie OP i związane z nim dane wyjściowe, zobaczysz, że rzeczywiście używa lasso. Jak zapewne wiesz, niewielka modyfikacja algorytmu larsa daje ścieżkę regulacyjną lasso.
kardynał
Domyślam się, że ponieważ x2 zawiera 4 jednostki x1, x1 i x2 razem mają największą wariancję (9 jednostek). Jeśli obniżysz współczynnik x2 do 2, powinieneś zobaczyć, że x4 jest wybrane przed x1 i x2.
Czy możesz podać jakieś referencje na dowód tej „losowości”? Dziękuję Ci.
ziyuang
Myślę, że można znaleźć odpowiedzi w tym dokumencie: arxiv.org/pdf/1204.1605.pdf
TPArrow

Odpowiedzi:

15

Problem kolinearności jest zdecydowanie przereklamowany!

Thomas, przedstawiłeś wspólny punkt widzenia, że ​​jeśli predyktory są skorelowane, nawet najlepsza technika selekcji zmiennych po prostu wybiera jeden losowo z grupy. Na szczęście w ten sposób zaniżono zdolność regresji do odkrywania prawdy! Jeśli masz odpowiedni typ zmiennych objaśniających (egzogennych), regresja wielokrotna obiecuje znaleźć efekt każdej zmiennej utrzymującej pozostałe na stałym poziomie. Teraz, jeśli zmienne są doskonale skorelowane, to jest to dosłownie niemożliwe. Jeśli zmienne są skorelowane, może to być trudniejsze, ale przy dzisiejszym rozmiarze typowego zestawu danych nie jest to o wiele trudniejsze.

Kolinearność to problem niskiej ilości informacji. Zobacz parodię kolinearności Art Goldbergera na blogu Dave'a Gilesa . Sposób, w jaki mówimy o kolinearności, brzmiałby głupio, gdyby był zastosowany do średniej zamiast częściowego współczynnika regresji.

Nadal nie jesteś przekonany? Czas na jakiś kod.

set.seed(34234)

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

Stworzyłem wysoce skorelowane zmienne x1 i x2, ale na wykresie poniżej widać, że gdy x1 jest bliskie -1, nadal widzimy zmienność w x2. wprowadź opis zdjęcia tutaj

Czas dodać „prawdę”:

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

Czy zwykła regresja może się powieść w obliczu potężnego problemu kolinearności?

summary(lm(y ~ x1 + x2))

O tak, może:

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 ***

Teraz nie mówiłem o LASSO, na którym koncentrowało się twoje pytanie. Ale pozwól, że cię o to zapytam. Jeśli regresja oldschoolowa z eliminacją wsteczną nie daje się zwieść kolinearności, dlaczego miałbyś tak myśleć o najnowocześniejszym systemie LASSO?

Ben Ogorek
źródło
L1
Pomysł polegał na tym, że prostsze koncepcje mogłyby zostać wykorzystane do wyjaśnienia opisywanego zjawiska OP, oraz że koncepcje te nie ulegają zasadniczej zmianie przez dodanie terminu regulacyjnego opartego na danych.
Ben Ogorek
7

Odpowiedź Bena zainspirowała mnie do pójścia o krok dalej na podanej przez niego ścieżce, co się stanie, jeśli „prawda”, y, będzie w innych sytuacjach.

W oryginalnym przykładzie y zależy od dwóch wysoce skorelowanych zmiennych x1 i x2. Zakładając, że istnieje inna zmienna, powiedzmy x3

x3 = c (1: N) / 250 # N zdefiniowano wcześniej, N = 1000, x3 ma podobną skalę jak x1, a skala x3 ma wpływ na wyniki regresji liniowej poniżej.

„Prawda” y jest teraz zdefiniowana jako następująca

y = .5 * x1 - .7 * x3 + rnorm (N) # Proces generowania danych

Co stałoby się z regresją?

podsumowanie (lm (y ~ x1 + x2))

Istnieje silny efekt kolinearności. Standardowy błąd x2 jest zbyt duży. Jednak regresja liniowa identyfikuje x2 jako zmienną nieistotną.

     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 (lm (y ~ x1 + x2))

x1       x2 
9.167429 9.167429 

Co z innym przypadkiem regresji?

podsumowanie (lm (y ~ x1 + x2 + x3))

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 ***

Zmienna x2 nie jest znacząca i zaleca się jej usunięcie za pomocą regresji liniowej.

vif (lm (y ~ x1 + x2 + x3))

x1       x2       x3 
9.067865 9.067884 1.000105 

Z powyższych wyników kolinearność nie stanowi problemu w regresji liniowej, a sprawdzenie VIF nie jest bardzo pomocne.

Spójrzmy na inną sytuację. x3 = c (1: N) # N zdefiniowano wcześniej, N = 1000, x3 nie jest w tej samej skali co x1.

„Prawda” y jest zdefiniowana tak samo jak powyżej

y = .5 * x1 - .7 * x3 + rnorm (N) # Proces generowania danych

Co stałoby się z regresją?

podsumowanie (lm (y ~ x1 + x2))

Istnieje silny efekt kolinearności. Standardowe błędy x1, x2 są zbyt duże. Regresja liniowa nie identyfikuje ważnej zmiennej 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 (lm (y ~ x1 + x2))

    x1       x2 
9.167429 9.167429 

Co z innym przypadkiem regresji?

podsumowanie (lm (y ~ x1 + x2 + x3))

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 ***

Zmienna x2 nie jest znacząca i zaleca się jej usunięcie za pomocą regresji liniowej.

vif (lm (y ~ x1 + x2 + x3))

x1       x2       x3 
9.182507 9.184419 1.001853 

Uwaga: regresja y na x1 i x3. Zauważ, że standardowy błąd x1 wynosi tylko 0,03.

podsumowanie (lm (y ~ x1 + x3))

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 ***

Na podstawie powyższych wyników, mój wniosek jest taki

  • gdy zmienne predykcyjne znajdują się w podobnych skalach, kolinearność nie stanowi problemu w regresji liniowej;
  • gdy zmienne predykcyjne nie są w podobnej skali,
    • gdy dwie wysoce skorelowane zmienne znajdują się w prawdziwym modelu, kolinearność nie stanowi problemu;
    • gdy tylko jedna z dwóch wysoce skorelowanych zmiennych znajduje się w prawdziwym modelu,
      • Jeśli inne „prawdziwe” zmienne zostaną uwzględnione w regresji liniowej, regresja liniowa zidentyfikuje zmienne nieistotne, które są skorelowane ze zmienną istotną.
      • Jeśli inne „prawdziwe” zmienne nie są uwzględnione w regresji liniowej, problem kolinearności jest poważny, co powoduje inflację błędu standardowego.
Vtshen
źródło
Interesujące, chociaż wyniki te zakładają liniowe relacje między predyktorami / cechami y. Są dalekie od kompleksowych. Co się stanie, jeśli w twoich predyktorach występują silne nieliniowe związki (np. Warunki interakcji x1 * x2, funkcje funkcji krokowej / zmienne zastępcze (1 jeśli x1> c dla pewnej stałej) itp.? Jeśli pracujesz z danymi o niskim stosunku sygnału do szumu, na przykład przy tworzeniu funkcji dla handlu algorytmicznego, zawsze oszczędne modele zmniejszają nadmierne dopasowanie (ponieważ twoje sygnały są słabe), więc nadal istnieją poważne powody, aby radzić sobie z wielokoliniowością
FXQuantTrader