LogisticRegression com GridSearchCV não convergindo
Estou tentando encontrar os melhores parâmetros para uma regressão logística, mas acho que o "melhor estimador" não converge.
Existe uma maneira de especificar que o estimador precisa convergir para levá-lo em consideração?
Aqui está meu código.
# 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)
No primeiro caso, o melhor estimador encontrado é com um solucionador l2-lbfgs, com 1000 iterações, e ele converge. O segundo, o melhor estimador encontrado é com o solucionador de saga e penalidade l1, 3.000 iterações. Eu sinto que tem a ver com o solucionador ... mas de qualquer forma, existe uma maneira direta de afirmar que tem que convergir para aceitá-lo da melhor forma?
Respostas
Eu não aconselharia fazer essa restrição. A falha do solucionador em convergir significa apenas que ele não atingiu o ótimo global * dentro da tolerância especificada . Se você está obtendo melhores pontuações na validação cruzada, provavelmente deve estar "perto o suficiente" desse valor ideal para não se preocupar com isso. Aumente max_iterpara o reequipamento, se desejar.
* (Na regressão logística, a perda é convexa, portanto, há apenas um ótimo global, exceto recursos colineares ou separação perfeita.)
Com um espírito semelhante, eu não pesquisaria solucionadores (exceto talvez como uma maneira conveniente de lidar com diferentes solucionadores sendo capazes de usar diferentes penalidades de regularização), ou número máximo de iterações. Depois de fixar o tipo de regularização e força, há coeficientes ideais únicos (novamente, exceto casos degenerados), e a execução de diferentes solucionadores deve produzir os mesmos resultados, a menos que (1) o solucionador saia dos trilhos de alguma forma, ou (2) a diferença na precisão cause alguns diferença. E o número de iterações deve ser definido alto o suficiente para alcançar a convergência (observe que é o número "máximo" de iterações; se um solucionador ficar dentro de sua tolerância antes disso, ele não continuará trabalhando).
É mais do que provável que seja um problema de seus dados não serem apropriados para essa abordagem, em vez de seu código estar incorreto. Especialmente porque você não está construindo sua própria prata ou qualquer coisa, eu realmente verificaria seus dados mais detalhadamente.