Mensaje de error de Scikit learn ‘La precisión y el puntaje F no están bien definidos y están configurados a 0.0 en las tags’

Estoy trabajando en un modelo de clasificación binaria, el clasificador es ingenuo bayes. Tengo un conjunto de datos casi equilibrado; sin embargo, recibo el siguiente mensaje de error cuando predigo:

UndefinedMetricWarning: Precision and F-score are ill-defined and being set to 0.0 in labels with no predicted samples. 'precision', 'predicted', average, warn_for) 

Estoy usando gridsearch con CV k-fold 10. El conjunto de pruebas y las predicciones contienen ambas clases, por lo que no entiendo el mensaje. Estoy trabajando en el mismo conjunto de datos, división de tren / prueba, cv y semilla aleatoria para otros 6 modelos y funcionan perfectamente. Los datos se ingieren externamente en un dataframe, la asignación aleatoria y la semilla se arreglan. Luego, el modelo de clasificación de Bayes naive clasifica el archivo al principio de antes de este fragmento de código.

 X_train, X_test, y_train, y_test, len_train, len_test = \ train_test_split(data['X'], data['y'], data['len'], test_size=0.4) pipeline = Pipeline([ ('classifier', MultinomialNB()) ]) cv=StratifiedKFold(len_train, n_folds=10) len_train = len_train.reshape(-1,1) len_test = len_test.reshape(-1,1) params = [ {'classifier__alpha': [0, 0.0001, 0.001, 0.01]} ] grid = GridSearchCV( pipeline, param_grid=params, refit=True, n_jobs=-1, scoring='accuracy', cv=cv, ) nb_fit = grid.fit(len_train, y_train) preds = nb_fit.predict(len_test) print(confusion_matrix(y_test, preds, labels=['1','0'])) print(classification_report(y_test, preds)) 

Python me “forzó” a modificar la forma de la serie, ¿tal vez ese sea el culpable?

Como ha comentado Aadel, cuando no hay puntos de datos clasificados como positivos, la precisión se divide por cero, ya que se define como TP / (TP + FP) (es decir, verdaderos positivos / verdaderos y falsos positivos ). La biblioteca luego establece la precisión en 0, pero emite una advertencia ya que en realidad el valor no está definido. F1 depende de la precisión y por lo tanto tampoco está definido.

Una vez que esté al tanto de esto, puede elegir deshabilitar la advertencia con:

 import warnings import sklearn.exceptions warnings.filterwarnings("ignore", category=sklearn.exceptions.UndefinedMetricWarning) 

El significado de la advertencia.

Como lo sugieren las otras respuestas aquí, se encuentra una situación en la que no se puede calcular la F-Score precisión debido a su definición (precisión / recuperación igual a 0). En estos casos, la puntuación de la métrica se valora en 0.

Los datos de prueba contienen todas las tags, ¿por qué sigue sucediendo esto?

Bueno, estás usando K-Fold (específicamente en tu caso k=10 ), lo que significa que una división específica puede contener 0 muestras de una clase

Todavía sucede, incluso cuando se utiliza K-Fold estratificado

Esto es un poco complicado. El K-Fold estratificado asegura la misma porción de cada clase en cada división. Sin embargo, esto no solo depende de las clases reales. Por ejemplo, la precisión se calcula así: TP/predicted yes . Si, por algún motivo, predice todas sus muestras con No , habrá predicted yes=0 , lo que resultará en una precisión indefinida (lo que puede llevar a un F-Score indefinido).

Esto suena como un caso de ventaja, pero tenga en cuenta el hecho de que en la búsqueda en cuadrícula, probablemente esté buscando un montón de combinaciones diferentes, que algunas podrían estar totalmente desactivadas, y dar lugar a tal escenario.

¡Espero que esto responda tu pregunta!