• Saltar a la navegación principal
  • Saltar al contenido principal
Logo Codificando Bits

Codificando Bits

  • Academia
    • Rutas
    • Cursos
    • Proyectos
    • Tutoriales
  • Acceder
  • Suscribirse

Precision, recall y F-score para la clasificación binaria

En un artículo anterior hablamos de la matriz de confusión y vimos cómo usar esta herramienta para caracterizar el desempeño de un clasificador.

Sin embargo, vimos que cuando el set de datos está desbalanceado la matriz de confusión no resulta adecuada para caracterizar este desempeño.

Así que en este artículo veremos qué son el «precision», el «recall» y el «F-score», que son las métricas más usadas convencionalmente cuando queremos caracterizar el desempeño de un clasificador binario cuando tenemos un set de datos desbalanceado.

Al final del artículo encontrarás el enlace de descarga con el código para reproducir los resultados que veremos a continuación.

Limitaciones de la exactitud y de la matriz de confusión

Cuando implementamos un clasificador, sea binario o multiclase, podemos usar la exactitud (accuracy) o la matriz de confusión para cuantificar su desempeño.

En esencia, la exactitud mide la relación entre la cantidad de datos clasificados correctamente (es decir los aciertos) con respecto a la totalidad de los datos:

$$Exactitud = \frac{\text{número de aciertos}}{\text{número total de datos}}$$

Así, una exactitud de 1 (o 100%) corresponde a un clasificador perfecto, mientras que una exactitud de 0 corresponde a un modelo que clasifica incorrectamente todos los datos.

Sin embargo, esta métrica no tiene en cuenta la categoría a la que pertenece cada dato clasificado y, en su lugar, asume que los datos están balanceados (es decir que tenemos aproximadamente la misma cantidad de datos por categoría).

Por otra parte, la matriz de confusión nos permite ver en detalle tanto los aciertos como los desaciertos por cada categoría, pero no cuantifica directamente el desempeño del modelo para cada categoría.

En últimas, estas dos herramientas funcionan bien siempre y cuando el set de datos que estemos usando esté balanceado. Sin embargo, cuando los datos no están balanceados (es decir cuando tenemos muchos más datos de unas categorías y muchos menos en otras), la exactitud y la matriz de confusión no resultan adecuados.

Entendamos esto con un sencillo ejemplo. Supongamos que creamos un modelo para clasificar a una persona como «sana» o «enferma» y que para entrenar dicho modelo recolectamos un set de datos de 100 personas distribuidas de esta forma:

  • 91 personas están en la categoría «sana»
  • Y tan sólo 9 personas están en la categoría «enferma»

Es decir, que en este caso tenemos un set de datos desbalanceado.

Ahora supongamos que tras el entrenamiento obtenemos esta matriz de confusión:

Matriz de confusión
Categorías predichas
Categorías Reales Sano Enfermo
Sano 89 2
Enfermo 1 8

Si usamos esta matriz de confusión para calcular la exactitud, el número de aciertos sería simplemente 89 (para la categoría «sano») + 8 (para la categoría «enfermo»), lo que nos arrojaría un valor de exactitud de:

$$exactitud = \frac{\text{número de aciertos}}{\text{número total de datos}} = \frac{89+8}{91+9}=0.97$$

Así que según esto ¡¡¡nuestro modelo tiene una exactitud del 97%!!!

Aparentemente es un modelo que clasifica muy bien los datos. Sin embargo, si analizamos un poco más en detalle lo que está sucediendo (y volviendo a la matriz de confusión anterior) podemos ver que:

  • Del total de 91 sujetos «sanos» tan sólo 2 son clasificados incorrectamente como «enfermo». Es decir que el modelo está clasificando bastante bien los datos provenientes de la categoría mayoritaria (es decir los «sanos»).
  • Sin embargo, del total de 9 sujetos «enfermos» 8 son clasificados correctamente pero 1 es clasificado incorrectamente como «sano». Este desacierto representa una alta proporción con respecto al total de datos (1 de 9) y por tanto podemos afirmar que el modelo no tiene un desempeño tan bueno con los datos pertenecientes a la categoría minoritaria (es decir los «enfermos»).

En últimas, lo que ocurre en este caso es que cuando tenemos un set de datos desbalanceado ni la matriz de confusión ni la exactitud nos permiten ver el desempeño real del modelo para cada una de las categorías. De hecho, un buen desempeño de la categoría mayoritaria podría «enmascarar» el bajo desempeño del clasificador con la categoría minoritaria (como lo vimos en el ejemplo anterior).

