Sto cercando di duplicare i risultati dalla sklearnlibreria di regressione logistica usando il glmnetpacchetto in R.
Dalla documentazione sullasklearn regressione logistica , sta cercando di minimizzare la funzione di costo sotto penalità l2
Dalle vignette di glmnet, la sua implementazione riduce al minimo una funzione di costo leggermente diversa
Con qualche modifica nella seconda equazione e impostando ,
che differisce dalla sklearnfunzione di costo solo per un fattore di se impostato , quindi mi aspettavo la stessa stima del coefficiente dai due pacchetti. Ma sono diversi. Sto usando il set di dati da UCLA Idre esercitazione , predicendo admitbasa sulla gre, gpae rank. Ci sono 400 osservazioni, quindi con , .
#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
L' Routput è in qualche modo vicino alla regressione logistica senza regolarizzazione, come si può vedere qui . Mi sto perdendo qualcosa o sto facendo qualcosa ovviamente sbagliato?
Aggiornamento: ho anche provato a usare il LiblineaRpacchetto Rper condurre lo stesso processo, eppure ho ottenuto un'altra serie di stime ( liblinearè anche il risolutore 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
Aggiornamento 2: disattivando la standardizzazione in si glmnetottiene:
> 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