Glmnet रिज रिग्रेशन मुझे मैन्युअल गणना की तुलना में एक अलग उत्तर क्यों दे रहा है?


28

मैं रिज रिग्रेशन अनुमानों की गणना करने के लिए glmnet का उपयोग कर रहा हूं। मुझे कुछ परिणाम मिले, जिससे मुझे उस ग्लमैनेट में संदेह हुआ, जो मैं सोचता हूं कि वह वास्तव में कर रहा है। यह जाँचने के लिए मैंने एक साधारण R स्क्रिप्ट लिखी है जहाँ मैं रिज रिग्रेसेशन के परिणाम को हल करके और glmnet में एक की तुलना करता हूँ, यह अंतर महत्वपूर्ण है:

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

अंतर का मान आमतौर पर लगभग 20 है जो संख्यात्मक रूप से भिन्न एल्गोरिदम के कारण नहीं हो सकता है, मुझे कुछ गलत करना चाहिए। glmnetरिज के समान परिणाम प्राप्त करने के लिए मुझे क्या सेटिंग करनी होगी ?


1
क्या आपने यह प्रश्न देखा है ?
cdeterman

1
हां, लेकिन मुझे अभी भी सामान्यीकरण का उपयोग करके समान परिणाम नहीं मिला है।
जॉन

क्या आप अपना कोड तब पोस्ट कर सकते हैं?
छायाकार

मैं सिर्फ एक ही समस्या थी! a = data.frame (a = घबराना (1:10), b = घबराना (1:10), c = घबराना (1:10), d = घबराना (1:10), e = घबराना (1:10) , एफ = घबराना (1:10), जी = नमूना (घबराना (1:10)), y = seq (10,100,10)); coef (lm.ridge (y ~ a + b + c + d + e + f + g, a, lambda = 2.57)); coef (glmnet (as.matrix ([, 1: 7])), एक $ y, परिवार = "गॉसियन", अल्फा = 0, लैम्ब्डा = 2.57 / 10)) परिणाम काफी भिन्न होते हैं और अधिक समान हो जाते हैं जब मैं glmnet के लिए बहुत अधिक lambdas का उपयोग करता हूं।
a11msp

पेचीदा। गुणांक मोटे तौर पर 10 के कारक से भिन्न प्रतीत होता है
टॉमका

जवाबों:


27

आप जो अंतर देख रहे हैं, वह अवलोकनों की संख्या द्वारा N के अतिरिक्त विभाजन के कारण है, जो GLMNET अपने उद्देश्य फ़ंक्शन में उपयोग करता है और इसके नमूने मानक विचलन द्वारा Y के निहित मानकीकरण का उपयोग नीचे दिखाए गए अनुसार करता है।

12एनyरोंy-एक्सβ22+λβ22/2

जहां हम का उपयोग के स्थान पर के लिए , 1 / ( n - 1 ) रों y रों y = Σ मैं ( y मैं - ˉ y ) 21/n1/(n-1)रोंy

रोंy=Σमैं(yमैं-y¯)2n

बीटा के संबंध में विभेद करके, समीकरण को शून्य पर सेट करें,

एक्सटीएक्सβ-एक्सटीyरोंy+एनλβ=0

और बीटा के लिए हल करना, हम अनुमान प्राप्त करते हैं,

β~जीएलएमएनटी=(एक्सटीएक्स+एनλमैंपी)-1एक्सटीyरोंy

Y के मूल मीट्रिक पर अनुमानों (और उनके अनुरूप दंड) को पुनर्प्राप्त करने के लिए, GLMNET ने द्वारा दोनों अनुमानों और लंबों को गुणा किया और इन परिणामों को उपयोगकर्ता को लौटाता है,रोंy

β^जीएलएमएनटी=रोंyβ~जीएलएमएनटी=(एक्सटीएक्स+एनλमैंपी)-1एक्सटीy
λयूnरोंटी=रोंyλ

रिज के प्रतिगमन के मानक व्युत्पन्न के साथ इस समाधान की तुलना करें।

β^=(एक्सटीएक्स+λमैंपी)-1एक्सटीy

ध्यान दें कि को एक अतिरिक्त कारक द्वारा स्केल किया जाता है। इसके अतिरिक्त, जब हम या फ़ंक्शन का उपयोग करते हैं, तो जुर्माना द्वारा रूप से बढ़ाया जा रहा है । यह कहना है, जब हम इन कार्यों का उपयोग कुछ लिए गुणांक अनुमान प्राप्त करने के लिए करते हैं, तो हम प्रभावी रूप से लिए अनुमान प्राप्त कर रहे हैं ।λpredict()coef()1/रोंyλ*λ=λ*/रोंy

इन अवलोकनों के आधार पर, GLMNET में उपयोग किए जाने वाले जुर्माने को एक कारक द्वारा बढ़ाया जाना चाहिए ।रोंy/एन

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

परिणाम एक अवरोधन और मानकीकृत एक्स चर के समावेश के लिए सामान्यीकृत होते हैं। हम एक मानकीकृत X मैट्रिक्स को संशोधित करते हैं, जिनमें से एक स्तंभ और विकर्ण मैट्रिक्स को शामिल करने के लिए एक अतिरिक्त शून्य प्रविष्टि है [1,1] स्थिति में (अर्थात अवरोधन को दंडित न करें)। फिर आप उनके संबंधित नमूना मानक विचलन द्वारा अनुमानों को अस्थिर कर सकते हैं (फिर से सुनिश्चित करें कि आप मानक विचलन की गणना करते समय 1 / n का उपयोग कर रहे हैं)।

