¿Cómo evaluar modelos de aprendizaje automático? con código en Python

Vamos a empezar con precision, Recall, F1 and Accuracy

Recordemos:

  • Recall o exhaustividad: Nos indica, de todas las clases positivas cuantas se predijo correctamente 
  • Precisión: De todas las positivas que se han predicho cuantas son realmente positivas
  • Accuracy o exactitud: De todas las clases cuantas se predijeron correctamente 
  • Medida F: Permite comparar dos modelos de baja precisión y alta exhaustividad (recall) usa la media armónica para castigar los valores extremos 

Nuestro ejemplo

como evaluar modelos de aprendizaje automático con código en python

Vamos a explicar la precisión, precisión, recuperación y F1 relacionados con el mismo ejemplo y explicaremos las ventajas y desventajas de cada uno.

  • Hemos creado un modelo que predice qué empresas sobrevivirán más de 3 años
  • Ha hecho predicciones para 10 compañías diferentes que se ven a continuación.

1 = sobrevivió
0 = falló

### Formato tabular ### 
'' '
Compañía No. 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
--------------------------------------
Actual: 1 1 0 1 0 0 0 0 0 0
previsto: 1 1 1 0 1 0 0 0 0 0
'' '
### In Python ###
y_true = [1, 1, 0, 1, 0, 0, 0, 0, 0, 0]
y_pred = [1, 1, 1, 0, 1, 0, 0, 0, 0, 0]

Exactitud

El porcentaje de instancias donde el modelo predijo el valor correcto. (Aka. Porcentaje de casos correctos para predecir que una empresa tendrá éxito o fracasará)

### Python ###
y_true = [1, 1, 0, 1, 0, 0, 0, 0, 0, 0]
y_pred = [1, 1, 1, 0, 1, 0, 0, 0, 0, 0]
Importamos la libreria
desde sklearn.metrics import precision_score
Implementamos la medida
precision_score (y_true, y_pred)
RESULTADO
0.5

A primera vista, esto podría parecer una buena métrica de éxito porque el modelo en realidad era correcto la mayor parte del tiempo. Pero depende del contexto.

Si utilizó este modelo para elegir empresas para invertir, habría perdido su dinero en el 50% de sus 4 inversiones. La precisión es una mala métrica para evaluar su modelo en ese contexto.

Precisión

Formula precision

La fracción de instancias relevantes recuperadas del total de instancias recuperadas. Aca el número de predicciones correctas entre las compañías pronosticadas para tener éxito.

Puede calcular esta métrica para ambos

i) casos que predijo el modelo 1

ii) casos que predijo el modelo 0

Vea ambos a continuación, pero el caso positivo es más relevante para nuestro ejemplo.

### Python ###de sklearn.metrics import precision_score
positivo = puntaje de precisión (y_verdadero, y_pred, pos_label = 1) 
imprimir (positivo)

>>> 0.5
negativo = puntaje de precisión (y_verdadero, y_pred, pos_label = 0) 
imprimir (negativo)
>>> 0.8333333333333334

Si nos atenemos al mismo contexto de elegir empresas para invertir, entonces la precisión (para casos positivos) es en realidad una buena medida para evaluar este modelo.

Sabría no invertir en compañías recomendadas por el modelo, porque sabe que solo es correcto el 50% del tiempo

Recall

formula recall o exhaustividad

La fracción de instancias relevantes recuperadas sobre el total de instancias relevantes recuperadas. Acá ¿Qué porcentaje de todas las compañías exitosas encontró el modelo?

De nuevo, las instancias relevantes pueden ser 0o 1casos, pero calcularemos ambos aquí.

de sklearn.metrics import remember_score
positivo = recordar_puntuación (y_verdadero, y_pred, pos_label = 1) 
imprimir (positivo)
>>> 0.6666666666666666
negativo = recordar_puntuación (y_verdadero, y_pred, pos_label = 0) 
imprimir (negativo)
>>> 0.7142857142857143

Aquí vemos que de las empresas exitosas, el modelo encontró el 67%. Con el retiro del mercado, no consideramos cuántas empresas que predijimos incorrectamente tendrían éxito, solo que descubrimos las empresas que tendrían éxito.

