आर में लैस्सो प्रतिगमन को वैधता क्रॉस करें


10

आर फ़ंक्शन cv.glm (पुस्तकालय: बूट) सामान्यीकृत रैखिक मॉडल के लिए अनुमानित K- गुना क्रॉस-सत्यापन भविष्यवाणी त्रुटि की गणना करता है और डेल्टा लौटाता है। क्या यह लस्सो रिग्रेशन (पुस्तकालय: ग्लमनेट) के लिए इस फ़ंक्शन का उपयोग करने के लिए समझ में आता है और यदि हां, तो इसे कैसे किया जा सकता है? Glmnet लाइब्रेरी सर्वश्रेष्ठ टर्निंग पैरामीटर प्राप्त करने के लिए क्रॉस-वेलिडेशन का उपयोग करता है, लेकिन मुझे ऐसा कोई उदाहरण नहीं मिला, जो अंतिम glmnet समीकरण को क्रॉस-वैरिफाई करता हो।


2
यह निश्चित रूप से समझ में आता है, और यद्यपि LASSO केवल एक (हाइपर) पैरामीटर पर अनुकूलन करता है, यदि आप सबसे अच्छा अनुमान प्राप्त करना चाहते हैं तो आप आउट-ऑफ-सैंपल प्रदर्शन कर सकते हैं, जिसके लिए आपको बाहरी क्रॉस-सत्यापन लूप की आवश्यकता होती है। देखें कर सकते हैं overfit प्रशिक्षण शिक्षण सीवी का उपयोग कर / बूटस्ट्रैप एल्गोरिदम द्वारा? और उद्धृत कागजात।
Scortchi - को पुनः स्थापित मोनिका

यह glm esp के बजाय glmnet का उपयोग करने के लिए अनुशंसित है। यदि आप सीवी कर रहे हैं। अगर मुझे याद है, तो glm पैकेज उपयोग करने के लिए दर्दनाक हो जाता है। इसके अलावा, cv.glmnet cv.glm से अधिक मापदंडों को उजागर करता है।
3

जवाबों:


9

डेटा सेट glmnetपर लैस्सो के लिए वैनिला सादे क्रॉस-सत्यापन कैसे करें, इस पर एक उदाहरण mtcars

  1. लोड डेटा सेट।

  2. सुविधाएँ (स्वतंत्र चर) तैयार करें। उन्हें matrixवर्ग का होना चाहिए । dfश्रेणीबद्ध चर युक्त युक्तियों को बदलने का सबसे आसान तरीका matrixहै model.matrix। डिफ़ॉल्ट रूप से glmnetइंटरसेप्ट को ध्यान में रखें, इसलिए आप मॉडल मैट्रिक्स से बेहतर इंटरसेप्ट स्ट्रिप करेंगे।

  3. प्रतिक्रिया (आश्रित चर) तैयार करें। चलो ऊपर की कारों को औसत mpg('1') और बाकी को अकुशल ('0') के रूप में कोड करते हैं। इस चर को कारक में बदलें।

  4. के माध्यम से क्रॉस-सत्यापन चलाएँ cv.glmnet। यह alpha=1डिफ़ॉल्ट glmnetमापदंडों से पिकअप करेगा , जो आपने पूछा है: लासो रिग्रेशन।

  5. क्रॉस-वैलिडेशन के आउटपुट की जांच करने से आपको कम से कम 2 टुकड़ों में रुचि हो सकती है:

    • लैम्ब्डा, जो क्रॉस-वैरिफाइड त्रुटि को कम करता है। glmnetवास्तव में 2 लैम्ब्डा प्रदान करता है: lambda.minऔर lambda.1se। यह आपका निर्णय कॉल एक प्रैक्टिसिंग सांख्यिकीविद् के रूप में है जिसे उपयोग करना है।

    • जिसके परिणामस्वरूप नियमित रूप से गुणांक होते हैं।

कृपया उपरोक्त निर्देशों के अनुसार R कोड देखें:

# Load data set
data("mtcars")

# Prepare data set 
x   <- model.matrix(~.-1, data= mtcars[,-1])
mpg <- ifelse( mtcars$mpg < mean(mtcars$mpg), 0, 1)
y   <- factor(mpg, labels = c('notEfficient', 'efficient'))

library(glmnet)

# Run cross-validation
mod_cv <- cv.glmnet(x=x, y=y, family='binomial')

mod_cv$lambda.1se
[1] 0.108442

coef(mod_cv, mod_cv$lambda.1se)
                     1
(Intercept)  5.6971598
cyl         -0.9822704
disp         .        
hp           .        
drat         .        
wt           .        
qsec         .        
vs           .        
am           .        
gear         .        
carb         .  

mod_cv$lambda.min
[1] 0.01537137

coef(mod_cv, mod_cv$lambda.min)
                      1
(Intercept)  6.04249733
cyl         -0.95867199
disp         .         
hp          -0.01962924
drat         0.83578090
wt           .         
qsec         .         
vs           .         
am           2.65798203
gear         .         
carb        -0.67974620

अंतिम टिप्पणियाँ:

  • ध्यान दें, मॉडल का आउटपुट गुणांक के सांख्यिकीय महत्व, केवल मूल्यों के बारे में कुछ नहीं कहता है।

  • l1 दंड (lasso), जो आपने मांगा था, अस्थिरता के लिए कुख्यात है जैसा कि इस ब्लॉग पोस्ट और इस स्टैकएक्सचेंज प्रश्न में स्पष्ट है । एक बेहतर तरीका यह भी हो सकता है alphaकि आप एल -1 और एल 2 पेनल्टीज़रों के उचित मिश्रण पर निर्णय लें।

  • क्रॉस-वैलिडेशन करने का एक वैकल्पिक तरीका है कैरेट की ओर मुड़ना train( ... method='glmnet')

  • और अंत में, इसके बारे में अधिक जानने का सबसे अच्छा तरीका है cv.glmnetऔर यह डिफॉल्ट से आ रहा glmnetहै बेशक ?glmnetआर के कंसोल में है))


अच्छा उत्तर। .. यह भी कई बार CV चलाने और त्रुटि वक्र (देखें? cv.glmnet) नमूना लेने के लिए खाते में औसत के लायक है।
user20650

@SergeyBushmanov बहुत उपयोगी!
theforestecologist

नमस्ते, मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैं आपसे एक सवाल पूछना चाहता था। आप उल्लेख करते हैं कि मॉडल का आउटपुट गुणांक के सांख्यिकीय महत्व के बारे में कुछ नहीं कहता है, इसलिए आप यह कैसे निर्धारित करते हैं कि वे महत्वपूर्ण हैं या नहीं?
जून जंग

@JunJang "गुणांक के लिए कोई सांख्यिकीय महत्व नहीं है" पैकेज के लेखकों का बयान है, न कि मैं। यह कथन दिया गया है, मुझे बिल्कुल याद नहीं है, या तो पैकेज लेखकों की पुस्तक में या पैकेज के विगनेट में से एक में। ऐसे मामले में, गुणांक को महत्वपूर्ण कहने या न कहने के बजाय, आप कहेंगे कि वे क्रॉस सत्यापन के माध्यम से लक्ष्य को समझाने में "उपयोगी" हैं या नहीं।
सर्गेई बुशमैनोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.