β^j=βj~रोंएक्सj

β^0=β0~-एक्स¯टीβ^
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

बिना किसी अवरोधक के मानकीकृत X दिखाने के लिए जोड़ा गया कोड:

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 में आपका स्वागत है और इस पुराने प्रश्न का इतने स्पष्ट तरीके से जवाब देने के लिए धन्यवाद।
अमीबा का कहना है कि मोनिका

1
यह के समाधान में बजाय पहचान मैट्रिक्स होना चाहिए , सही? ββ~
user1769197

मैं यह भी नोटिस करता हूं कि दूसरे भाग के लिए जहां आपने कहा था "परिणाम एक अवरोधन और मानकीकृत एक्स चर के समावेश के लिए सामान्यीकृत होते हैं"; इस भाग के लिए, यदि आप अवरोधन को बाहर करते हैं, तो उसी गणना के बाद, ग्लमैनेट के परिणाम मैन्युअल गणना से अलग हो जाते हैं।
user1769197

सही है, मैंने पहचान मैट्रिक्स के साथ समाधान को जरूरत के अनुसार स्थान पर अद्यतन किया है । मैंने बिना किसी अवरोधक के मानकीकृत एक्स के समाधान की जाँच की और अभी भी समान परिणाम प्राप्त करें (ऊपर अतिरिक्त कोड देखें)। β
skijunkie

3

के अनुसार https://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html , परिवार है जब gaussian, glmnet()को कम करना चाहिए

(1)12nΣमैं=1n(yमैं-β0-एक्समैंटीβ)2+λΣj=1पी(α|βj|+(1-α)βj2/2)

जबglmnet(x, y, alpha=1) में कॉलम के साथ लैस्सो को मानकीकृत करने के लिए उपयोग किया जाता है , तो रिपोर्ट किए गए पेनल्टी के लिए समाधान को कम करने के लिए समाधान है हालांकि, कम से कम में , जब रिज रिग्रेशन फिट करने के लिए उपयोग किया जाता है, तो रिपोर्ट किए गए पेनल्टी के लिए समाधान को कम करने के लिए समाधान है जहां का मानक विचलन है । यहां, दंड को रूप में रिपोर्ट किया जाना चाहिए ।एक्सλ

12nΣमैं=1n(yमैं-β0-एक्समैंटीβ)2+λΣj=1पी|βj|
glmnet_2.0-13glmnet(x, y, alpha=0)λ
12nΣमैं=1n(yमैं-β0-एक्समैंटीβ)2+λ12रोंyΣj=1पीβj2
रोंyyλ/रोंy

क्या हो सकता है कि फ़ंक्शन पहले से तक और फिर जो प्रभावी रूप से को कम करने के लिए है या समकक्ष, yy0

(2)12nΣमैं=1n(y0मैं-एक्समैंटीγ)2+ηΣj=1पी(α|γj|+(1-α)γj2/2),
12nरोंy2Σमैं=1n(yमैं-β0-एक्समैंटीβ)2+ηαरोंyΣj=1पी|βj|+η1-α2रोंy2Σj=1पीβj2,
12nΣमैं=1n(yमैं-β0-एक्समैंटीβ)2+ηरोंyαΣj=1पी|βj|+η(1-α)Σj=1पीβj2/2।

लसो ( ) के लिए, पेनल्टी रिपोर्ट करने के लिए स्केलिंग रूप में समझ में आता है। तब सभी के लिए , जुर्माना भर में परिणामों की निरंतरता बनाए रखने के रूप में सूचित किया गया है । यह शायद ऊपर की समस्या का कारण है। यह आंशिक रूप से (2) को हल करने के लिए उपयोग करने के कारण है (1)। केवल जब या समस्याओं (1) और (2) के बीच कुछ समानता है (यानी, (1) में बीच एक पत्राचार (2) में )। किसी अन्यη η रों y अल्फा η रों y अल्फा अल्फा = 0 अल्फा = 1 λ η अल्फा ( 0 , 1 ) λ ηα=1ηηरोंyαηरोंyαα=0α=1ληα(0,1), समस्याएं (1) और (2) दो अलग अनुकूलन समस्याएं हैं, और (1) और (2) में बीच एक-से-एक पत्राचार नहीं है ।λη


1
मैं नहीं देख सकता कि आपका उत्तर पिछले एक से कहाँ भिन्न है। क्या आप समझा सकते हैं, कृपया?
फायरबग

1
@ फ़ायरबग मैं इस बात पर प्रकाश डालना चाहता था कि फ़ंक्शन लंबोदर को इस तरह क्यों रिपोर्ट करता है, जो अप्राकृतिक रूप से रिज रिग्रेशन के परिप्रेक्ष्य से देखे जाने पर प्रकट होता है, लेकिन पूरे स्पेक्ट्रम के परिप्रेक्ष्य से देखे जाने पर समझ में आता है (या इस तरह से होना चाहिए) रिज और लासो सहित।
चुन ली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.