Probablemente no usamos el retiro para evaluar nuestro modelo si el contexto está haciendo inversiones. A menos que seamos una empresa de capital de riesgo que realice una gran cantidad de pequeñas inversiones con posibles ganancias de 1000x, y no queramos perder ninguna compañía que pueda tener éxito.

F1

formula f1

F1 es el medio armónico de precisión y recall

F1 tiene en cuenta tanto la precisión como el recall.

Lo considero un promedio conservador. Por ejemplo:
La F1 de 0.5 y 0.5 = 0.5.
La F1 de 1 y 0.5 = 0.66.
La F1 de 1 y 0.01 = 0.02.

Nuevamente, podemos calcularlo tanto para casos positivos como negativos.

### Python ###de sklearn.metrics import f1_score
Postive = f1_score (y_true, y_pred, pos_label = 1) 
print (postive)
>>> 0.5714285714285715
negativo = f1_score (y_true, y_pred, pos_label = 0) 
print (negativo)
>>> 0.7692307692307692

Normalmente usamos F1 cuando la precisión y la recuperación son importantes. En mi experiencia en el mundo real, ambos lo hacen a menudo.

Conclusión

Antes de dejarte ir, podríamos haber impreso todos los puntajes simultáneamente con este informe de sklearn.

### Python ###de sklearn.metrics importar clasificación_reporteinforme = clasificación_reporte (y_verdadero, y_pred) 
imprimir (informe)

En conclusión, el contexto siempre importa. Y esto a menudo requiere un pensamiento cuidadoso, conocimiento del dominio y una comprensión de lo que está tratando de lograr.

Un ejemplo con gatos y perros

como evaluar modelos de aprendizaje automático con código en python

Comencemos por definir un conjunto de datos binarios de ejemplo extremadamente simple. Imagina, por un momento, que eres un veterinario en lugar de un programador. Además, imagina que tiene un dispositivo que pretende identificar si un animal es un gato. En este ejemplo, un “1” o positivo identifica un gato (🐈), y un “0” o negativo identifica un perro (🐕). Utilizaremos este ejemplo a lo largo del artículo para dar sentido a las métricas.

actual_a = [1 for n in range(10)] + [0 for n in range(10)]
predicted_a = [1 for n in range(9)] + [0, 1, 1] + [0 for n in range(8)]
print(actual_a)
print(predicted_a)

RESULTADO

[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0]

Matriz de confusión

matriz de confusion

Una forma fácil de ver resultados positivos y negativos verdaderos y falsos es con una matriz de confusión. Una tabla sencilla que proporciona un resumen intuitivo de las entradas a los cálculos que realizamos anteriormente. En lugar de una corrección decimal, la matriz de confusión nos da recuentos de cada uno de los tipos de resultados.

from sklearn.metrics import confusion_matrix
confusion_matrix(actual_a, predicted_a)

RESULTADO

array([[8, 2],
[1, 9]], dtype=int64)

Donde los números corresponden a:

[[verdaderos_negativos falsos_positivos] [falsos_negativos verdaderos_positivos]]
matriz de confusioon

Exactitud

Después de sintetizar estos datos, nuestra primera métrica es la precisión. La precisión es el número de predicciones correctas sobre el tamaño de salida. Es una medida increíblemente sencilla y, gracias a su simplicidad, es ampliamente útil. La exactitud es una de las primeras métricas que calculo al evaluar los resultados.

from sklearn.metrics import precision_score 
precision_score(actual_a, predicted_a)

RESULTADO

0.8181818181818182

La exactitud en esta salida es .81, lo que significa que el 81% de los resultados fueron correctos. Ten en cuenta que, en promedio, los resultados aleatorios producen una precisión del 50%, por lo que esta es una mejora importante. ¡Esto parece bastante bueno! tenemos muchos gatos para amar pero también debemos preocuparnos por los falsos positivos. Afortunadamente, otra métrica,la precisión, puede ayudar.

Precisión

La precisión es una medida similar, pero solo mide la tasa de falsos positivos.

from sklearn.metrics import precision_score
positive = precision_score(actual_a, predicted_a, pos_label=1)
print(positive)
negative = precision_score(actual_a, predicted_a, pos_label=0)
print(negative)

RESULTADO

0.8181818181818182
0.8888888888888888

Nuestra precisión es aproximadamente 0.88. Esto significa que los falsos positivos son una gran parte de nuestro conjunto de errores. De hecho, tenemos dos falsos positivos en este ejemplo y solo uno falso negativo. 

