ग्लमनेट की व्याख्या कैसे करें?


36

मैं लगभग 60 भविष्यवक्ता चर और 30 टिप्पणियों के साथ एक बहुभिन्नरूपी रैखिक प्रतिगमन मॉडल को फिट करने की कोशिश कर रहा हूं, इसलिए मैं नियमित प्रतिगमन के लिए glmnet पैकेज का उपयोग कर रहा हूं क्योंकि p> n।

मैं दस्तावेज़ीकरण और अन्य प्रश्नों से गुजर रहा हूं, लेकिन मैं अभी भी परिणामों की व्याख्या नहीं कर सकता, यहां एक नमूना कोड (20 भविष्यवक्ताओं और सरल बनाने के लिए 10 टिप्पणियों के साथ):

मैं संख्या पंक्तियों के साथ एक मैट्रिक्स x बनाता हूं = संख्या अवलोकन और संख्या कॉल = संख्या पूर्वसूचक और एक वेक्टर y जो प्रतिक्रिया चर का प्रतिनिधित्व करता है

> x=matrix(rnorm(10*20),10,20)
> y=rnorm(10)

मैं एक glmnet मॉडल को डिफ़ॉल्ट के रूप में अल्फा छोड़ रहा हूं (lasso पेनल्टी के लिए = 1)

> fit1=glmnet(x,y)
> print(fit1)

मैं समझता हूं कि लैंबडा के घटते मूल्यों (यानी जुर्माना) के साथ मुझे अलग-अलग भविष्यवाणियां मिलती हैं

Call:  glmnet(x = x, y = y) 

        Df    %Dev   Lambda
  [1,]  0 0.00000 0.890700
  [2,]  1 0.06159 0.850200
  [3,]  1 0.11770 0.811500
  [4,]  1 0.16880 0.774600
   .
   .
   .
  [96,] 10 0.99740 0.010730
  [97,] 10 0.99760 0.010240
  [98,] 10 0.99780 0.009775
  [99,] 10 0.99800 0.009331
 [100,] 10 0.99820 0.008907

अब मैं अपने बीटा मानों को चुनने की भविष्यवाणी करता हूं, उदाहरण के लिए, दिए गए सबसे छोटे लैंबडा मूल्य glmnet

> predict(fit1,type="coef", s = 0.008907)

21 x 1 sparse Matrix of class "dgCMatrix"
                  1
(Intercept) -0.08872364
V1           0.23734885
V2          -0.35472137
V3          -0.08088463
V4           .         
V5           .         
V6           .         
V7           0.31127123
V8           .         
V9           .         
V10          .         
V11          0.10636867
V12          .         
V13         -0.20328200
V14         -0.77717745
V15          .         
V16         -0.25924281
V17          .         
V18          .         
V19         -0.57989929
V20         -0.22522859

अगर इसके बजाय मैं लैम्ब्डा को चुनता हूं

cv <- cv.glmnet(x,y)
model=glmnet(x,y,lambda=cv$lambda.min)

सभी चर (।) होंगे।

संदेह और सवाल:

  1. मुझे नहीं पता कि लैम्ब्डा कैसे चुनें।
  2. क्या मुझे किसी अन्य मॉडल को फिट करने के लिए गैर (?) चर का उपयोग करना चाहिए? मेरे मामले में मैं यथासंभव अधिक से अधिक चर रखना चाहूंगा।
  3. मैं पी-वैल्यू को कैसे जान सकता हूं, अर्थात कौन सा चर काफी प्रतिक्रिया की भविष्यवाणी करता है?

मैं अपने खराब सांख्यिकीय ज्ञान के लिए माफी माँगता हूँ! और किसी भी मदद के लिए धन्यवाद।


शायद CRAN पैकेज hdi पर एक नज़र है , कि एक उच्च आयामी मॉडल के लिए निष्कर्ष प्रदान करता है ...
टॉम Wenseleers

इस्तेमाल किए गए तरीकों की पूरी व्याख्या के लिए मैं आपको इस पत्र का संदर्भ देता हूं: projecteuclid.org/euclid.ss/1449670857
टॉम वेन्स्लेर्स

जवाबों:


40

यहाँ एक अकल्पनीय तथ्य है - आप वास्तव में ग्लैंनेट को लैम्ब्डा का एक भी मान देने वाले नहीं हैं। यहाँ प्रलेखन से :

लैम्ब्डा के लिए एक एकल मूल्य की आपूर्ति न करें (सीवी के बाद भविष्यवाणियों के लिए पूर्वानुमान के बजाय () के बजाय)। लाम्बा मूल्यों के घटते क्रम के बजाय आपूर्ति। glmnet अपनी गति पर निर्भर करता है गति के लिए शुरू होता है, और यह अक्सर एक एकल टी की गणना की तुलना में एक पूरे पथ के लिए तेजी से होता है।

cv.glmnetजैसा कि आपने अपने उदाहरणों में बताया, लैम्ब्डा को चुनने में आपकी मदद करेगा। ग्लमैनेट पैकेज के लेखक cv$lambda.1seइसके बजाय सुझाव देते हैं cv$lambda.min, लेकिन व्यवहार में मुझे बाद में सफलता मिली है।

