Ich versuche zu verstehen, warum die Ergebnisse der logistischen Regression dieser beiden Bibliotheken unterschiedliche Ergebnisse liefern.
Ich verwende den Datensatz von der UCLA idre Tutorial , die Vorhersage admit
basiert auf gre
, gpa
und rank
. rank
wird als kategoriale Variable behandelt, daher wird sie zuerst mit rank_1
drop in eine Dummy-Variable konvertiert . Eine Abfangspalte wird ebenfalls hinzugefügt.
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
Die Ausgabe von statsmodels
ist dieselbe wie auf der idre-Website, aber ich bin nicht sicher, warum scikit-learn einen anderen Satz von Koeffizienten erzeugt. Minimiert es eine andere Verlustfunktion? Gibt es eine Dokumentation, in der die Implementierung angegeben ist?
quelle
glmnet
Pakets in R zu duplizieren , konnte jedoch nicht den gleichen Koeffizienten erhalten. glmnet hat eine etwas andere Kostenfunktion zu vergleichen sklearn , aber selbst wenn ich gesetztalpha=0
inglmnet
(dh nur l2-Strafe verwenden) und Set1/(N*lambda)=C
, ich das gleiche Ergebnis immer noch nicht bekommen?glmnet
durch teilelambda
und die neue Konstante in der Schriftart der Log-Wahrscheinlichkeit einstelle, die1/(N*lambda)
gleich der in istsklearn
, die beiden Kostenfunktionen identisch werden, oder fehlt mir etwas?penalty='none'
.Ein weiterer Unterschied ist, dass Sie fit_intercept = False gesetzt haben, was praktisch ein anderes Modell ist. Sie können sehen, dass Statsmodel den Achsenabschnitt enthält. Wenn Sie keinen Achsenabschnitt haben, ändern sich die erwarteten Gewichte für die Features. Probieren Sie Folgendes aus und sehen Sie, wie es verglichen wird:
model = LogisticRegression(C=1e9)
quelle