एक उदाहरण: बाइनरी परिणाम के लिए ग्लासो का उपयोग करते हुए LASSO प्रतिगमन


77

मैं LASSO रिग्रेशन के glmnetसाथ उपयोग करने से वंचित होना शुरू कर रहा हूं, जहां मेरी रुचि के परिणाम द्विगुणित हैं । मैंने नीचे एक छोटा सा नकली डाटा फ्रेम बनाया है:

age     <- c(4, 8, 7, 12, 6, 9, 10, 14, 7) 
gender  <- c(1, 0, 1, 1, 1, 0, 1, 0, 0)
bmi_p   <- c(0.86, 0.45, 0.99, 0.84, 0.85, 0.67, 0.91, 0.29, 0.88)
m_edu   <- c(0, 1, 1, 2, 2, 3, 2, 0, 1)
p_edu   <- c(0, 2, 2, 2, 2, 3, 2, 0, 0)
f_color <- c("blue", "blue", "yellow", "red", "red", "yellow", "yellow", 
             "red", "yellow")
asthma  <- c(1, 1, 0, 1, 0, 0, 0, 1, 1)
# df is a data frame for further use!
df <- data.frame(age, gender, bmi_p, m_edu, p_edu, f_color, asthma)

उपरोक्त डेटासेट में कॉलम (चर) निम्नानुसार हैं:

  • age (वर्षों में बच्चे की उम्र) - निरंतर
  • gender - बाइनरी (1 = पुरुष; 0 = महिला)
  • bmi_p (बीएमआई पर्सेंटाइल) - निरंतर
  • m_edu )
  • p_edu (पिता उच्चतम शिक्षा स्तर) - क्रमिक (m_edu के समान)
  • f_color (पसंदीदा प्राथमिक रंग) - नाममात्र ("नीला", "लाल", या "पीला")
  • asthma (बाल अस्थमा की स्थिति) - बाइनरी (1 = अस्थमा; 0 = कोई अस्थमा)

इस उदाहरण के लक्ष्य को 6 संभावित भविष्यवक्ता चर (की सूची में से एक मॉडल की भविष्यवाणी बच्चे अस्थमा स्थिति बनाने के लिए LASSO का उपयोग करना है age, gender, bmi_p, m_edu, p_edu, और f_color)। जाहिर है कि नमूना आकार यहां एक मुद्दा है, लेकिन मैं इस बात की अधिक जानकारी हासिल करने की उम्मीद कर रहा हूं कि glmnetफ्रेम के भीतर विभिन्न प्रकार के चर (यानी, निरंतर, क्रमिक, नाममात्र और बाइनरी) को कैसे संभालना है जब परिणाम द्विआधारी होता है (1 = अस्थमा ; 0 = अस्थमा नहीं)।

इस प्रकार, क्या कोई Rअस्थमा की स्थिति की भविष्यवाणी करने के लिए उपरोक्त डेटा के साथ LASSO का उपयोग करके इस नकली उदाहरण के लिए स्पष्टीकरण के साथ एक नमूना स्क्रिप्ट प्रदान करने के लिए तैयार है ? हालांकि बहुत बुनियादी, मुझे पता है कि मैं, और सीवी पर कई अन्य लोगों की संभावना है, यह बहुत सराहना करेगा!


2
आप अधिक भाग्य मिल सकता है अगर आप एक के रूप में डेटा तैनात dputएक की वास्तविक आर वस्तु; पाठकों को ठंढा करने के साथ-साथ आपको केक बनाने के लिए मत डालें! यदि आप R में उपयुक्त डेटा फ्रेम उत्पन्न करते हैं foo, तो सवाल करें कि आउटपुट में क्या सवाल है dput(foo)
गैविन सिम्पसन

धन्यवाद @GavinSimpson! मैंने एक डेटा फ्रेम के साथ पोस्ट को अपडेट किया, इसलिए उम्मीद है कि मुझे बिना ठंढ के कुछ केक खाने को मिलेंगे! :)
मैट रेइचेनबाक

