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


15

मैं आर में पैकेज sklearnका उपयोग करके लॉजिस्टिक रिग्रेशन लाइब्रेरी से परिणामों की नकल करने की कोशिश कर रहा हूं glmnet

से sklearnरसद प्रतिगमन प्रलेखन , यह l2 दंड के अंतर्गत लागत समारोह को कम करने के प्रयास कर रहा है

minw,c12wटीw+सीΣमैं=1एनलॉग(exp(-yमैं(एक्समैंटीw+सी))+1)

के विगनेट्स से glmnet, इसका कार्यान्वयन थोड़ा अलग लागत फ़ंक्शन

मिनटβ,β0-[1एनΣमैं=1एनyमैं(β0+एक्समैंटीβ)-लॉग(1+(β0+एक्समैंटीβ))]+λ[(α-1)||β||22/2+α||β||1]

कुछ ट्वीक दूसरे समीकरण में, और सेटिंग से साथ , λ मिनट β , बीटा 0 1α=0

λमिनटβ,β01एनλΣमैं=1एन[-yमैं(β0+एक्समैंटीβ)+लॉग(1+(β0+एक्समैंटीβ))]+||β||22/2

जो sklearnकेवल एक कारक द्वारा लागत फ़ंक्शन से भिन्न होता है यदि सेट 1λ, इसलिए मुझे दो पैकेजों से समान गुणांक अनुमान की उम्मीद थी। लेकिन वे अलग हैं। मैं UCLA आईडीआरट्यूटोरियलसे डेटासेट का उपयोग कर रहा हूं,और उसकेआधार परभविष्यवाणीकर रहा हूं। 400 अवलोकन हैं, इसलिएC=1,λ=0.0025 के साथ1एनλ=सीadmitgregparankसी=1λ=0.0025

#python sklearn
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

model = LogisticRegression(fit_intercept = False, C = 1)
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]


> # R glmnet
> df = fread("https://stats.idre.ucla.edu/stat/data/binary.csv")
> X = as.matrix(model.matrix(admit~gre+gpa+as.factor(rank), data=df))[,2:6]
> y = df[, admit]
> mylogit <- glmnet(X, y, family = "binomial", alpha = 0)
> coef(mylogit, s = 0.0025)
6 x 1 sparse Matrix of class "dgCMatrix"
                    1
(Intercept)      -3.984226893
gre               0.002216795
gpa               0.772048342
as.factor(rank)2 -0.530731081
as.factor(rank)3 -1.164306231
as.factor(rank)4 -1.354160642

Rके रूप में देखा जा सकता है उत्पादन, किसी भी तरह नियमितीकरण के बिना रसद प्रतिगमन के करीब है यहाँ । क्या मैं कुछ याद कर रहा हूँ या कुछ गलत कर रहा हूँ?

अद्यतन: मैंने एक ही प्रक्रिया का संचालन करने के लिए LiblineaRपैकेज का उपयोग करने की भी कोशिश की R, और फिर liblinearभी अनुमानों का एक और अलग सेट मिला ( यह भी सॉल्वर है sklearn):

> fit = LiblineaR(X, y, type = 0, cost = 1)
> print(fit)
$TypeDetail
[1] "L2-regularized logistic regression primal (L2R_LR)"
$Type
[1] 0
$W
            gre          gpa as.factor(rank)2 as.factor(rank)3 as.factor(rank)4         Bias
[1,] 0.00113215 7.321421e-06     5.354841e-07     1.353818e-06      9.59564e-07 2.395513e-06

अद्यतन 2: में मानकीकरण बंद करना glmnet:

> mylogit <- glmnet(X, y, family = "binomial", alpha = 0, standardize = F)
> coef(mylogit, s = 0.0025)
6 x 1 sparse Matrix of class "dgCMatrix"
                     1
(Intercept)      -2.8180677693
gre               0.0034434192
gpa               0.0001882333
as.factor(rank)2  0.0001268816
as.factor(rank)3 -0.0002259491
as.factor(rank)4 -0.0002028832

क्या आपको इसका कभी पता चला?
ह्यूए

जवाबों:


8

स्केलेर के लॉजिस्टिक रिग्रेशन डिफ़ॉल्ट रूप से इनपुट को मानकीकृत नहीं करता है, जिससे इसका अर्थ बदल जाता है एल2नियमितीकरण शब्द; शायद glmnet करता है।

खासकर जब से आपका greशब्द अन्य चर की तुलना में इतने बड़े पैमाने पर है, इससे वज़न के लिए अलग-अलग चर का उपयोग करने की सापेक्ष लागत बदल जाएगी।

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


glmnetइनपुट के मानकीकरण को बंद करने की अनुमति देता है, लेकिन अनुमानित गुणांक और भी अलग हैं, कृपया ऊपर देखें। इसके अलावा, मैंने स्पष्ट रूप से इंटरसेप्ट शब्द को शामिल किया sklearnक्योंकि glmnetइसमें एक स्वचालित रूप से शामिल है, इसलिए यह सुनिश्चित करना है कि दोनों मॉडल का इनपुट समान हो।
१५:०५ पर मारिक २ hur

2
@hurrikale मुझे लगता है कि ग्लमैनेट शायद इंटरसेप्ट को नियमित नहीं कर रहा है, लेकिन स्केलेर है। से इंटरसेप्ट कॉलम ड्रॉप करें Xऔर fit_intercept=True(डिफ़ॉल्ट) पास करें LogisticRegression। वहाँ शायद कुछ और भी चल रहा है, यद्यपि।
डगल

मैंने कोशिश की है कि तुम क्या सुझाव दिया और अभी तक गुणांक के विभिन्न सेट है: [-1.873, -0.0606, -1.175, -1.378, 0.00182, 0.2435]के लिए sklearnऔर [-2.8181, 0.0001269, -0.0002259, -0.00020288, 0.00344, 0.000188]के लिए glmnetके क्रम में [Intercept, rank_2, rank_3, rank_4, gre, gpa]। मेरी चिंता यह है कि वे दोनों परिमाण में और सकारात्मक रूप से / नकारात्मक रूप से संभाव्यता को प्रभावित कर रहे हैं, इसलिए यह जाने बिना कि वे अलग क्यों हैं, यह व्याख्या करने के लिए किसी एक को चुनना मुश्किल है। और अगर किसी भी कार्यान्वयन में एक बग से कोई मौका मिलता है, तो यह विशेष रूप से महत्वपूर्ण है कि मुझे पता है कि किस पर भरोसा करना है।
२०:५० पर

7

डगल का उत्तर सही है, आप इंटरसेप्ट को नियमित करते हैं sklearnलेकिन आर में नहीं। सुनिश्चित करें कि आप solver='newton-cg'डिफ़ॉल्ट सोल्वर का उपयोग करें ( 'liblinear') हमेशा इंटरसेप्ट को नियमित करता है।

cf https://github.com/scikit-learn/scikit-learn/issues/6595


सेटिंग solver='newton-cg'से परिणाम sklearnऔर statsmodelsसुसंगत बने। बहुत बहुत धन्यवाद।
इरिने

0

आपको कॉल में L1_wt=0तर्क का भी उपयोग करना चाहिए ।alphafit_regularized()

इस कोड में statsmodels:

import statsmodels.api as sm
res = sm.GLM(y, X, family=sm.families.Binomial()).fit_regularized(alpha=1/(y.shape[0]*C), L1_wt=0)

निम्नलिखित कोड के बराबर है sklearn:

from sklearn import linear_model
clf = linear_model.LogisticRegression(C = C)
clf.fit(X, y)

आशा करता हूँ की ये काम करेगा!

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