चर चयन के लिए R में लार्स (या ग्लमैनेट) पैकेज से LASSO का उपयोग करना


39

क्षमा करें यदि यह प्रश्न थोड़ा बुनियादी आता है।

मैं आर में कई रैखिक प्रतिगमन मॉडल के लिए LASSO चर चयन का उपयोग करना चाह रहा हूं। मेरे पास 15 भविष्यवक्ता हैं, जिनमें से एक श्रेणीबद्ध है (क्या इससे कोई समस्या हो सकती है?)। अपना और सेट करने के बाद मैं निम्नलिखित कमांड का उपयोग करता हूं:xy

model = lars(x, y)
coef(model)

मेरी समस्या है जब मैं उपयोग करता हूं coef(model)। यह 15 पंक्तियों के साथ एक मैट्रिक्स लौटाता है, जिसमें हर बार एक अतिरिक्त भविष्यवक्ता जोड़ा जाता है। हालांकि इसमें कोई सुझाव नहीं है कि किस मॉडल को चुनना है। क्या मुझे कुछ याद आया? क्या कोई तरीका है जिससे मैं सिर्फ एक " सर्वश्रेष्ठ " मॉडल वापस करने के लिए लार्स पैकेज प्राप्त कर सकता हूं ?

glmnetइसके बजाय अन्य पोस्ट का उपयोग करने का सुझाव है लेकिन यह अधिक जटिल लगता है। एक ही और का उपयोग करते हुए एक प्रयास इस प्रकार है । क्या मुझे यहाँ कुछ याद आया है: " xy

cv = cv.glmnet(x, y)
model = glmnet(x, y, type.gaussian="covariance", lambda=cv$lambda.min)
predict(model, type="coefficients")

अंतिम आदेश मेरे चर की सूची देता है, बहुसंख्यक गुणांक के साथ हालांकि कुछ = 0 हैं। क्या यह LASSO द्वारा चुने गए " सर्वश्रेष्ठ " मॉडल का सही विकल्प है ? यदि मैं तब अपने सभी चर के साथ एक रेखीय मॉडल फिट करता हूं जिसमें गुणांक थे जो not=0मुझे बहुत समान हैं, लेकिन थोड़ा अलग, गुणांक अनुमान है। क्या इस अंतर का कोई कारण है? क्या LASSO द्वारा चुने गए इन चरों के साथ रैखिक मॉडल को परिष्कृत करना और मेरे अंतिम मॉडल के रूप में लेना स्वीकार्य होगा? अन्यथा मैं महत्व के लिए कोई पी-वैल्यू नहीं देख सकता। क्या मुझे कुछ याद आया?

कर देता है

type.gaussian="covariance" 

सुनिश्चित करें कि glmnetकई रैखिक प्रतिगमन का उपयोग करता है?

क्या चरों का स्वचालित सामान्यीकरण गुणांक को बिल्कुल प्रभावित करता है? क्या LASSO प्रक्रिया में इंटरैक्शन शब्द शामिल करने का कोई तरीका है?

मैं इस प्रक्रिया को एक प्रदर्शन के रूप में अधिक उपयोग करना चाह रहा हूं कि कैसे LASSO का उपयोग किसी भी मॉडल के लिए किया जा सकता है जो वास्तव में किसी भी महत्वपूर्ण अनुमान / भविष्यवाणी के लिए उपयोग किया जाएगा यदि वह कुछ भी बदलता है।

इसे पढ़ने के लिए समय निकालने के लिए शुक्रिया। LASSO / lars / glmnet पर किसी भी सामान्य टिप्पणी की भी बहुत सराहना की जाएगी।


4
एक साइड कमेंट के रूप में, यदि आप व्याख्या करना चाहते हैं तो परिणाम निश्चित होना चाहिए कि लैस्सो द्वारा चुने गए चर के सेट स्थिर हैं। यह मोंटे कार्लो सिमुलेशन का उपयोग करके या अपने स्वयं के डेटासेट को बूटस्ट्रैप करके किया जा सकता है।
फ्रैंक हरेल

जवाबों:


28

Http://web.stanford.edu/~hastie/glmnet/glmnet_alpha.html (आप CRAN पैकेज पृष्ठ की भी जांच कर सकते हैं) glmnetमें इसके उत्कृष्ट विगनेट के लिए धन्यवाद प्राप्त करने के बाद इसका उपयोग करना वास्तव में आसान है । के लिए सबसे अच्छा लंबो के लिए , अंगूठे के नियम का उपयोग करना हैglmnet

