Lojistik Regresyon: Scikit Learn - Statsmodels'i öğrenin


31

Bu iki kütüphanenin lojistik regresyonundan elde edilen çıkışın neden farklı sonuçlar verdiğini anlamaya çalışıyorum.

Veri setini UCLA idre öğreticisinden kullanıyorum , ve admitdayanarak tahmin ediyorum . kategorik değişken olarak kabul edilir, bu nedenle ilk önce bırakılan kukla değişkene dönüştürülür . Bir engelleme sütunu da eklenir.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

Çıktı statsmodelsidre web sitesinde gösterilenle aynıdır, ancak neden scikit-learn'ın farklı bir katsayılar kümesi ürettiğinden emin değilim. Bazı farklı kayıp fonksiyonlarını en aza indirir mi? Uygulamayı belirten herhangi bir belge var mı?

Yanıtlar:


28

Bunu çözme ipucunuz, scikit-learning tahmininden elde edilen parametre tahminlerinin, istatistik modellerine göre eşit büyüklükte olması gerektiğidir. Bu, sizi scikit-learn'ın bir tür parametre düzenlemesi uyguladığına inanmanıza neden olabilir. Bunu, scikit-learn belgelerini okuyarak onaylayabilirsiniz .

Scikit-learn'da düzenlileştirmeyi kapatmanın bir yolu yoktur, ancak ayarlama parametresini Cçok sayıya ayarlayarak etkisiz hale getirebilirsiniz . İşte sizin durumunuzda nasıl çalıştığı:

# 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

Açıklama için çok teşekkür ederim! Bu düzenli sonuçla, sonucu glmnetR'deki paketi kullanarak kopyalamaya çalıştım , ancak aynı katsayıyı alamadım. glmnet karşılaştırarak biraz daha farklı bir maliyet işlevi vardır sklearn ama set bile alpha=0içinde glmnetve set (sadece l2-ceza kullanmak anlamına gelir) 1/(N*lambda)=C, hala aynı sonucu alamadım?
Hurrikale

Sezgim ben maliyet fonksiyonunun her iki terimi bölmek eğer olmasıdır glmnettarafından lambdave bir log-olasılığının yazı yeni sabit, set 1/(N*lambda)o in eşit sklearn, iki maliyet fonksiyonları özdeş hale veya bir şey eksik?
Hurrikale

@hurrikale Yeni bir soru sor ve buraya bağla, ben de bir göz atacağım.
tchakravarty

Teşekkürler! Soruyu buraya postaladım .
Hurrikale

Bence, scikit-learn'da normalleşmeyi kapatmanın en iyi yolu, ayar yapmaktır penalty='none'.
Nzbuu

3

Başka bir fark, fit_intercept = False ayarını ayarlamanızdır, bu da farklı bir modeldir. Statsmodel'in kesişimi içerdiğini görebilirsiniz. Bir engellemenin olmaması kesinlikle özellikler üzerindeki beklenen ağırlıkları değiştirir. Aşağıdakileri deneyin ve nasıl karşılaştığını görün:

model = LogisticRegression(C=1e9)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.