GLMNET से परिवर्तनीय महत्व


18

मैं लस्सो का उपयोग सुविधाओं के चयन के लिए एक विधि के रूप में देख रहा हूं और द्विआधारी लक्ष्य के साथ एक भविष्य कहनेवाला मॉडल फिटिंग के लिए कर रहा हूं। नीचे कुछ कोड है जो मैं नियमित लॉजिस्टिक प्रतिगमन के साथ विधि को आज़माने के लिए खेल रहा था।

मेरा सवाल यह है कि क्या मुझे "महत्वपूर्ण" चर का एक समूह मिलता है लेकिन क्या मैं प्रत्येक के सापेक्ष महत्व का अनुमान लगाने के लिए इन्हें क्रमबद्ध करने में सक्षम हूं? क्या गुणांक को निरपेक्ष मान द्वारा रैंक के इस उद्देश्य के लिए मानकीकृत किया जा सकता है (मैं समझता हूं कि उन्हें coefफ़ंक्शन के माध्यम से मूल चर पैमाने पर दिखाया गया है )? यदि हां, तो ऐसा कैसे करें (x और y के मानक विचलन का उपयोग करके) मानकीकरण प्रतिगमन गुणांक

नमूना कोड:

    library(glmnet)

    #data comes from

#http://archive.ics.uci.edu/ml/datasets/Breast+Cancer+Wisconsin+(Diagnostic)

    datasetTest <- read.csv('C:/Documents and Settings/E997608/Desktop/wdbc.data.txt',head=FALSE)


#appears to use the first level as the target success
   datasetTest$V2<-as.factor(ifelse(as.character(datasetTest$V2)=="M","0","1"))


#cross validation to find optimal lambda
#using the lasso because alpha=1

    cv.result<-cv.glmnet(       
              x=as.matrix(dataset[,3:ncol(datasetTest)]),
              y=datasetTest[,2],        
              family="binomial",        
              nfolds=10,        
              type.measure="deviance",       
              alpha=1      
              )

#values of lambda used

    histogram(cv.result$lambda)

#plot of the error measure (here was deviance)
#as a CI from each of the 10 folds
#for each value of lambda (log actually)

    plot(cv.result) 

#the mean cross validation error (one for each of the
#100 values of lambda

    cv.result$cvm

#the value of lambda that minimzes the error measure
#result: 0.001909601

    cv.result$lambda.min
    log(cv.result$lambda.min)

#the value of lambda that minimzes the error measure
#within 1 SE of the minimum
#result: 0.007024236

    cv.result$lambda.1se

#the full sequence was fit in the object called cv.result$glmnet.fit
#this is same as a call to it directly.
#here are the coefficients from the min lambda

    coef(cv.result$glmnet.fit,s=cv.result$lambda.1se)

जवाबों:


14

जहां तक ​​मुझे पता है कि ग्लमैनेट प्रतिगमन गुणांक की मानक त्रुटियों की गणना नहीं करता है (क्योंकि यह चक्रीय समन्वय वंश का उपयोग करके मॉडल मापदंडों को फिट बैठता है)। इसलिए, यदि आपको मानकीकृत प्रतिगमन गुणांक की आवश्यकता है, तो आपको कुछ अन्य विधि (जैसे glm) का उपयोग करने की आवश्यकता होगी

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

उम्मीद है की यह मदद करेगा..


2
धन्यवाद। मेरा मानना ​​है कि मूल पैमाने पर कोएफ़ को वापस कर दिया गया है। तो एक को उन्हें फिर से स्केल करने की आवश्यकता होगी (मैं उदाहरण के लिए पोस्ट की गई तकनीक का उपयोग करके मान लेता हूं)।
B_Miner

user6129 सही है! आपको चयनित चर की रैंकिंग का कोई साधन नहीं मिलता है। यह अनुसंधान का एक सक्रिय क्षेत्र है।
सनकूलू

3
@B_Miner: आप सही हैं, यदि "मानकीकृत = सही" के साथ कहा जाता है, तो glmnet मूल पैमाने पर गुणांक देता है। इसके चारों ओर जाने का एक तरीका यह है कि व्याख्यात्मक चरों को बाहर से मानकीकृत किया जाए (उदाहरण के लिए "स्केल ()" फ़ंक्शन) का उपयोग करके और "मानकीकृत = FALSE" के साथ ग्लमनेट को कॉल करें। परिणामस्वरूप गुणांक को उनके महत्व को आंकने के लिए परिमाण द्वारा रैंक किया जा सकता है।
येवगेनी

@suncoolsu: pls मेरे अद्यतन किए गए उत्तर को देखें
येवगेनी

@Yevgeny मेरा एक सवाल है। फिर तकनीकी रूप से, क्या प्रदर्शन परिणाम (जैसे वक्र के नीचे का क्षेत्र) समान होना चाहिए चाहे हम 'मानकीकृत = FALSE' सेट करें और चर खुद को मानकीकृत करें या हम सिर्फ 'मानकीकृत = सही' का उपयोग करें? (केवल बीटा-गुणांक लौटाए गए अलग होंगे)। यह वही है जो मैं सैद्धांतिक रूप से सोचता हूं, लेकिन व्यवहार में, मुझे 'मानकीकृत = सही' का उपयोग करने पर थोड़ा बेहतर परिणाम मिलता है। इसलिए, दोनों गुणांक और प्रदर्शन अलग हैं। क्या यह कैसा होना चाहिए?
मिशेल

7

एक स्थान में गुणांक प्राप्त करने के लिए जो आपको सीधे उनके महत्व की तुलना करने देता है, आपको उन्हें मानकीकृत करना होगा। लॉजिस्टिक रिग्रेशन गुणांक के मानकीकरण पर चर्चा करने के लिए मैंने थिंकलैब पर एक नोट लिखा ।

(बहुत) लंबी कहानी छोटी, मैं उपयोग करने की सलाह देता हूं अग्रीस्टी विधि :

# if X is the input matrix of the glmnet function,
# and cv.result is your glmnet object:
sds <- apply(X, 2, sd)
cs <- as.matrix(coef(cv.result, s = "lambda.min"))
std_coefs <- coefs[-1, 1] * sds

यदि आप glmnet (डिफ़ॉल्ट विकल्प standardize = TRUE) द्वारा आंतरिक मानकीकरण पर भरोसा करते हैं , तो ये मानकीकृत गुणांक वास्तव में फिटिंग कदम के परिणामस्वरूप होते हैं, मूल स्थान में glmnet द्वारा पुनर्प्राप्ति से पहले ( एक और नोट :-) देखें )।


2
std_coefs <- coefs[-1, 1] * sds
b=bσx

एंटोनी - क्या आप इस बात की पुष्टि कर सकते हैं कि गुणा और भाग सही नहीं है?
B_Miner

1
σx+bx+=+(bσx)(xμ)/σx+bσx=एक्स

हां, यह एक टाइपो है (फिर भी कोड को चलाने के बिना उदाहरणों को टाइप करने के लिए एक और अनुस्मारक; ;-)) इसे पकड़ने के लिए धन्यवाद, यह तय हो गया है।
एंटोनी लिजी

यह सही मानकीकृत गुणांक देता है, चाहे glmnetवस्तु का निर्माण किया गया हो standardize = TRUEया standardize = FALSE, हाँ?
जेम्स हिर्स्चोर्न
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.