cvfit <- glmnet::cv.glmnet(x, y)
coef(cvfit, s = "lambda.1se")

के बजाय lambda.min

larsतुम्हारे लिए वही करना है जो हाथ से करना है। यहाँ मेरा समाधान है

cv <- lars::cv.lars(x, y, plot.it = FALSE, mode = "step")
idx <- which.max(cv$cv - cv$cv.error <= min(cv$cv))
coef(lars::lars(x, y))[idx,]

ध्यान रखें कि यह बिल्कुल समान नहीं है, क्योंकि यह किसी बिंदु पर बजाय एक लासो गाँठ (जब एक चर में प्रवेश करता है) पर रुक रहा है।

कृपया ध्यान दें कि glmnetअब पसंदीदा पैकेज है, इसे सक्रिय रूप से बनाए रखा जाता है, इससे भी अधिक lars, और इससे पहले कि glmnetबनाम larsउत्तर के बारे में प्रश्न किए गए हैं (एल्गोरिदम का उपयोग भिन्न होता है)।

चर का चयन करने और फिर ओएलएस फिट करने के लिए लासो का उपयोग करने के आपके प्रश्न के लिए, यह एक सतत बहस है। ओएलएस के लिए Google ने लासो को पोस्ट किया और इस विषय पर चर्चा करने वाले कुछ पेपर हैं। यहां तक ​​कि एलिमेंट्स ऑफ स्टैटिस्टिकल लर्निंग के लेखक भी इसे स्वीकार करते हैं।

संपादित करें : यहां अधिक सटीक रूप से पुन: पेश करने के लिए कोड है जो glmnetइसमें करता हैlars

  cv <- lars::cv.lars(x, y, plot.it = FALSE)
  ideal_l1_ratio <- cv$index[which.max(cv$cv - cv$cv.error <= min(cv$cv))]
  obj <- lars::lars(x, y)
  scaled_coefs <- scale(obj$beta, FALSE, 1 / obj$normx)
  l1 <- apply(X = scaled_coefs, MARGIN = 1, FUN = function(x) sum(abs(x)))
  coef(obj)[which.max(l1 / tail(l1, 1) > ideal_l1_ratio),]

+1 शानदार जवाब! क्या आप या कोई भी संभवतः इस बात पर विस्तार से बता सकता है कि मेमने की बजाय मेमने का शासन क्यों है।
इरोसिनिन

यह लिखने के 4 साल बाद (और थोड़ी देर के लिए लसो का उपयोग नहीं करने पर) मेरी याददाश्त बस गायब हो गई। माफ़ कीजिये!
जुआनसेंट्रो

8

मैं कुछ समय पहले से इस सवाल पर लौट रहा हूं क्योंकि मुझे लगता है कि मैंने सही समाधान निकाल लिया है।

यहाँ mtcars डेटासेट का उपयोग करके एक प्रतिकृति दी गई है:

library(glmnet)
`%ni%`<-Negate(`%in%')
data(mtcars)

x<-model.matrix(mpg~.,data=mtcars)
x=x[,-1]

glmnet1<-cv.glmnet(x=x,y=mtcars$mpg,type.measure='mse',nfolds=5,alpha=.5)

c<-coef(glmnet1,s='lambda.min',exact=TRUE)
inds<-which(c!=0)
variables<-row.names(c)[inds]
variables<-variables[variables %ni% '(Intercept)']

'चर' आपको उन चर की सूची देता है जो सबसे अच्छा समाधान हल करते हैं।


1
मैं कोड को देख रहा था और मुझे पता चला कि "परीक्षण" को अभी तक परिभाषित नहीं किया गया था और इसलिए कोड: "अंतिम.सूची <-testing [-स्मार्टेड] #removing वैरिएबल" त्रुटि देता है: ऑब्जेक्ट नहीं मिला इसलिए कोड को देख रहा हूं मान लीजिए कि "परीक्षण" का उपयोग करने के बजाय इसे "cp.list" का उपयोग किया जाना चाहिए ताकि कोड होगा: final.list <-cp.list [-removed] #removing चर final.list <-c (final.list) डुप्लिकेट) उन वार्स जो दोनों तो हटा दिया गया है जोड़ा में # जोड़ना बाद में मुझे पता है कि अगर यह सही है सधन्यवाद चलो

3
`% नी%` <-Negate ( `% नी%`); ## गलत लग रहा है। जबकि `% नी%` <-नेगेट (`%` में `); ## सही लग रहा है। मुझे लगता है कि स्टैकएक्सचेंज फॉर्मेटर ने इसे गड़बड़ कर दिया ...
क्रिस

