Estoy utilizando una validación cruzada estratificada de 10 veces para encontrar un modelo que prediga y (resultado binario) de X (X tiene 34 etiquetas) con el auc más alto. Configuré el GridSearchCV:
log_reg = LogisticRegression() parameter_grid = {'penalty' : ["l1", "l2"],'C': np.arange(0.1, 3, 0.1),} cross_validation = StratifiedKFold(n_splits=10,shuffle=True,random_state=100) grid_search = GridSearchCV(log_reg, param_grid = parameter_grid,scoring='roc_auc', cv = cross_validation)
Y luego haz la validación cruzada:
grid_search.fit(X, y) y_pr=grid_search.predict(X)
No entiendo lo siguiente: ¿por qué grid_search.score(X,y)
y roc_auc_score(y, y_pr)
dan resultados diferentes (el primero es 0,74 y el segundo es 0,63)? ¿Por qué estos comandos no hacen lo mismo en mi caso?
Esto se debe a una inicialización diferente de roc_auc cuando se usa en GridSearchCV.
Mira el código fuente aquí
roc_auc_scorer = make_scorer(roc_auc_score, greater_is_better=True, needs_threshold=True)
Observe el tercer parámetro needs_threshold
. Cuando sea verdadero, requerirá los valores continuos para y_pred
, como probabilidades o puntajes de confianza que en gridsearch se calcularán a partir de log_reg.decision_function()
.
Cuando llama explícitamente a roc_auc_score
con y_pr
, está utilizando .predict()
que generará las etiquetas de clase previstas resultantes de los datos y no las probabilidades. Eso debería explicar la diferencia.
Tratar :
y_pr=grid_search.decision_function(X) roc_auc_score(y, y_pr)
Si aún no obtiene los mismos resultados, actualice la pregunta con el código completo y algunos datos de muestra.