Así que necesitamos otras formas de medir el desempeño que nos permitan a la vez discriminar entre una categoría y otra y es aquí donde aparecen precisamente las métricas «precision», «recall» y «F-score».

Pero antes de definir estas métricas y de ver cómo usarlas, necesitamos entender algunos simples conceptos previos.

Falsos/verdaderos positivos y falsos/verdaderos negativos

Volvamos al problema de clasificación binaria donde queremos clasificar a un sujeto en una de dos categorías: «sano» o «enfermo».

Comencemos definiendo los términos «positivo» y «negativo», que en la práctica dependen del contexto. En contextos de diagnóstico médico, como en el ejemplo hipotético que estamos analizando, usualmente se asume como un caso «positivo» aquel sujeto que se encuentra «enfermo», mientras que un caso «negativo» será una persona «sana»:

  • «enfermo» = «positivo»
  • «sano» = «negativo»

Teniendo en cuenta estas convenciones, ahora sí podemos definir los términos verdaderos positivos, falsos positivos, verdaderos negativos y falsos negativos:

  • Verdaderos positivos (o «True Positives», TP): el número de personas «enfermas» clasificadas como correctamente como «enfermas». En el caso del ejemplo anterior tendremos TP = 8
  • Falsos positivos (o «False Positives», FP): el número de personas «sanas» clasificadas incorrectamente como «enfermas». En este caso FP = 2
  • Verdaderos negativos (o «True Negatives», TN): el número de personas «sanas» clasificadas correctamente como «sanas». En este caso TN = 89
  • Falsos negativos (o «False Negatives», FN): el número de personas «enfermas» clasificadas incorrectamente como «sanas». En este caso FN = 1

Así que con estas definiciones iniciales ya estamos listos para definir y entender cómo interpretar las métricas de interés cuando tenemos clasificación de datos desbalanceados. Hablemos primero del «precision».

Precision

Aunque nos referimos al término en Inglés (pues es la terminología más usada en Machine Learning), en Español también se conoce como «valor positivo predicho».

El «precision» simplemente responde a la pregunta: de todo lo clasificado como POSITIVO, ¿qué es realmente POSITIVO?

Matemáticamente el «precision» se calcula a partir de los TP y los FP:

$$\text{precision} = \frac{\text{todo lo clasificado correctamente como positivo}}{\text{todo lo clasificado como positivo}}=\frac{TP}{TP+FP}$$

Así, «precision» es una medida de cuánta confianza podemos tener en un resultado positivo. En nuestro caso, si el modelo indica que una persona está «enferma», el «precision» nos indica ¿qué tan probable es que realmente lo esté?

Y es por tanto un valor que oscila entre 0 y 1 (o, de manera equivalente, entre 0% y 100%).

Volviendo al ejemplo que venimos analizando, en este caso el «precision» es igual a:

$$\text{precision} = \frac{8}{8+2} = 0.8$$

Lo cual quiere decir que si este clasificador indica que la persona está «enferma» existirá un 80% de probabilidades de que la persona efectivamente esté enferma.

Otra interpretación equivalente sería: «de cada 100 personas clasificadas como enfermas, 80 realmente lo estarán.»

Bien, teniendo claro qué es el «precision» hablemos ahora del «recall».

Recall

En Español nos podemos referir a este término como la «tasa de verdaderos positivos», la «sensibilidad» o la «exhaustividad».

En esencia, el «recall» responde a esta pregunta: de todo lo que es realmente POSITIVO ¿qué proporción fue clasificada como POSITIVO?:

$$\text{recall}=\frac{\text{todo lo positivo clasificado correctamente como positivo}}{\text{todo lo que realmente es positivo}}=\frac{TP}{TP+FN}$$

Y al igual que el «precision», el «recall» también es una métrica cuyos valores oscilan entre 0 y 1.

Es decir que el «recall» mide la capacidad que tiene el modelo de encontrar los verdaderos positivos entre todos los datos que realmente lo son. Por tanto, para nuestro caso particular, si una persona está realmente enferma, el «recall» cuantifica la probabilidad de que el modelo la detecte efectivamente como «enferma».

Si calculamos el «recall» para nuestro ejemplo obtendremos:

$$\text{recall}=\frac{8}{8+1}=0.88$$

Así que este «recall» del 88% nos indica que existe una probabilidad del 88% de que una persona realmente enferma sea clasificada como «enferma» por el modelo.

