Kapan LASSO memilih prediktor yang berkorelasi?

13

Saya menggunakan paket 'lars' dalam R dengan kode berikut:

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

Saya punya dataset dengan 5 variabel kontinu dan saya mencoba menyesuaikan model dengan variabel tunggal (dependen) y. Dua prediktor saya sangat berkorelasi satu sama lain (x1, x2).

Seperti yang Anda lihat pada contoh di atas, fungsi lars dengan opsi 'stepwise' pertama-tama memilih variabel yang paling berkorelasi dengan y. Variabel berikutnya untuk memasukkan model adalah variabel yang paling berkorelasi dengan residual. Memang, itu adalah 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  

Sekarang, jika saya melakukan opsi 'laso':

> 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

Ini menambahkan kedua variabel berkorelasi ke model dalam dua langkah pertama. Ini kebalikan dari apa yang saya baca di beberapa makalah. Sebagian besar kemudian mengatakan bahwa jika ada sekelompok variabel di antaranya korelasinya sangat tinggi, maka 'laso' cenderung memilih hanya satu variabel dari kelompok secara acak.

Bisakah seseorang memberikan contoh perilaku ini? Atau jelaskan, mengapa variabel saya x1, x2 ditambahkan ke model satu demi satu (bersama)?

ThomasH_MB
sumber
Ini adalah regresi sudut terkecil yang memberikan penjelasan tentang langkah-langkah laso.
Michael R. Chernick
@MichaelChernick: Jika Anda melihat Rpanggilan yang dibuat OP dan output terkait yang ia berikan, Anda akan melihat bahwa ia memang menggunakan laso. Seperti yang saya yakin Anda tahu, tweak kecil dari algoritma lars menghasilkan jalur regularisasi laso.
kardinal
"Tebakan" saya adalah, karena x2 mencakup 4 unit x1, x1 dan x2 dikombinasikan sebenarnya memiliki varian paling banyak (9 unit). Jika Anda menurunkan koefisien x2 ke 2, Anda akan melihat bahwa x4 dipilih sebelum x1 dan x2.
Bisakah Anda memberikan beberapa referensi untuk membuktikan "keacakan" itu? Terima kasih.
ziyuang
Saya kira Anda dapat menemukan jawaban Anda di makalah ini: arxiv.org/pdf/1204.1605.pdf
TPArrow

Jawaban:

15

Masalah collinearity terlalu dibesar-besarkan!

Thomas, Anda mengartikulasikan sudut pandang umum, bahwa jika prediktor berkorelasi, bahkan teknik pemilihan variabel terbaik hanya mengambil satu secara acak dari kelompok itu. Untungnya, itulah cara menggarisbawahi kemampuan regresi untuk mengungkap kebenaran! Jika Anda memiliki tipe variabel penjelas yang tepat (eksogen), regresi berganda menjanjikan untuk menemukan efek dari masing-masing variabel yang menahan variabel lainnya konstan. Sekarang jika variabel berkorelasi sempurna, maka ini benar-benar mustahil. Jika variabel berkorelasi, mungkin lebih sulit, tetapi dengan ukuran data yang ditetapkan saat ini, itu tidak terlalu sulit.

Collinearity adalah masalah rendah informasi. Lihatlah parodi kolinearitas ini oleh Art Goldberger di blog Dave Giles . Cara kita berbicara tentang kolinearitas akan terdengar konyol jika diterapkan pada mean daripada koefisien regresi parsial.

Masih belum yakin? Sudah waktunya untuk beberapa kode.

set.seed(34234)

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

Saya telah membuat variabel berkorelasi tinggi x1 dan x2, tetapi Anda dapat melihat dalam plot di bawah ini bahwa ketika x1 mendekati -1, kita masih melihat variabilitas dalam x2. masukkan deskripsi gambar di sini

Sekarang saatnya menambahkan "kebenaran":

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

Dapatkah regresi biasa berhasil di tengah-tengah masalah kolinearitas yang perkasa?

summary(lm(y ~ x1 + x2))

Oh ya itu bisa:

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

Sekarang saya tidak berbicara tentang LASSO, yang menjadi fokus pertanyaan Anda. Tetapi izinkan saya bertanya kepada Anda ini. Jika regresi sekolah lama dengan eliminasi mundur tidak tertipu oleh kolinearitas, mengapa Anda berpikir bahwa LASSO yang canggih akan melakukannya?