2
BMI प्रतिशतक का उपयोग करके आप एक तरह से भौतिकी के नियमों को धता बता रहे हैं। मोटापा शारीरिक माप (लंबाई, मात्रा, वजन) के अनुसार व्यक्तियों को प्रभावित करता है न कि कितने व्यक्ति वर्तमान विषय के समान हैं, जो कि प्रतिशतता कर रहा है।
फ्रैंक हरेल

3
मैं सहमत हूं, बीएमआई प्रतिशत एक मीट्रिक नहीं है जिसे मैं उपयोग करना पसंद करता हूं; हालाँकि, CDC दिशानिर्देश 20 वर्ष से कम उम्र के बच्चों और किशोरों के लिए BMI के ऊपर BMI प्रतिशतक (अत्यधिक संदेहास्पद मीट्रिक!) का उपयोग करने की सलाह देते हैं क्योंकि यह ऊंचाई और वजन के अलावा उम्र और लिंग को ध्यान में रखते हैं। इन सभी चर और डेटा मूल्यों को इस उदाहरण के लिए पूरी तरह से सोचा गया था। यह उदाहरण मेरे किसी भी वर्तमान कार्य को प्रतिबिंबित नहीं करता है क्योंकि मैं बड़े डेटा के साथ काम करता हूं। मैं बस glmnetएक द्विआधारी परिणाम के साथ कार्रवाई में एक उदाहरण देखना चाहता था ।
1948 में मैट रेइचेनबाक

पैट्रिक Breheny द्वारा एक पैकेज के लिए यहां प्लग करें ncvreg जिसे MCP, SCAD, या LASSO द्वारा दंडित रैखिक और लॉजिस्टिक प्रतिगमन मॉडल फिट बैठता है। ( cran.r-project.org/web/packages/ncvreg/index.html )
bdeonovic

जवाबों:


100
library(glmnet)

age     <- c(4, 8, 7, 12, 6, 9, 10, 14, 7) 
gender  <- as.factor(c(1, 0, 1, 1, 1, 0, 1, 0, 0))
bmi_p   <- c(0.86, 0.45, 0.99, 0.84, 0.85, 0.67, 0.91, 0.29, 0.88) 
m_edu   <- as.factor(c(0, 1, 1, 2, 2, 3, 2, 0, 1))
p_edu   <- as.factor(c(0, 2, 2, 2, 2, 3, 2, 0, 0))
f_color <- as.factor(c("blue", "blue", "yellow", "red", "red", "yellow", 
                       "yellow", "red", "yellow"))
asthma <- c(1, 1, 0, 1, 0, 0, 0, 1, 1)

xfactors <- model.matrix(asthma ~ gender + m_edu + p_edu + f_color)[, -1]
x        <- as.matrix(data.frame(age, bmi_p, xfactors))

# Note alpha=1 for lasso only and can blend with ridge penalty down to
# alpha=0 ridge only.
glmmod <- glmnet(x, y=as.factor(asthma), alpha=1, family="binomial")

# Plot variable coefficients vs. shrinkage parameter lambda.
plot(glmmod, xvar="lambda")

यहाँ छवि विवरण दर्ज करें

श्रेणीबद्ध चर आमतौर पर पहले कारकों में बदल जाते हैं, फिर भविष्यवाणियों का एक डमी चर मैट्रिक्स बनाया जाता है और निरंतर भविष्यवक्ताओं के साथ मॉडल को पारित किया जाता है। ध्यान रखें, glmnet रिज और लासो दंड दोनों का उपयोग करता है, लेकिन इसे या तो अकेले सेट किया जा सकता है।

कुछ परिणाम:

# Model shown for lambda up to first 3 selected variables.
# Lambda can have manual tuning grid for wider range.

glmmod
# Call:  glmnet(x = x, y = as.factor(asthma), family = "binomial", alpha = 1) 
# 
#        Df    %Dev   Lambda
#   [1,]  0 0.00000 0.273300
#   [2,]  1 0.01955 0.260900
#   [3,]  1 0.03737 0.249000
#   [4,]  1 0.05362 0.237700
#   [5,]  1 0.06847 0.226900
#   [6,]  1 0.08204 0.216600
#   [7,]  1 0.09445 0.206700
#   [8,]  1 0.10580 0.197300
#   [9,]  1 0.11620 0.188400
#  [10,]  3 0.13120 0.179800
#  [11,]  3 0.15390 0.171600
# ...

