2012-10-05 4 views
11

मैं क्रॉस-सत्यापन द्वारा सर्वोत्तम मॉडल का चयन करने के लिए sklearn से LaasoCV का उपयोग कर रहा हूं। मैंने पाया कि यदि मैं sklearn या matlab सांख्यिकीय टूलबॉक्स का उपयोग करता हूं तो क्रॉस सत्यापन अलग-अलग परिणाम देता है।sklearn (पायथन) और matlab सांख्यिकीय पैकेज में LASSO क्यों अलग हैं?

मैं matlab का इस्तेमाल किया और उदाहरण http://www.mathworks.se/help/stats/lasso-and-elastic-net.html में दिए गए दोहराने इस

enter image description here

तब मैं matlab डेटा सहेजा तरह एक आंकड़ा पाने के लिए, और sklearn से laaso_path साथ आंकड़ा दोहराने की कोशिश की, मैं मिल गया

enter image description here

हालांकि इन दो आंकड़ों के बीच कुछ समानताएं हैं, कुछ अंतर भी हैं। जहां तक ​​मैं matlab और alphasklearn में पैरामीटर lambda को समझता हूं, हालांकि इस आंकड़े में ऐसा लगता है कि कुछ अंतर हैं। क्या कोई यह बता सकता है कि कौन सा सही है या क्या मुझे कुछ याद आ रहा है? इसके अलावा प्राप्त गुणांक भी अलग हैं (जो मेरी मुख्य चिंता है)।

मैटलैब कोड:

rng(3,'twister') % for reproducibility 
X = zeros(200,5); 
for ii = 1:5 
     X(:,ii) = exprnd(ii,200,1); 
end 
r = [0;2;0;-3;0]; 
Y = X*r + randn(200,1)*.1; 

save randomData.mat % To be used in python code 

[b fitinfo] = lasso(X,Y,'cv',10); 
lassoPlot(b,fitinfo,'plottype','lambda','xscale','log'); 

disp('Lambda with min MSE') 
fitinfo.LambdaMinMSE 
disp('Lambda with 1SE') 
fitinfo.Lambda1SE 
disp('Quality of Fit') 
lambdaindex = fitinfo.Index1SE; 
fitinfo.MSE(lambdaindex) 
disp('Number of non zero predictos') 
fitinfo.DF(lambdaindex) 
disp('Coefficient of fit at that lambda') 
b(:,lambdaindex) 

अजगर कोड:

import scipy.io 
import numpy as np 
import pylab as pl 
from sklearn.linear_model import lasso_path, LassoCV 

data=scipy.io.loadmat('randomData.mat') 
X=data['X'] 
Y=data['Y'].flatten() 

model = LassoCV(cv=10,max_iter=1000).fit(X, Y) 
print 'alpha', model.alpha_ 
print 'coef', model.coef_ 

eps = 1e-2 # the smaller it is the longer is the path 
models = lasso_path(X, Y, eps=eps) 
alphas_lasso = np.array([model.alpha for model in models]) 
coefs_lasso = np.array([model.coef_ for model in models]) 

pl.figure(1) 
ax = pl.gca() 
ax.set_color_cycle(2 * ['b', 'r', 'g', 'c', 'k']) 
l1 = pl.semilogx(alphas_lasso,coefs_lasso) 
pl.gca().invert_xaxis() 
pl.xlabel('alpha') 
pl.show() 
+0

द्वारा कई अल्फा की जरूरत है मैं सिर्फ मैं इसी तरह के निष्कर्षों को याद करते हैं जब वास्तविक डेटा पर काम कर कह सकते हैं। Matlab परिणाम अलग थे और काफी बेहतर थे। हालांकि, मैंने इस समस्या को बहुत गहराई से नहीं देखा है, हालांकि। – Bitwise

उत्तर

2

यह संभव है कि alpha = lambda/n_samples
जहां में n_samples = X.shape[0] scikit सीखने

एक और टिप्पणी है कि आपका पथ बहुत टुकड़ा नहीं है क्योंकि यह/होना चाहिए। टोल को कम करने और max_iter बढ़ने पर विचार करें।

आशा है कि यह मदद करता है

+0

मुझे लगता है कि यह मुद्दा सामान्यीकरण से अधिक है। मैंने उपरोक्त की कोशिश की और अभी भी अलग वक्र प्राप्त हुए। इसके अलावा, पार सत्यापन द्वारा प्राप्त गुणांक बहुत अलग हैं। – imsc

+0

