12 votos

Utilizar la puntuación f1 en GridSearchCV

Me gustaría utilizar la métrica de la puntuación F1 para la validación cruzada utilizando sklearn.model_selection.GridSearchCV. Mi problema es un problema de clasificación multiclase. Me gustaría utilizar la opción average='micro' en la puntuación F1.

Véase también: https://scikit-learn.org/stable/modules/generated/sklearn.metrics.f1_score.html#sklearn.metrics.f1_score

Ya he comprobado el siguiente puesto: https://stackoverflow.com/questions/34221712/grid-search-with-f1-as-scoring-function-several-pages-of-error-message

Si intento exactamente lo que está parado en este post, pero siempre me da este error:

TypeError: f1_score() missing 2 required positional arguments: 'y_true' and 'y_pred'

Mi pregunta se refiere básicamente a la sintaxis: ¿Cómo puedo utilizar el f1_score con average='micro' en GridSearchCV?

Estaría muy agradecido por cualquier respuesta.

EDIT: Aquí hay un ejemplo ejecutable:

import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.pipeline import Pipeline
from sklearn.metrics import f1_score, make_scorer
from sklearn.preprocessing import RobustScaler
from sklearn.svm import SVC

data = load_breast_cancer()
X = data['data']
y = data['target']

#X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33)

scaler = RobustScaler()
estimator = SVC()

pipeline_steps = [('scaler', scaler), ('estimator', estimator)]
pipeline_steps = Pipeline(steps=pipeline_steps)

grid = [{'estimator__C': [0.1, 0.5, 1.5, 2, 2.5, 3]}]

gridsearch = GridSearchCV(estimator=pipeline_steps,
                       param_grid=grid,
                       n_jobs=-1,
                       cv=5,
                       scoring=make_scorer(f1_score(average='micro')))

# now perform full fit on whole pipeline
gridsearch.fit(X, y)
print("Best parameters from gridsearch: {}".format(gridsearch.best_params_))
print("CV score=%0.3f" % gridsearch.best_score_)
cv_results = gridsearch.cv_results_
#print(cv_results)

3voto

jordin1987 Puntos 21

Vale, lo he descubierto:

Si utiliza scoring='f1_micro' según https://scikit-learn.org/stable/modules/model_evaluation.html tienes exactamente lo que quiero.

0voto

Gary Puntos 1

Puedes seguir el ejemplo que se proporciona aquí, simplemente pasa average='micro' a make_scorer. https://scikit-learn.org/stable/modules/generated/sklearn.metrics.make_scorer.html

0 votos

Gracias por su ayuda. Cuando hago esto, obtengo el siguiente error: scoring=make_scorer(f1_score), average='micro') TypeError: __init__() got an unexpected keyword argument 'average' --> He añadido un ejemplo de código completo en mi post

0 votos

Esta es la forma correcta make_scorer(f1_score, average='micro'), también tienes que comprobar por si acaso tu sklearn es la última versión estable

0voto

Gridsearch = GridSearchCV(estimador=pipeline_steps, param_grid=grid, n_jobs=-1, cv=5, scoring='f1_micro')

Puede consultar el siguiente enlace y utilizar toda la puntuación en las columnas de clasificación.

enlace : https://scikit-learn.org/stable/modules/model_evaluation.html

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X