गुणांक को ग्लोमॉड से निकाला जा सकता है। यहाँ 3 चरों के साथ दिखाया गया है।

coef(glmmod)[, 10]
#   (Intercept)           age         bmi_p       gender1        m_edu1 
#    0.59445647    0.00000000    0.00000000   -0.01893607    0.00000000 
#        m_edu2        m_edu3        p_edu2        p_edu3    f_colorred 
#    0.00000000    0.00000000   -0.01882883    0.00000000    0.00000000 
# f_coloryellow 
#   -0.77207831 

अंत में, लैंबदा का चयन करने के लिए क्रॉस सत्यापन का भी उपयोग किया जा सकता है।

cv.glmmod <- cv.glmnet(x, y=asthma, alpha=1)
plot(cv.glmmod)

यहाँ छवि विवरण दर्ज करें

(best.lambda <- cv.glmmod$lambda.min)
# [1] 0.2732972

4
यह वही है जो मैं +1 की तलाश में था, मेरे पास केवल 1 प्रश्न हैं) आप 0.2732972 के क्रॉस सत्यापन लंबो के साथ क्या कर सकते हैं? और 2) ग्लोमॉड से, चयनित चर पसंदीदा रंग (पीला), लिंग, और पिता की शिक्षा (स्नातक की डिग्री) हैं? बहुत बहुत धन्यवाद!
मैट रीचेनबाक

4
1) क्रॉस सत्यापन का उपयोग लैम्ब्डा और गुणांक (न्यूनतम त्रुटि पर) चुनने के लिए किया जाता है। इस मॉकअप में, कोई स्थानीय मंत्री नहीं है (बहुत कम अवलोकन से संबंधित एक चेतावनी भी थी); मैं व्याख्या करता हूं कि सभी गुणांक संकोचन दंड के साथ शून्य तक सिकुड़ गए थे (सर्वश्रेष्ठ मॉडल में केवल अवरोधन है) और अधिक (वास्तविक) टिप्पणियों के साथ फिर से चलाएं और हो सकता है कि लैम्ब्डा रेंज बढ़ाएं। 2) हां, उस उदाहरण में जहां मैंने कॉफ़ (ग्लैमोड) [, 10] चुना है ... आप सीवी या परिणामों की व्याख्या के माध्यम से मॉडल के लिए लैम्ब्डा चुनते हैं। क्या आप हल कर सकते हैं यदि आपको लगा कि मैंने आपका प्रश्न हल कर दिया है? धन्यवाद।
पैट

