Pregunta Cómo obtener resultados comparables y reproducibles de LogisticRegressionCV y GridSearchCV


Quiero marcar diferentes clasificadores con diferentes parámetros.

Para aceleración en LogisticRegression yo suelo LogisticRegressionCV (que al menos 2 veces más rápido) y planifique el uso GridSearchCV para otros.

Pero problema mientras me da igual C parámetros, pero no el AUC ROC tanteo.

Voy a tratar de corregir muchos parámetros como scorer, random_state, solver, max_iter, tol... Mire el ejemplo (los datos reales no tienen importancia):

Datos de prueba y parte común:

from sklearn import datasets
boston = datasets.load_boston()
X = boston.data
y = boston.target
y[y <= y.mean()] = 0; y[y > 0] = 1

import numpy as np
from sklearn.cross_validation import KFold
from sklearn.linear_model import LogisticRegression
from sklearn.grid_search import GridSearchCV
from sklearn.linear_model import LogisticRegressionCV

fold = KFold(len(y), n_folds=5, shuffle=True, random_state=777)

GridSearchCV

grid = {
    'C': np.power(10.0, np.arange(-10, 10))
     , 'solver': ['newton-cg']
}
clf = LogisticRegression(penalty='l2', random_state=777, max_iter=10000, tol=10)
gs = GridSearchCV(clf, grid, scoring='roc_auc', cv=fold)
gs.fit(X, y)

print ('gs.best_score_:', gs.best_score_)

gs.best_score_: 0.939162082194

LogisticRegressionCV

searchCV = LogisticRegressionCV(
    Cs=list(np.power(10.0, np.arange(-10, 10)))
    ,penalty='l2'
    ,scoring='roc_auc'
    ,cv=fold
    ,random_state=777
    ,max_iter=10000
    ,fit_intercept=True
    ,solver='newton-cg'
    ,tol=10
)
searchCV.fit(X, y)

print ('Max auc_roc:', searchCV.scores_[1].max())

Max auc_roc: 0.970588235294

Solver newton-cg utilizado solo para proporcionar un valor fijo, otros también lo intentaron. Lo que olvidé?

PD En ambos casos también recibí una advertencia "/usr/lib64/python3.4/site-packages/sklearn/utils/optimize.py:193: UserWarning: Falló la búsqueda de línea   warnings.warn ('Búsqueda de línea fallida')"que no puedo entender también. Seré feliz si alguien también describe lo que significa, pero espero que no sea relevante para mi pregunta principal.

EDITAR ACTUALIZACIONES

Por @joeln comment agregar max_iter = 10000 y tol = 10 parámetros también. No cambia el resultado en ningún dígito, pero la advertencia desapareció.


7
2018-03-28 21:04


origen


Respuestas:


Aquí hay una copia del respuesta por Tom en el rastreador de problemas de scikit-learn:

LogisticRegressionCV.scores_ da la puntuación para todos los pliegues. GridSearchCV.best_score_ da la mejor puntuación media en todos los pliegues.

Para obtener el mismo resultado, debe cambiar su código:

print('Max auc_roc:', searchCV.scores_[1].max())  # is wrong
print('Max auc_roc:', searchCV.scores_[1].mean(axis=0).max())  # is correct

Al usar también el valor predeterminado tol=1e-4 en lugar de tu tol=10, Yo obtengo:

('gs.best_score_:', 0.939162082193857)
('Max auc_roc:', 0.93915947999923843)

La (pequeña) diferencia restante podría provenir de un comienzo cálido en LogisticRegressionCV (que es en realidad lo que lo hace más rápido que GridSearchCV)


1
2017-12-04 09:21