LogisticRegression con GridSearchCV non convergente
Sto cercando di trovare i migliori parametri per una regressione logistica ma trovo che il "miglior stimatore" non converga.
C'è un modo per specificare che lo stimatore deve convergere per tenerne conto?
Ecco il mio codice.
# NO PCA
cv = GroupKFold(n_splits=10)
pipe = Pipeline([('scale', StandardScaler()),
('mnl', LogisticRegression(fit_intercept=True, multi_class="multinomial"))])
param_grid = [{'mnl__solver': ['newton-cg', 'lbfgs','sag', 'saga'],
'mnl__C':[0.5,1,1.5,2,2.5],
'mnl__class_weight':[None,'balanced'],
'mnl__max_iter':[1000,2000,3000],
'mnl__penalty':['l1','l2']}]
grid = GridSearchCV(estimator = pipe, param_grid=param_grid, scoring=scoring, n_jobs=-1, refit='neg_log_loss', cv=cv, verbose=2, return_train_score=True)
grid.fit(X, y, groups=data.groups)
# WITH PCA
pipe = Pipeline([(
('scale', StandardScaler()),
('pca', PCA())
('mnl', mnl)])
param_grid = [{'pca__n_components':[None,15,30,45,65]
'mnl__solver': ['newton-cg', 'lbfgs','sag', 'saga'],
'mnl__max_iter':[1000,2000,3000],
'mnl__C':[0.5,1,1.5,2,2.5],
'mnl__class_weight':[None,'balanced'],
'mnl__penalty':['l1','l2']}]
grid = GridSearchCV(estimator = pipe, param_grid=param_grid, scoring='neg_log_loss', n_jobs=-1, refit=True, cv=cv, verbose=2)
grid.fit(X, y, groups=data.groups)
Nel primo caso, il miglior stimatore trovato è con un solutore l2-lbfgs, con 1000 iterazioni, e converge. Il secondo, il miglior stimatore trovato, è con saga solver e penalità l1, 3000 iterazioni. Sento che abbia a che fare con il risolutore ... ma comunque, esiste un modo semplice per affermare che deve convergere per accettarlo al meglio?
Risposte
Non consiglierei di fare quel vincolo. La mancata convergenza del risolutore significa semplicemente che non ha raggiunto l'ottimale globale * entro la tolleranza specificata . Se stai ottenendo punteggi di convalida incrociata migliori, probabilmente dovresti essere "abbastanza vicino" a tale valore ottimale per non preoccupartene. Aumento max_iterper il refit, se lo desideri.
* (Nella regressione logistica la perdita è convessa, quindi c'è solo un ottimo globale, salvo caratteristiche collineari o separazione perfetta.)
Con uno spirito simile, non cercherò i solutori (tranne forse come un modo conveniente per gestire diversi solutori che sono in grado di utilizzare diverse penalità di regolarizzazione) o il numero massimo di iterazioni. Dopo aver corretto il tipo di regolarizzazione e la forza, ci sono coefficienti ottimali unici (di nuovo, salvo casi degeneri), e l'esecuzione di diversi risolutori dovrebbe produrre gli stessi risultati a meno che (1) il risolutore non vada in qualche modo fuori dai binari, o (2) la differenza di precisione causa alcuni differenza. E il numero di iterazioni dovrebbe essere impostato abbastanza alto da raggiungere la convergenza (notare che è il numero "massimo" di iterazioni; se un risolutore rientra nella sua tolleranza prima di questo, non continuerà a sbuffare).
Questo è più che probabile un problema con i tuoi dati non appropriati per questo approccio, piuttosto che il tuo codice non corretto. Soprattutto dal momento che non stai costruendo il tuo argento o altro, controllerei i tuoi dati in modo più approfondito.