Recall

El recall es lo contrario de precisión, mide falsos negativos contra verdaderos positivos. Los falsos negativos son especialmente importantes para prevenir la detección de enfermedades y otras predicciones relacionadas con la seguridad (acciones fraudulentas con una tarjeta de credito) 

from sklearn.metrics import recall_score
positive = recall_score(actual_a, predicted_a, pos_label=1)
print(positive)
negative = recall_score(actual_a, predicted_a, pos_label=0)
print(negative)

RESULTADO

0.9
0.8

Nuestro retiro es 0.9, más alto que las otras dos métricas. Si estamos especialmente preocupados por reducir los falsos negativos, entonces este es el mejor resultado. 

Puntuación F1

¿Qué sucede si desea equilibrar los dos objetivos: alta precisión y alta exhaustividad (recall) ? Calculamos la puntuación F1 como la media armónica de precisión y recuperación para lograr exactamente eso. Si bien podríamos tomar el promedio simple de las dos puntuaciones, los medios armónicos son más resistentes a los valores atípicos. Por lo tanto, el puntaje F1 es una métrica equilibrada que cuantifica adecuadamente la corrección de los modelos en muchos dominios.

Postive = f1_score (actual_a, predicted_a, pos_label = 1) 
print (postive)
negativo = f1_score (actual_a, predicted_a, pos_label = 0)
print (negativo)

RESULTADO

0.5714285714285715
0.8421052631578948

La puntuación de 0.84, ligeramente superior a la del promedio, puede o no darte la confianza para creer en el algoritmo para ayudarte a decidir qué es o no un gato. Al evaluar las compensaciones entre precisión y recuperación, es posible que desees dibujar una curva ROC para evaluar mejor

Área bajo la curva

A diferencia de las curvas de recuperación de precisión, las curvas ROC funcionan mejor para conjuntos de datos equilibrados como el nuestro. Brevemente, AUC es el área bajo la curva ROC que representa la compensación entre Retirada (TPR) y Especificidad (FPR). Al igual que las otras métricas que hemos considerado, AUC está entre 0 y 1, con 0.5 como el valor esperado de la predicción aleatoria. Sklearn proporciona una implementación para AUC en la clasificación binaria.

area bajo la curva

La especificidad o FPR de un clasificador es su “métrica de falsa alarma”. Básicamente, mide la frecuencia con la que el clasificador predice un positivo donde se observa un negativo. En nuestro ejemplo, un falso positivo es motivo un perro 

Consideramos la compensación entre TPR y FPR con nuestra curva ROC para nuestro clasificador equilibrado.

#ROCfrom sklearn.metrics import roc_auc_scorefrom sklearn.metrics import roc_curveimport matplotlib.pyplot as pltprint("sklearn ROC AUC Score A:", roc_auc_score(actual_a, predicted_a))fpr, tpr, _ = roc_curve(actual_a, predicted_a)plt.figure()plt.plot(fpr, tpr, color='darkorange',         lw=2, label='ROC curve')plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--') #center lineplt.xlim([0.0, 1.0])plt.ylim([0.0, 1.05])plt.xlabel('False Positive Rate')plt.ylabel('True Positive Rate')plt.title('Receiver operating characteristic example')plt.legend(loc="lower right")plt.show()

RESULTADO

area bajo la curva

El AUC para nuestros datos es .85, que resulta ser el mismo que nuestra precisión. 

Debido a que la precisión y el recall estándar se basan en la clasificación binaria, no es trivial extender AUC para representar un clasificador general multidimensional como una especie de hipervolumen bajo la curva. Sin embargo, varias de las métricas son más fáciles de extender para evaluar otros tipos de predicciones.

Y esto fue todo sobre como evaluar modelos de aprendizaje automático con código en python, en un siguiente post hablaremos de la evaluación de modelos en regresión

MATERIAL DE APOYO

  • Todo el código de este post puedes encontrarlo aquí 
  • El primer ejemplo lo tome de este post 
  • Todas las fórmulas puedes encontrarlas aquí 
  • Lee mi último post donde hablo de Árboles de decisión usando Python. Código paso a paso aqui

Y no olvides

Suscribete en mi canal de Youtube

Apoyame para seguir creando contenido y accede a mentorías personalizadas aquí

Gracias por leerme 💜

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *