Neden glmnet ridge regression bana manuel hesaplamadan farklı bir cevap veriyor?


28

Sırt regresyon tahminlerini hesaplamak için glmnet kullanıyorum. Beni glmnet’in yaptığını düşündüğüm şeyi yaptığından şüphelenen bazı sonuçlar aldım. Bunu kontrol etmek için, çözüme göre yapılan ridge regresyonunun sonucunu ve glmnet'teki karşılaştırmayı yaptığım basit bir R betiği yazdım, fark önemlidir.

n    <- 1000
p.   <-  100
X.   <- matrix(rnorm(n*p,0,1),n,p)
beta <- rnorm(p,0,1)
Y    <- X%*%beta+rnorm(n,0,0.5)

beta1 <- solve(t(X)%*%X+5*diag(p),t(X)%*%Y)
beta2 <- glmnet(X,Y, alpha=0, lambda=10, intercept=FALSE, standardize=FALSE, 
                family="gaussian")$beta@x
beta1-beta2

Farkın normu genellikle 20 civarında olup, sayısal olarak farklı algoritmalardan kaynaklanamaz, yanlış bir şey yapmalıyım. glmnetÇıkıntı ile aynı sonucu elde etmek için ayarlamam gereken ayarlar nelerdir ?


1
Bu soruyu gördün mü ?
cdeterman

1
Evet, ama normalleşmeyi kullanarak hala aynı sonucu alamıyorum.
John,

Kodunu gönderebilir misin o zaman?
shadowtalker

Ben de aynı sorunu yaşadım! a = data.frame (a = jitter (1:10), b = jitter (1:10), c = jitter (1:10), d = jitter (1:10), e = jitter (1:10) , f = titreme (1:10), g = numune (titreme (1:10)), y = sıra (10,100,10)); sığır (lm.ridge (y + a + b + c + d + e + f + g, a, lambda = 2.57)); coef (glmnet (as.matrix (a [, 1: 7]), a $ y, aile = "gaussian", alfa = 0, lambda = 2.57 / 10)) Sonuçlar biraz farklılık gösterir ve çok Glmnet için çok daha yüksek lambda kullanıyorum.
a11msp

İlgi çekici. Katsayıları kabaca 10 faktörü ile farklı görünüyor
Tomka

Yanıtlar:


27

Gözlemlediğiniz fark, GLMNET'in objektif işlevlerinde kullandığı gözlem sayısı N'nin eklenmesi ve aşağıda gösterildiği gibi örnek standart sapması ile Y'nin standartlaştırılmasıdır.

12NysyXβ22+λβ22/2

Kullandığımız burada yerine için , 1/n1/(n1)sy

sy=i(yiy¯)2n

Betaya göre farklılık göstererek, denklemi sıfıra ayarlayarak,

XTXβXTysy+Nλβ=0

Ve beta için çözerek, tahminde,

β~GLMNET=(XTX+NλIp)1XTysy

Y'nin orijinal metriği üzerindeki tahminleri (ve bunlara karşılık gelen cezaları) geri kazanmak için, GLMNET, hem tahminleri hem de lambdaları ile kullanıcıya geri döndürür,sy

β^GLMNET=syβ~GLMNET=(XTX+NλIp)1XTy
λunstd.=syλ

Bu çözümü standart sırt regresyonunun türetilmesiyle karşılaştırın.

β^=(XTX+λIp)1XTy

fazladan N faktörü ile ölçeklendiğine dikkat edin . Ayrıca, veya işlevini kullandığımız zaman , ceza açıkça tarafından ölçeklendirilir . Diğer bir deyişle, bu işlevleri bazı için katsayı tahminlerini elde etmek için kullandığımızda , için tahminleri etkin bir şekilde elde .λpredict()coef()1/syλλ=λ/sy

Bu gözlemlere dayanarak, GLMNET'te kullanılan cezanın bir faktörü ile ölçeklendirilmesi gerekir .sy/N

set.seed(123)

n    <- 1000
p   <-  100
X   <- matrix(rnorm(n*p,0,1),n,p)
beta <- rnorm(p,0,1)
Y    <- X%*%beta+rnorm(n,0,0.5)

sd_y <- sqrt(var(Y)*(n-1)/n)[1,1]

beta1 <- solve(t(X)%*%X+10*diag(p),t(X)%*%(Y))[,1]

fit_glmnet <- glmnet(X,Y, alpha=0, standardize = F, intercept = FALSE, thresh = 1e-20)
beta2 <- as.vector(coef(fit_glmnet, s = sd_y*10/n, exact = TRUE))[-1]
cbind(beta1[1:10], beta2[1:10])

           [,1]        [,2]
[1,]  0.23793862  0.23793862
[2,]  1.81859695  1.81859695
[3,] -0.06000195 -0.06000195
[4,] -0.04958695 -0.04958695
[5,]  0.41870613  0.41870613
[6,]  1.30244151  1.30244151
[7,]  0.06566168  0.06566168
[8,]  0.44634038  0.44634038
[9,]  0.86477108  0.86477108
[10,] -2.47535340 -2.47535340

Sonuçlar, kesişen ve standartlaştırılmış X değişkenlerinin dahil edilmesini genelleştirir. [1] pozisyonunda ek bir sıfır girişi olacak şekilde bir sütun ve köşegen matrisi içerecek şekilde standartlaştırılmış bir X matrisini değiştiriyoruz (yani, kesişmeyi cezalandırmayın). Daha sonra tahminleri kendi standart sapmalarına göre standartlaştırabilirsiniz (yine standart sapmayı hesaplarken 1 / n kullandığınızdan emin olun).

β^j=βj~sxj

β^0=β0~x¯Tβ^
mean_x <- colMeans(X)
sd_x <- sqrt(apply(X,2,var)*(n-1)/n)
X_scaled <- matrix(NA, nrow = n, ncol = p)
for(i in 1:p){
    X_scaled[,i] <- (X[,i] - mean_x[i])/sd_x[i] 
}
X_scaled_ones <- cbind(rep(1,n), X_scaled)

beta3 <- solve(t(X_scaled_ones)%*%X_scaled_ones+1000*diag(x = c(0, rep(1,p))),t(X_scaled_ones)%*%(Y))[,1]
beta3 <- c(beta3[1] - crossprod(mean_x,beta3[-1]/sd_x), beta3[-1]/sd_x)

fit_glmnet2 <- glmnet(X,Y, alpha=0, thresh = 1e-20)
beta4 <- as.vector(coef(fit_glmnet2, s = sd_y*1000/n, exact = TRUE))

cbind(beta3[1:10], beta4[1:10])
             [,1]        [,2]
 [1,]  0.24534485  0.24534485
 [2,]  0.17661130  0.17661130
 [3,]  0.86993230  0.86993230
 [4,] -0.12449217 -0.12449217
 [5,] -0.06410361 -0.06410361
 [6,]  0.17568987  0.17568987
 [7,]  0.59773230  0.59773230
 [8,]  0.06594704  0.06594704
 [9,]  0.22860655  0.22860655
[10,]  0.33254206  0.33254206

Standart X'i araya girmeden göstermek için kod eklendi:

set.seed(123)

n <- 1000
p <-  100
X <- matrix(rnorm(n*p,0,1),n,p)
beta <- rnorm(p,0,1)
Y <- X%*%beta+rnorm(n,0,0.5)

sd_y <- sqrt(var(Y)*(n-1)/n)[1,1]

mean_x <- colMeans(X)
sd_x <- sqrt(apply(X,2,var)*(n-1)/n)

X_scaled <- matrix(NA, nrow = n, ncol = p)
for(i in 1:p){
    X_scaled[,i] <- (X[,i] - mean_x[i])/sd_x[i] 
}

beta1 <- solve(t(X_scaled)%*%X_scaled+10*diag(p),t(X_scaled)%*%(Y))[,1]