Ben Ogorek
sumber
L1
Idenya adalah bahwa konsep yang lebih sederhana dapat digunakan untuk menjelaskan fenomena yang dijelaskan OP, dan bahwa konsep-konsep ini tidak secara fundamental diubah oleh penambahan istilah regularisasi yang digerakkan oleh data.
Ben Ogorek
7

Jawaban Ben mengilhami saya untuk melangkah lebih jauh di jalan yang dia berikan, apa yang akan terjadi jika "kebenaran", y, ada dalam situasi lain.

Dalam contoh asli, y tergantung pada dua variabel yang sangat berkorelasi x1 dan x2. Dengan asumsi ada variabel lain, x3, katakan

x3 = c (1: N) / 250 # N didefinisikan sebelumnya, N = 1000, x3 berada dalam skala yang sama dengan x1, dan skala x3 memiliki efek pada hasil regresi linier di bawah ini.

"Kebenaran" y sekarang didefinisikan sebagai berikut

y = .5 * x1 - .7 * x3 + rnorm (N) # Proses Pembuatan Data

Apa yang akan terjadi pada regresi?

ringkasan (lm (y ~ x1 + x2))

Ada efek collinearity yang kuat. Kesalahan standar x2 terlalu besar. Namun, regresi linier mengidentifikasi x2 sebagai variabel yang tidak signifikan.

     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 

Bagaimana dengan kasus regresi lain?

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

Variabel x2 tidak signifikan, dan direkomendasikan untuk dihapus oleh regresi linier.

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

x1       x2       x3 
9.067865 9.067884 1.000105 

Dari hasil di atas, collinearity bukan masalah dalam regresi linier, dan memeriksa VIF tidak terlalu membantu.

Mari kita lihat situasi lain. x3 = c (1: N) # N didefinisikan sebelumnya, N = 1000, x3 tidak dalam skala yang sama dengan x1.

"Kebenaran" y didefinisikan sama seperti di atas

y = .5 * x1 - .7 * x3 + rnorm (N) # Proses Pembuatan Data

Apa yang akan terjadi pada regresi?

ringkasan (lm (y ~ x1 + x2))

Ada efek collinearity yang kuat. Kesalahan standar x1, x2 terlalu besar. Regresi linier gagal mengidentifikasi variabel penting 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 

Bagaimana dengan kasus regresi lain?

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

Variabel x2 tidak signifikan, dan direkomendasikan untuk dihapus oleh regresi linier.

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

x1       x2       x3 
9.182507 9.184419 1.001853 

Catatan: regresi y pada x1 dan x3. Perhatikan bahwa kesalahan standar x1 hanya 0,03.

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

Berdasarkan hasil di atas, kesimpulan saya adalah itu

  • ketika variabel prediktor berada dalam skala yang sama, collinearity bukan masalah dalam regresi linier;
  • ketika variabel prediktor tidak dalam skala yang sama,
    • ketika dua variabel yang sangat berkorelasi keduanya dalam model yang benar, collinearity bukan masalah;
    • ketika hanya satu dari dua variabel yang sangat berkorelasi dalam model yang benar,
      • Jika variabel "benar" lainnya dimasukkan dalam regresi linier, regresi linier akan mengidentifikasi variabel tidak signifikan yang berkorelasi dengan variabel signifikan.
      • Jika variabel "benar" lainnya tidak termasuk dalam regresi linier, masalah kolinearitas menjadi parah, yang mengakibatkan inflasi kesalahan standar.
vtshen
sumber
Menarik, meskipun hasil ini mengasumsikan hubungan linier antara prediktor / fitur dan y. Mereka jauh dari komprehensif. Apa yang terjadi jika ada hubungan non linier yang kuat dalam prediktor Anda (mis. Istilah interaksi x1 * x2, fitur fungsi langkah / vars boneka (1 jika x1> c untuk beberapa konstanta), dll)? Jika Anda bekerja dengan data rasio sinyal terhadap noise yang rendah, seperti dalam pembuatan fitur untuk perdagangan algoritmik, Anda selalu menggunakan model yang ketat untuk mengurangi overfitting (karena sinyal Anda lemah) sehingga masih ada alasan kuat untuk menangani multikolinieritas
FXQuantTrader