Ciencia de datos

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.

Imagen de bpcraddock en Pixabay

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

Gini, KS y AUC: Cómo Medir la Calidad de un Modelo de Credit Scoring

Cuando un analista de riesgo presenta un nuevo scorecard ante el comité de dirección, la…

15 horas ago

Curiosidad: De dónde vienen foo, bar y foobar

Si revisáis código o documentación de otros programadores, tarde o temprano os toparéis con dos…

6 días ago

BG/NBD + Gamma/Gamma: el modelo probabilístico para CLV en compras continuas

Los dos artículos anteriores cubrieron el CLV clásico —una fórmula útil pero que trata a…

1 semana ago

Errores habituales al trabajar con DataFrames grandes en Pandas (y cómo evitarlos)

Hay un momento muy concreto en la vida de casi todo análisis: el código que…

2 semanas ago

Champion vs Challenger: Cómo los Bancos Validan Modelos Nuevos antes de Ponerlos en Producción

Has construido un nuevo modelo de credit scoring. Las métricas de validación son mejores que…

2 semanas ago

Cómo Comparar Dos Hipotecas con Todos los Gastos Incluidos

Comparar dos hipotecas parece sencillo: la que tenga el TIN más bajo es la mejor…

3 semanas ago

This website uses cookies.