Una interpretación equivalente sería: «de cada 100 personas realmente enfermas, el modelo detecta correctamente a 88.»

Muy bien, con esto ya estamos listos para entender qué es el «F-score».

F-score

Resumamos lo obtenido hasta el momento:

  • Precision = 80%: cuando el modelo dice que una persona está «enferma» acertará el 80% de las veces
  • Recall = 88%: cuando una persona está enferma existe una probabilidad del 88% de que el modelo la clasifique correctamente como «enferma»

En este punto nos podríamos preguntar: ¿cuál de las dos métricas resulta más adecuada para medir el desempeño de nuestro modelo?

La respuesta es que depende de que lo que queramos priorizar. Entendamos esto en detalle:

  • Si nos interesa minimizar la cantidad de falsos positivos (FP) («sanos» detectados como «enfermos») entonces deberíamos usar el «precision»
  • Pero si nos interesa minimizar la cantidad de falsos negativos (FN) («enfermos» detectados como «sanos») entonces deberíamos usar el «recall».

Y qué pasa si queremos dar prioridad a ambas? Es decir, ¿qué pasa si tanto los FP como los FN son importantes?

Pues en este caso no nos podemos enfocar sólo en el «precision» o sólo en el «recall» sino que debemos analizarlos de forma combinada. Y es aquí donde aparece el «F-score».

En esencia el «F-score» es una métrica que combina el precision y el recall en un sólo valor. Matemáticamente se define como:

$$F_{\beta}=(1+\beta^2)\frac{precision.recall}{\beta^2 \cdot precision + recall}$$

donde el parámetro $\beta$ permite controlar el nivel de importancia que damos al *precision* o al *recall*. Así:

  • Si $\beta=0 \rightarrow F_{\beta} = (1+0)\frac{precision.recall}{0 \cdot precision + recall} = precision$. Es decir, con $\beta = 0$ priorizaremos el precision
  • Si $\beta=0.5 \rightarrow F_{\beta} = (1+0.5^2)\frac{precision.recall}{0.5^2 \cdot precision + recall} = (1.25) \frac{precision.recall}{0.25 precision + recall}$ y se da más importancia al «recall» (puesto que el «precision» del denominador queda ponderado por un factor de 0.25)

Y de hecho existe un caso especial ($\beta=1$) donde se da igual importancia al «precision» y al «recall». En este caso particular el «F-score» recibe el nombre de «F1-score» y la ecuación correspondiente es:

$$\text{F1-score}=2\frac{precision.recall}{precision + recall}$$

Y de hecho esta métrica «F1-score» es la más usada convencionalmente al momento de caracterizar un clasificador cuando tenemos datos desbalanceados.

Así que volvamos al ejemplo que hemos venido analizando y calculemos precisamente el F1-score:

$$\text{F1-score}=2\frac{0.8 \cdot 0.88}{0.8 + 0.88} = 0.84$$

Y este resultado nos muestra un buen compromiso entre «precision» y «recall» (teniendo en cuenta que un F1-score ideal sería igual a 1).

Enlace de descarga del código fuente

▼ El notebook con el código de este artículo

Conclusión

Muy bien, acabamos de ver qué son y cómo se interpretan las métricas «precision», «recall» y «F-score» que permiten medir el desempeño de un clasificador binario.

En esencia es importante tener en cuenta que cuando tenemos un set de datos desbalanceado, no es aconsejable usar la exactitud (accuracy) para evaluar el desempeño del modelo (pues esta métrica podría enmascarar un pobre desempeño para la categoría minoritaria).

Y lo aconsejable es precisamente usar el «precision», el «recall» o establecer un compromiso entre estas dos métricas usando el «F1-score».

En un próximo artículo veremos cómo extender estas ideas para evaluar el desempeño de un clasificador multiclase (donde tendremos 3 o más categorías a predecir).

© Codificando Bits, LLC | Blog | Contacto | Servicios | Acerca de | Políticas

¿Has olvidado la contraseña?
¿Has perdido tu contraseña? Por favor, introduce tu nombre de usuario o dirección de correo electrónico. Recibirás por correo electrónico un enlace para crear una nueva contraseña.
body::-webkit-scrollbar { width: 7px; } body::-webkit-scrollbar-track { border-radius: 10px; background: #f0f0f0; } body::-webkit-scrollbar-thumb { border-radius: 50px; background: #dfdbdb }