यह अभी भी मुझे पैरामीटरकरण समस्या की तरह दिखता है: 2 घटता समान दिखता है लेकिन एक्स अक्ष पर स्थानांतरित होता है। विज्ञान अंतरिक्ष में अल्फा पर एक बचाव - लॉग स्पेस में लिया गया सीखने से इसका कारण बन सकता है। विज्ञान-शिक्षा में उपयोग किए गए पैरामीटर का उपयोग [दस्तावेज़ीकरण] (http://scikit-learn.org/stable/modules/linear_model.html#lasso) में दिया गया है। आप एक ही वितरण से अधिक डेटा उत्पन्न कर सकते हैं और एक रिग्रेशन स्कोर (उदाहरण के लिए निर्धारण आर^2 या आरएमएसई का गुणांक) की गणना कर सकते हैं और जांच सकते हैं कि अल्फा का इष्टतम मान अल्फा के क्रॉस मान्य मान के करीब पाया जाता है। – ogrisel

+0

@imsc ने आपने 'अल्फा = लैम्ब्डा/(2 * एक्स। शेप [0])' के साथ प्रयास किया है? – ogrisel

-1

हालांकि मैं क्या समस्या का कारण है यह पता लगाने में असमर्थ हूँ, वहाँ जिसमें जारी रखने के लिए एक तार्किक दिशा है।

  • Mathworks एक उदाहरण का चयन किया और उनके दस्तावेज में इसे शामिल करने
  • आपका matlab कोड वास्तव में उदाहरण के रूप में परिणाम पैदा करता है का फैसला किया है:

    ये तथ्य हैं।

  • वैकल्पिक परिणाम से मेल नहीं खाता है, और यह मेरी धारणा है अतीत

में गलत परिणाम प्रदान की गई है:

  • संभावना है कि mathworks उनके दस्तावेज में एक गलत उदाहरण डाल करने के लिए चुना है इस उदाहरण की तुलना में एक वैकल्पिक तरीके से प्रजनन सही परिणाम नहीं देता है की तुलना में उपेक्षित है।

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

+0

यह एक तकनीक को दूसरे पर विज्ञापन देने के लिए एक बहुत ही कमजोर तर्क है। sklearn भी उदाहरण प्रदान करते हैं। क्या यह matlab कोड द्वारा पुनरुत्पादित किया जाएगा? वास्तव में LASSO एक निश्चित परिभाषित एल्गोरिदम की तुलना में सॉल्वर की एक वर्ग की तरह है। तो यह अधिक संभावना है कि एल्गोरिदम थोड़ा अलग है। यह बताते हुए कि आपके तर्कों के आधार पर विज्ञान-शिक्षा विश्वसनीय नहीं है, वह काफी कठोर है। –

+0

मैं इसे लागू नहीं करना चाहता था, मैंने थोड़ा सा स्पष्ट होने के लिए थोड़ा सा जवाब दोहराया है। –

+0

उत्तर के लिए धन्यवाद। 'scikit-learn' वास्तव में एक अच्छी तरह से लागू मॉड्यूल है। हालांकि दस्तावेज और उदाहरणों में अभी भी कमी है जो उपरोक्त समस्या का कारण बनती है। मैं उचित सामान्यीकरण द्वारा इस मुद्दे को हल कर सकता हूं। – imsc

2

मेरे पास matlab नहीं है लेकिन सावधान रहें कि क्रॉस-सत्यापन के साथ प्राप्त मूल्य अस्थिर हो सकता है। ऐसा इसलिए है क्योंकि यह नमूने को उप-विभाजित करने के तरीके से प्रभावित होता है।

यदि आप पाइथन में क्रॉस-सत्यापन 2 गुना चलाते हैं तो भी आप 2 अलग-अलग परिणाम प्राप्त कर सकते हैं। इस उदाहरण पर विचार करें:

kf=sklearn.cross_validation.KFold(len(y),n_folds=10,shuffle=True) 
cv=sklearn.linear_model.LassoCV(cv=kf,normalize=True).fit(x,y) 
print cv.alpha_ 
kf=sklearn.cross_validation.KFold(len(y),n_folds=10,shuffle=True) 
cv=sklearn.linear_model.LassoCV(cv=kf,normalize=True).fit(x,y) 
print cv.alpha_ 

0.00645093258722 
0.00691712356467 
0

मैं जानता हूँ कि यह एक पुरानी धागा है, लेकिन:

मैं वास्तव में (आर में) glmnet से LassoCV के लिए खत्म हो पाइप पर काम कर रहा हूँ, और मैंने पाया कि LassoCV नहीं करता ' पहले एक्स मैट्रिक्स को सामान्यीकृत करने के साथ बहुत अच्छी तरह से करें (भले ही आप पैरामीटर normalize = True निर्दिष्ट करें)।

LassoCV का उपयोग करते समय पहले एक्स मैट्रिक्स को सामान्य करने का प्रयास करें।

, यदि यह एक पांडा वस्तु है

(X - X.mean())/X.std() 

ऐसा लगता है तुम भी 2

संबंधित मुद्दे