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?
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?