लॉजिस्टिक रिग्रेशन: स्किटिट वर्सेस स्टैटस्मॉडल


31

मैं यह समझने की कोशिश कर रहा हूं कि इन दो पुस्तकालयों के लॉजिस्टिक प्रतिगमन से आउटपुट अलग-अलग परिणाम क्यों देता है।

मैं UCLA आईडीआर ट्यूटोरियल के डेटासेट का उपयोग कर रहा हूं , और उसके admitआधार पर भविष्यवाणी कर रहा हूं । को श्रेणीबद्ध चर के रूप में माना जाता है, इसलिए इसे सबसे पहले गिराए गए डमी चर में परिवर्तित किया जाता है । एक इंटरसेप्ट कॉलम भी जोड़ा जाता है।gregparankrankrank_1

df = pd.read_csv("https://stats.idre.ucla.edu/stat/data/binary.csv")
y, X = dmatrices('admit ~ gre + gpa + C(rank)', df, return_type = 'dataframe')
X.head()
>  Intercept  C(rank)[T.2]  C(rank)[T.3]  C(rank)[T.4]  gre   gpa
0          1             0             1             0  380  3.61
1          1             0             1             0  660  3.67
2          1             0             0             0  800  4.00
3          1             0             0             1  640  3.19
4          1             0             0             1  520  2.93

# Output from scikit-learn
model = LogisticRegression(fit_intercept = False)
mdl = model.fit(X, y)
model.coef_
> array([[-1.35417783, -0.71628751, -1.26038726, -1.49762706,  0.00169198,
     0.13992661]]) 
# corresponding to predictors [Intercept, rank_2, rank_3, rank_4, gre, gpa]

# Output from statsmodels
logit = sm.Logit(y, X)
logit.fit().params
> Optimization terminated successfully.
     Current function value: 0.573147
     Iterations 6
Intercept      -3.989979
C(rank)[T.2]   -0.675443
C(rank)[T.3]   -1.340204
C(rank)[T.4]   -1.551464
gre             0.002264
gpa             0.804038
dtype: float64

इससे आउटपुट statsmodelsवैसा ही है जैसा कि आइड्रे वेबसाइट पर दिखाया गया है, लेकिन मुझे यकीन नहीं है कि क्यों scikit-learn गुणांक का एक अलग सेट तैयार करता है। क्या यह कुछ अलग नुकसान फ़ंक्शन को कम करता है? क्या कोई दस्तावेज है जो कार्यान्वयन को बताता है?

जवाबों:


28

यह पता लगाने के लिए आपका सुराग होना चाहिए कि स्किटिट-लर्न अनुमान से पैरामीटर का अनुमान स्टैटस्मॉडल समकक्ष की तुलना में परिमाण में समान रूप से छोटा है। इससे आपको विश्वास हो सकता है कि स्कोर-लर्न कुछ प्रकार के पैरामीटर नियमितीकरण पर लागू होता है। आप इसे स्कैनिट-लर्न डॉक्यूमेंटेशन पढ़कर पुष्टि कर सकते हैं ।

नियमित-शिक्षा में नियमितीकरण को बंद करने का कोई तरीका नहीं है, लेकिन ट्यूनिंग पैरामीटर Cको बड़ी संख्या में सेट करके आप इसे अप्रभावी बना सकते हैं । यहां बताया गया है कि आपके मामले में यह कैसे काम करता है:

# module imports
from patsy import dmatrices
import pandas as pd
from sklearn.linear_model import LogisticRegression
import statsmodels.discrete.discrete_model as sm

# read in the data & create matrices
df = pd.read_csv("http://www.ats.ucla.edu/stat/data/binary.csv")
y, X = dmatrices('admit ~ gre + gpa + C(rank)', df, return_type = 'dataframe')

# sklearn output
model = LogisticRegression(fit_intercept = False, C = 1e9)
mdl = model.fit(X, y)
model.coef_

# sm
logit = sm.Logit(y, X)
logit.fit().params

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद! इस नियमित परिणाम के साथ, मैं glmnetआर में पैकेज का उपयोग करके परिणाम की नकल करने की कोशिश कर रहा था , लेकिन समान गुणांक नहीं पा सका। glmnet एक अलग लागत समारोह की तुलना में है sklearn , लेकिन फिर भी अगर मैं सेट alpha=0में glmnet(जिसका अर्थ है केवल l2-दंड का उपयोग करें) और सेट 1/(N*lambda)=C, मैं अभी भी एक ही परिणाम नहीं मिलता है?
१३:१६ की

मेरे अंतर्ज्ञान है कि अगर मैं में लागत समारोह के दोनों पदों को विभाजित है glmnetद्वारा lambdaऔर लॉग-संभावना के फ़ॉन्ट में नया निरंतर है, जो सेट 1/(N*lambda)में करने के लिए बराबर sklearnहै, दो लागत कार्यों समान हो जाते हैं, या मैं कुछ याद आ रही है?
१३:१६ की

@hurrikale एक नया प्रश्न पूछें और इसे यहां लिंक करें, और मैं देखूंगा।
tchakravarty

धन्यवाद! मैंने यहाँ प्रश्न पोस्ट किया ।
१६:१६ की प्रातः

मुझे लगता है कि स्किटिट-लर्न में नियमितीकरण को बंद करने का सबसे अच्छा तरीका सेटिंग है penalty='none'
नजब्बू

3

एक और अंतर यह है कि आपने fit_intercept = False सेट किया है, जो प्रभावी रूप से एक अलग मॉडल है। आप देख सकते हैं कि Statsmodel में इंटरसेप्ट शामिल है। एक अवरोधन नहीं होने से निश्चित रूप से सुविधाओं पर अपेक्षित भार बदल जाता है। निम्नलिखित का प्रयास करें और देखें कि यह कैसे तुलना करता है:

model = LogisticRegression(C=1e9)

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