Ich versuche, die Ergebnisse aus der sklearnlogistischen Regressionsbibliothek mit glmnetpackage in R zu duplizieren .
Aus der Dokumentation der sklearnlogistischen Regression geht es darum, die Kostenfunktion unter l2 Penalty
Ausgehend von den Vignetten von glmnetminimiert seine Implementierung eine geringfügig andere Kostenfunktion
Mit ein paar Änderungen in der zweiten Gleichung und durch Setzen von wird
was sich von der sklearnKostenfunktion nur um einen Faktor von wenn , also habe ich die gleiche Koeffizientenschätzung von den beiden Paketen erwartet. Aber sie sind unterschiedlich. Ich verwende den Datensatz von der UCLA idre Tutorial , die Vorhersage admitbasiert auf gre, gpaund rank. Es gibt 400 Beobachtungen, also mit , .
#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
Die RAusgabe kommt der logistischen Regression ohne Regularisierung in gewisser Weise nahe, wie hier zu sehen ist . Vermisse ich etwas oder mache ich offensichtlich etwas falsch?
Update: Ich habe auch versucht, LiblineaRpackage in Rzu verwenden, um denselben Prozess durchzuführen, und habe noch einen anderen Satz von Schätzungen erhalten ( liblinearist auch der Löser in 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
Update 2: Deaktivieren der Standardisierung in glmnetgibt:
> 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