2
क्या मैं पूछ सकता हूं कि यह f_colorचर को कैसे संभालता है ? क्या कारक स्तर 1 से 4 एक बड़ा कदम माना जाता है कि 1 से 2, या ये सभी समान रूप से भारित, गैर-दिशात्मक और श्रेणीबद्ध हैं? (मैं इसे सभी
अनियंत्रित

3
लाइन xfactors <- model.matrix(asthma ~ gender + m_edu + p_edu + f_color)[,-1]कोड वेरिएबल वेरिएबल f_color (जैसा as.factorकि पिछली लाइनों द्वारा घोषित किया गया है)। जब तक कि contrasts.argतर्क की आपूर्ति नहीं हो जाती , तब तक उसे डिफ़ॉल्ट आर डमी चर कोडिंग का उपयोग करना चाहिए । इसका मतलब यह है कि f_color के सभी स्तर समान रूप से भारित और गैर दिशात्मक हैं, पहले वाले को छोड़कर जो कि संदर्भ वर्ग के रूप में उपयोग किया जाता है और अवरोधन में अवशोषित होता है।
एलेक्स

1
@ एलेक्स model.matrix(asthma ~ gender + m_edu + p_edu + f_color + age + bmi_p)[, -1]ऊपर की दो पंक्तियों के समान परिणाम नहीं देगा? क्यों निरंतर चर के साथ एक अतिरिक्त कदम का उपयोग करें data.frame?
जिग्गंजर

6

मैं पैकेज एनेट का उपयोग करूंगा, क्योंकि यह मेरी पूर्वनिर्मित विधि है। यह थोड़ा अधिक लचीला है।

install.packages('elasticnet')
library(elasticnet)

age <- c(4,8,7,12,6,9,10,14,7) 
gender <- c(1,0,1,1,1,0,1,0,0)
bmi_p <- c(0.86,0.45,0.99,0.84,0.85,0.67,0.91,0.29,0.88)
m_edu <- c(0,1,1,2,2,3,2,0,1)
p_edu <- c(0,2,2,2,2,3,2,0,0)
#f_color <- c("blue", "blue", "yellow", "red", "red", "yellow", "yellow", "red", "yellow")
f_color <- c(0, 0, 1, 2, 2, 1, 1, 2, 1)
asthma <- c(1,1,0,1,0,0,0,1,1)
pred <- cbind(age, gender, bmi_p, m_edu, p_edu, f_color)



enet(x=pred, y=asthma, lambda=0)

4
साझा करने के लिए धन्यवाद elasticnet; हालाँकि, मुझे नहीं पता कि उपरोक्त Rस्क्रिप्ट से आउटपुट क्या बनाना है । क्या आप स्पष्ट कर सकते हैं? अग्रिम में धन्यवाद!
मैट रीचेनबाक ऑक्ट

4

बस पैट द्वारा प्रदान किए गए उत्कृष्ट उदाहरण पर विस्तार करने के लिए। मूल समस्या ने ऑर्डिनल वैरिएबल (m_edu, p_edu) को स्तरों के बीच एक अंतर्निहित क्रम के साथ रखा (0 <1 <2 <3)। पैट के मूल उत्तर में, मुझे लगता है कि उनके बीच कोई आदेश नहीं होने के साथ इनको नाममात्र श्रेणीबद्ध चर के रूप में माना जाता था। मैं गलत हो सकता हूं, लेकिन मेरा मानना ​​है कि इन चरों को ऐसे कोडित किया जाना चाहिए कि मॉडल उनके अंतर्निहित क्रम का सम्मान करता है। यदि इन्हें ऑर्डर किए गए कारकों के रूप में कोडित किया जाता है (बल्कि पैट के जवाब में अनियंत्रित कारकों के बजाय) तो glmnet थोड़ा अलग परिणाम देता है ... मुझे लगता है कि नीचे दिए गए कोड में क्रमबद्ध चर को आदेशित कारकों के रूप में शामिल किया गया है, और यह थोड़ा अलग परिणाम देता है:

library(glmnet)

age     <- c(4, 8, 7, 12, 6, 9, 10, 14, 7) 
gender  <- as.factor(c(1, 0, 1, 1, 1, 0, 1, 0, 0))
bmi_p   <- c(0.86, 0.45, 0.99, 0.84, 0.85, 0.67, 0.91, 0.29, 0.88) 
m_edu   <- factor(c(0, 1, 1, 2, 2, 3, 2, 0, 1), 
                  ordered = TRUE)
p_edu   <- factor(c(0, 2, 2, 2, 2, 3, 2, 0, 0), 
                  levels = c(0, 1, 2, 3), 
                  ordered = TRUE)
f_color <- as.factor(c("blue", "blue", "yellow", "red", "red", 
                       "yellow", "yellow", "red", "yellow"))
asthma <- c(1, 1, 0, 1, 0, 0, 0, 1, 1)

xfactors <- model.matrix(asthma ~ gender + m_edu + p_edu + f_color)[, -1]
x        <- as.matrix(data.frame(age, bmi_p, xfactors))

# Note alpha=1 for lasso only and can blend with ridge penalty down to
# alpha=0 ridge only.
glmmod <- glmnet(x, y=as.factor(asthma), alpha=1, family="binomial")

# Plot variable coefficients vs. shrinkage parameter lambda.
plot(glmmod, xvar="lambda")

यहाँ छवि विवरण दर्ज करें


1
कभी-कभी_सच्ची, अच्छी पकड़ - यह शिक्षा स्तर के चर को मॉडल करने के लिए अधिक उपयुक्त तरीका होगा। आपके सहयोग के लिए धन्यवाद।
मैट रीचेनबाक

चर के लिए एक कथानक कथा को कैसे जोड़ा जाएगा? उदाहरण के लिए लाल रेखा क्या है?
जिग्गंजर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.