Cv.glmnet चलाने के बाद, आपको glmnet को पुन: चलाने की आवश्यकता नहीं है! ग्रिड में प्रत्येक लैम्ब्डा ( cv$lambda) पहले से ही चलाया जा चुका है। इस तकनीक को "वार्म स्टार्ट" कहा जाता है और आप यहां इसके बारे में अधिक पढ़ सकते हैं । परिचय से Paraphrasing, वार्म स्टार्ट तकनीक एक अलग अनुकूलन समस्या के समाधान का उपयोग करके पुनरावृत्त तरीकों का समय कम कर देता है (जैसे, एक बड़े लैम्ब्डा के साथ glmnet) बाद में अनुकूलन समस्या के लिए शुरुआती मूल्य के रूप में (जैसे, एक छोटे लैम्ब्डा के साथ glmnet) )।

से वांछित रन निकालने के लिए cv.glmnet.fit, यह प्रयास करें:

small.lambda.index <- which(cv$lambda == cv$lambda.min)
small.lambda.betas <- cv$glmnet.fit$beta[, small.lambda.index]

संशोधन (1/28/2017)

Glmnet ऑब्जेक्ट को हैक करने की कोई आवश्यकता नहीं है जैसे मैंने ऊपर किया था; नीचे @ alex23lemm की सलाह लें और दोनों और s = "lambda.min", s = "lambda.1se"या किसी अन्य नंबर (जैसे, s = .007) को पास करें । ध्यान दें कि आपके गुणांक और भविष्यवाणियां इस मान पर निर्भर करती हैं जो क्रॉस सत्यापन द्वारा निर्धारित किया गया है। प्रजनन के लिए एक बीज का उपयोग करें! और भूल नहीं है कि अगर आप एक की आपूर्ति नहीं करते में और , आप के डिफ़ॉल्ट का उपयोग किया जाएगा । एक छोटी सी डेटा स्थिति में बेहतर काम करने के बाद मैंने उस डिफ़ॉल्ट को गर्म कर दिया है।coefpredict"s"coefpredicts = "lambda.1se"s = "lambda.1se"यह भी अधिक नियमितीकरण प्रदान करता है, इसलिए यदि आप अल्फ़ा> 0 के साथ काम कर रहे हैं, तो यह एक अधिक परमानेंट मॉडल की ओर भी जाएगा। तुम भी बीच में कहीं पाने के लिए plot.glmnet की मदद से एक संख्यात्मक मान का चयन कर सकते हैं (बस एक्स अक्ष से मानों का विस्तार करने के लिए मत भूलना!)।


1
धन्यवाद! यह मदद करता है ... क्या आपके पास 2 और 3 के सवालों का जवाब है?
एलिस

3
हा कोई चिंता नहीं। (।) का प्रतिनिधित्व शून्य है। जब से आप लास्सो के साथ गए हैं, आपने निर्दिष्ट किया है कि आप "विरल" समाधान चाहते हैं (यानी, बहुत सारे शून्य)। यदि आप उन सभी को मान देना चाहते हैं, तो अल्फा = 0. सेट करें। अब आप लासो से रिज रिग्रेशन पर चले गए हैं। पी-मान glmnet के लिए वैचारिक रूप से मुश्किल हैं। यदि आप उदाहरण के लिए "पी-वैल्यू फॉर लास्सो" सर्च करते हैं, तो आपको हालिया शोध और बहस दिखाई देगी। मैंने एक खाता (सोर्स एम्नेशिया) भी पढ़ा, जहां लेखक ने तर्क दिया कि पी-वैल्यू पक्षपाती रेजगारी जैसे कि लासो और रिज रिग्रेशन के लिए कोई मतलब नहीं है।
बेन ओगोरक

6
लैम्ब्डा के मान के साथ जुड़े गुणांक निकालने का एक वैकल्पिक तरीका जो न्यूनतम cvm देता है वह निम्न है:small.lambda.betas <- coef(cv, s = "lambda.min")
alex23lemm

1
@BenOgorek, उत्कृष्ट अद्यतन! एक अन्य उपयोगी संदर्भ फ्राइडमैन जे, हस्ती टी, होफलिंग एच, टिब्शिरानी आर। पाथवाइज समन्वय अनुकूलन है। वार्षिक सांख्यिकी के विवरण। 2007; 2 (1): 302-332। ( Arxiv.org/pdf/0708.1485.pdf )
dv_bn

1
@erosennin, cv.glmnet के लैम्ब्डा तर्क की जाँच करें: "वैकल्पिक उपयोगकर्ता द्वारा दिया गया लैम्बडा अनुक्रम; डिफ़ॉल्ट NULL है, और glmnet अपना स्वयं का अनुक्रम चुनता है।" आप वार्म स्टार्ट सिद्धांत का उपयोग करना चाहते हैं और जिस रेंज में आपकी रुचि है, उसे कम करने से पहले लैम्ब्डा के कुछ बड़े मूल्यों के साथ अनुक्रम शुरू करना चाहते हैं।
बेन ओगोरक

