Saya mencoba memahami mengapa output dari regresi logistik kedua perpustakaan ini memberikan hasil yang berbeda.
Saya menggunakan dataset dari tutorial idre UCLA , memprediksi admit
berdasarkan gre
, gpa
dan rank
. rank
diperlakukan sebagai variabel kategori, jadi pertama-tama dikonversi ke variabel dummy dengan rank_1
dijatuhkan. Kolom intersep juga ditambahkan.
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
Keluaran dari statsmodels
sama dengan yang ditunjukkan pada situs web idre, tapi saya tidak yakin mengapa scikit-learn menghasilkan set koefisien yang berbeda. Apakah ini meminimalkan beberapa fungsi kerugian yang berbeda? Apakah ada dokumentasi yang menyatakan implementasi?
sumber
glmnet
paket dalam R, tetapi tidak bisa mendapatkan koefisien yang sama. glmnet memiliki fungsi biaya yang sedikit berbeda dibandingkan dengan sklearn , tetapi bahkan jika saya setalpha=0
inglmnet
(artinya hanya menggunakan l2-penalti) dan set1/(N*lambda)=C
, saya masih belum mendapatkan hasil yang sama?glmnet
denganlambda
dan mengatur konstanta baru dalam font-kemungkinan log, yang1/(N*lambda)
sama dengan disklearn
, dua fungsi biaya menjadi identik, atau apakah saya kehilangan sesuatu?penalty='none'
.Perbedaan lainnya adalah Anda telah menyetel fit_intercept = False, yang secara efektif adalah model yang berbeda. Anda dapat melihat bahwa Statsmodel menyertakan intersep. Tidak memiliki intersepsi tentu saja mengubah bobot yang diharapkan pada fitur. Coba yang berikut dan lihat bagaimana perbandingannya:
model = LogisticRegression(C=1e9)
sumber