fit_glmnet <- glmnet(X_scaled,Y, alpha=0, standardize = F, intercept = 
FALSE, thresh = 1e-20)
beta2 <- as.vector(coef(fit_glmnet, s = sd_y*10/n, exact = TRUE))[-1]
cbind(beta1[1:10], beta2[1:10])

             [,1]        [,2]
 [1,]  0.23560948  0.23560948
 [2,]  1.83469846  1.83469846
 [3,] -0.05827086 -0.05827086
 [4,] -0.04927314 -0.04927314
 [5,]  0.41871870  0.41871870
 [6,]  1.28969361  1.28969361
 [7,]  0.06552927  0.06552927
 [8,]  0.44576008  0.44576008
 [9,]  0.90156795  0.90156795
[10,] -2.43163420 -2.43163420

3
6. CV'ye hoş geldiniz ve bu eski soruyu net bir şekilde yanıtladığınız için teşekkür ederiz.
amip diyor Reinstate Monica

1
çözümünde yerine kimlik matrisi olmalı , doğru mu? ββ~
user1769197

Ayrıca, “Sonuçlar bir kesişme ve standardize edilmiş X değişkeninin dahil edilmesine genellenir” dediğiniz ikinci bölüm için; Bu kısım için, eğer kesişmeyi hariç tutarsanız, aynı hesaplamaları izleyerek, glmnet'in sonuçları manuel hesaplamadan farklı olur.
user1769197

Doğru, çözümü gerektiği gibi yerine kimlik matrisi ile güncelledim . Standardize edilmiş X için çözümü hiçbir kesinti olmadan kontrol ettim ve hala aynı sonuçları elde ettim (bkz. Yukarıdaki ek kod). β
skijunkie

3

Göre https://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html aile olduğunda gaussian, glmnet()en aza indirmek gerekir

(1)12ni=1n(yiβ0xiTβ)2+λj=1p(α|βj|+(1α)βj2/2).

Kullanırken glmnet(x, y, alpha=1)sütunlu kement uygun standart, bildirilen cezası çözelti en aza indirmek için bir çözüm Bununla birlikte, en azından , sırt regresyonuna uyacak şekilde kullanıldığında , bildirilen bir ceza için çözüm, burada standart sapmasıdır . Burada, ceza olarak bildirilmelidir .xλ

12ni=1n(yiβ0xiTβ)2+λj=1p|βj|.
glmnet_2.0-13glmnet(x, y, alpha=0)λ
12ni=1n(yiβ0xiTβ)2+λ12syj=1pβj2.
syyλ/sy

Ne gerçekleşebilir işlevi ilk standart hale olmasıdır için ve daha sonra bunları en aza indirebilecek etkili bir şekilde en aza indirecek veya eşdeğerde, yy0

(2)12ni=1n(y0ixiTγ)2+ηj=1p(α|γj|+(1α)γj2/2),
12nsy2i=1n(yiβ0xiTβ)2+ηαsyj=1p|βj|+η1α2sy2j=1pβj2,
12ni=1n(yiβ0xiTβ)2+ηsyαj=1p|βj|+η(1α)j=1pβj2/2.

Kement için ( ), cezayı mantıklı olduğu gibi bildirmek için geri ölçeklendirme . Daha sonra tüm , arasında sonuçları sürekliliğini sağlamak için ceza olarak rapor edilmelidir . Muhtemelen yukarıdaki sorunun nedeni budur. Bu kısmen çözmek için (2) kullanarak (1) kaynaklanmaktadır. Sadece veya olduğunda, (1) ve (2) problemleri arasında bir eşitlik vardır (yani, (1) ' deki ile (2)' deki arasındaki bir yazışma ). Başka birα=1ηηsyαηsyαα=0α=1ληα(0,1)problemler (1) ve (2) iki farklı optimizasyon problemidir ve (1) ' deki ve (2)' deki arasında birebir yazışma yoktur .λη


1
Cevabınızın öncekinden nerede farklı olduğunu göremiyorum. Açıklayabilir misiniz lütfen?
Firebug

1
@Firebug İşlevin, sadece sırt regresyonu perspektifinden bakıldığında doğal görünmeyen lambda'yı bu şekilde rapor etmesine ışık tutmak istedim, ancak tüm spektrumun perspektifinden bakıldığında mantıklı (veya bu şekilde olması gerekir). Hem sırt hem de kement dahil.
Chun Li
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.