2

Q1) मुझे यकीन नहीं है कि लैम्ब्डा कैसे चुनें। Q2) क्या मुझे किसी अन्य मॉडल को फिट करने के लिए गैर (?) चर का उपयोग करना चाहिए? मेरे मामले में मैं यथासंभव अधिक से अधिक चर रखना चाहूंगा।

@ BenOgorek के महान जवाब के अनुसार, आमतौर पर आप फिटिंग को एक पूरे लैम्ब्डा अनुक्रम का उपयोग करने देते हैं, फिर जब इष्टतम गुणांक निकालते हैं तो लैम्ब्डा। 1 मान का उपयोग करें (जो आपने किया था उसके विपरीत)।

जब तक आप नीचे दिए गए तीन कैविटीज़ का पालन करते हैं, तब तक नियमितीकरण से नहीं लड़ते हैं या मॉडल को ट्वीक नहीं करते हैं: यदि कोई चर छोड़ा गया था, तो यह इसलिए था क्योंकि इसमें कम समग्र जुर्माना दिया गया था। केवेट हैं:

  1. नियमित रूप से गुणांक के सार्थक होने के लिए, सुनिश्चित करें कि आपने चर के अर्थ को स्पष्ट रूप से सामान्य कर दिया है और पहले से तय कर लिया है scale(); भरोसा मत करो glmnet(standardize=T)। औचित्य के लिए देखें क्या लैस्सो के समक्ष मानकीकरण वास्तव में आवश्यक है? ; मूल रूप से बड़े मूल्यों वाले एक चर को नियमितीकरण में गलत तरीके से दंडित किया जा सकता है।

  2. प्रतिलिपि प्रस्तुत करने योग्य होने के लिए, set.seedकई यादृच्छिक-बीजों के साथ चलाएं और स्थिरता के लिए नियमित गुणांक की जांच करें।

  3. यदि आप कम कठोर नियमितीकरण चाहते हैं अर्थात अधिक चर शामिल हैं, तो साधारण रिज के बजाय अल्फा <1 (यानी उचित लोचदार-नेट) का उपयोग करें। मेरा सुझाव है कि आप 0 से 1. तक अल्फा स्वीप करें। अगर आप ऐसा करने जा रहे हैं, तो हाइपरपरमेट अल्फा और रिग्रेशन त्रुटि से बचने के लिए, आपको क्रॉसवैलिडेशन का उपयोग करना होगा, अर्थात cv.glmnet()सरल के बजाय उपयोग करें glmnet():

for (alpha in c(0,.1,.3,.5,.7,.9,1)) {
  fit <- cv.glmnet(..., alpha=alpha, nfolds=...)
  # Look at the CVE at lambda.1se to find the minimum for this alpha value...
}

यदि आप सीवी के साथ इस तरह के एक ग्रिड को स्वचालित करना चाहते हैं, तो आप इसे स्वयं कोड कर सकते हैं या ग्लमैनेट के शीर्ष पर कैरेट पैकेज का उपयोग कर सकते हैं; caret यह अच्छी तरह से करता है। के लिए cv.glmnet nfoldsपैरामीटर मान, 3 (न्यूनतम) अगर आपके डेटासेट छोटा है, या 5 या 10 लेने अगर यह बड़ा है।

Q3) मैं पी-वैल्यू को कैसे जान सकता हूं, अर्थात कौन सा चर काफी प्रतिक्रिया की भविष्यवाणी करता है?

नहीं, वे सार्थक नहीं हैं । जैसा कि विस्तार से बताया गया है कि ग्लमैनेट मॉडल से प्रतिगमन गुणांक के लिए सांख्यिकीय सारांश जानकारी प्राप्त करना अनुचित क्यों है?

बस cv.glmnet()चर चयन को स्वचालित रूप से करने दें। ऊपर के केवेट के साथ। और निश्चित रूप से प्रतिक्रिया चर का वितरण सामान्य होना चाहिए (यह मानते हुए कि आप उपयोग कर रहे हैं family='gaussian')।


बहुत उपयोगी टिप्पणी के लिए धन्यवाद! मैंने यह भी अनुभव किया कि खुद को चर का मानकीकरण करने के बजाय glmnet (मानकीकृत = T) का उपयोग करने के लिए काम करने लगता है।
मिशेल

मेरे पास एक प्रश्न @smci है, हालांकि बीटा मान cvglmnet द्वारा लौटाए गए हैं। मैं समझता हूं कि वे प्रयास लैम्बडा मूल्यों के प्रत्येक ग्रिड बिंदु पर बीटा मान हैं। हालाँकि, प्रत्येक लैम्ब्डा मान के लिए बीटा मान लौटाए गए हैं (1) 10 गुना से औसत गुणांक मान (मैं 10foldCV का उपयोग करता हूं), (2) गुना से बीटा मान जो सर्वोत्तम सटीकता देता है, या (3) गुणांक से पूरे डेटासेट पर मॉडल को फिर से चलाना?
मिशेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.