Revista Informática

Solucionar el problema: Recall is ill-defined and being set to 0.0 in labels

Publicado el 08 abril 2022 por Daniel Rodríguez @analyticslane
Solucionar el problema: Recall is ill-defined and being set to 0.0 in labels

Al trabajar con modelos de clasificación multiclase es posible que al intentar medir la exhaustividad ( recal) en Scikit-learn nos aparezca un mensaje de advertencia del estilo: Recall is ill-defined and being set to 0.0 in labels with no true samples. Este es un problema que aparece porque entre los valores predichos existe una clase que no se observa en el conjunto de valores reales. Algo que se puede deber a diferentes motivos, un falso positivo en una clase minoritaria que no se encuentra en los datos reales o el modelo asigna los registros sin clasificar a una nueva clase, como sucede por ejemplo con el clasificador RadiusNeighborsClassifier, la cual no puede existir en los datos reales. Veamos a continuación el motivo por el que se genera el mensaje y cómo evitarlo.

Generar el mensaje: Recall is ill-defined and being set to 0.0 in labels

Al utilizar la función recall_score() de Scikit-learn es posible que se genere un mensaje como "Recall is ill-defined and being set to 0.0 in labels". Lo que aparece cuando en el segundo parámetro, los valores predichos, existe una clase que no se observa en los datos originales. Por ejemplo, si en los datos hay dos clases y en las predicciones tres el mensaje aparecerá. Esto es lo que sucede en el siguiente código.

import numpy as np
from sklearn.metrics import recall_score

y_true = [1, 2, 1, 2]
y_pred = [1, 2, 3, 2]

# Produce warning
recall_score(y_true, y_pred, average='weighted')

Solucionar el problema con el mensaje

Una vez que se conoce el motivo por el que se produce el mensaje de advertencia se puede ver como solucionarlo. Para esto hay que indicar a la función cuales son las clases que puede esperar que aparezcan en los datos. Algo que se puede hacer mediante el uso del parámetro labels. Una forma rápida de solucionar el problema es obteniendo los valores únicos del vector de predicciones mediante la función np.unique() y asignar esto al parámetro. Algo como lo que se muestra en el siguiente código.

# No produce warning
recall_score(y_true, y_pred, average='weighted', labels=np.unique(y_pred))

Ahora se puede comprobar que con este pequeño truco ya no aparece el mensaje de error.

Conclusiones

En esta ocasión se ha visto cómo solucionar un problema que puede ser molesto con la función recall_score() de Scikit-learn. Al trabajar con modelos de clasificación multiclase es probable que en las predicciones aparezca una clase que no se encuentre en la muestra usada, lo que provoca el error indicado.


Volver a la Portada de Logo Paperblog