क्या आप विस्तृत कर सकते हैं कि आपने कैसे चुना nfolds=5और alpha=0.5मापदंडों को?
कॉलिन

7

शायद फॉरवर्ड सिलेक्शन स्टेप वाइज रिग्रेशन के साथ तुलना करने में मदद मिलेगी (लेखकों के लिए http://www-stat.stanford.edu/~tibs/lasso/simple.html में से किसी एक साइट का निम्न लिंक देखें))। यह सांख्यिकीय अधिगम के अध्याय 3.4.4 में प्रयुक्त दृष्टिकोण है (मुफ्त में ऑनलाइन उपलब्ध)। मैंने सोचा था कि उस किताब के अध्याय 3.6 में कम से कम वर्गों, सर्वश्रेष्ठ सबसेट, और लास्सो (प्लस अन्य प्रक्रियाओं के एक जोड़े) के बीच संबंधों को समझने में मदद मिली। मुझे गुणांक, t (कॉफ़ (मॉडल)) और राइट.एससीवी के ट्रांसफ़ॉर्म लेने में भी मदद मिलती है, ताकि मैं इसे एक्सेल में खोल सकता हूं और साथ में प्लॉट (मॉडल) की एक कॉपी भी। आप अंतिम कॉलम को क्रमबद्ध करना चाहते हैं, जिसमें कम से कम वर्गों का अनुमान है। फिर आप स्पष्ट रूप से देख सकते हैं कि प्रत्येक टुकड़े के चरण में प्रत्येक चर कैसे जोड़ा जाता है और परिणामस्वरूप गुणांक कैसे बदलता है। बेशक यह पूरी कहानी नहीं है, लेकिन उम्मीद है कि यह एक शुरुआत होगी।


3

larsऔर glmnetकच्चे मैट्रिस पर काम करते हैं। बातचीत की शर्तों को शामिल करने के लिए, आपको स्वयं मैट्रिसेस का निर्माण करना होगा। इसका मतलब है कि प्रति इंटरैक्शन का एक स्तंभ (जो आपके कारक होने पर प्रति स्तर प्रति कारक है)। में देखो lm()देखने के लिए कि यह कैसे यह करता है (चेतावनी: वहाँ ड्रेगन हो)।

इसे अभी करने के लिए, कुछ ऐसा करें: मैन्युअल रूप से एक इंटरैक्शन शब्द बनाने के लिए, आप कर सकते हैं (लेकिन शायद नहीं , क्योंकि यह धीमा है):

int = D["x1"]*D["x2"]
names(int) = c("x1*x2")
D = cbind(D, int)

फिर इसे लार्स में उपयोग करने के लिए (यह मानते हुए कि आपके पास एक yकिकिंग है):

lars(as.matrix(D), as.matrix(y))

काश मैं अन्य प्रश्नों के साथ आपकी अधिक मदद कर पाता। मैंने यह पाया क्योंकि लार्स मुझे दुःख दे रहा है और इसमें और वेब पर प्रलेखन बहुत पतला है।


2
"चेतावनी: ड्रेगन हो" यह बहुत आसान है model.matrix()
ग्रेगोर

2

LARS ENTIRE समाधान पथ को हल करता है। समाधान पथ टुकड़े-टुकड़े में रैखिक है - "पायदान" अंक (यानी, नियमितीकरण पैरामीटर के मान) की एक परिमित संख्या है, जिस पर समाधान बदलता है।

तो आपके द्वारा प्राप्त किए जा रहे समाधानों के मैट्रिक्स सभी संभव समाधान हैं। जिस सूची में वह लौटता है, उसे आपको नियमितीकरण पैरामीटर के मान भी देने चाहिए।


आपके उत्तर के लिए धन्यवाद। क्या नियमितीकरण पैरामीटर के मूल्यों को प्रदर्शित करने का एक तरीका है? इसके अतिरिक्त इस पैरामीटर के आधार पर समाधानों के बीच चयन करने का एक तरीका है? (पैरामीटर लैम्बडा भी है?)
जेम्स

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