Comprender las curvas ROC con Python

En la era actual en la que la ciencia de datos/IA está en auge, es importante comprender cómo se utiliza el aprendizaje automático en la industria para resolver problemas comerciales complejos...

En la era actual en la que la ciencia de datos/IA está en auge, es importante comprender cómo se utiliza el aprendizaje automático en la industria para resolver problemas comerciales complejos. Para seleccionar qué modelo de Machine Learning debe usarse en producción, se elige una métrica de selección sobre la cual se califican diferentes modelos de Machine Learning.

Una de las métricas más utilizadas hoy en día es la curva AUC-ROC (Área bajo la curva - Características operativas del receptor). Las curvas ROC son bastante fáciles de entender y evaluar una vez que se comprende bien la matriz de confusión y los diferentes tipos de errores.

En este artículo, explicaré los siguientes temas:

  • Introducción a la matriz de confusión y diferentes estadísticas calculadas en ella.
  • Definiciones de TP, FN, TN, FP
  • Errores de tipo 1 y tipo 2
  • Estadísticas calculadas a partir de Recall, Precision, F-Score
  • Introducción a la curva AUC ROC
  • Diferentes escenarios con curva ROC y selección de modelo
  • Ejemplo de Curva ROC con Python

Introducción a Confusion Matrix

Para mostrar las etiquetas de clase previstas y reales de los modelos de Machine Learning, se utiliza la matriz de confusión. Tomemos un ejemplo de un problema de clasificación de clases binarias.

Confusion Matrix{.img-responsive}

La clase etiquetada como 1 es la clase positiva en nuestro ejemplo. La clase etiquetada como 0 es la clase negativa aquí. Como podemos ver, los valores reales positivos y negativos se representan como columnas, mientras que los valores previstos se muestran como filas.

Definiciones de TP, FP, TN y FN

Entendamos las terminologías, que también vamos a usar muy a menudo en la comprensión de las curvas ROC:

  • TP = Verdadero Positivo – El modelo predijo la clase positiva correctamente, para ser una clase positiva.
  • FP = Falso positivo: el modelo predijo incorrectamente que la clase negativa era una clase positiva.
  • FN = Falso negativo: el modelo predijo incorrectamente que la clase positiva era la clase negativa.
  • TN = Verdadero Negativo – El modelo predijo la clase negativa correctamente, para ser la clase negativa.

Errores de tipo 1 y tipo 2 {#errores de tipo 1 y tipo 2}

Hay dos tipos de errores que se pueden identificar aquí:

  • Error de tipo 1: el modelo predijo que la instancia sería una clase positiva, pero es incorrecto. Esto es Falso Positivo (FP).

  • Error de tipo 2: el modelo predijo que la instancia sería de clase negativa, pero es incorrecta. Esto es Falso Negativo (FN).

Estadísticas calculadas a partir de la matriz de confusión

Para evaluar el modelo, se calculan algunos hechos/estadísticas básicas a partir de la representación de la matriz de confusión.

Precision - Recall{.img-responsive}

[Fuente: https://commons.wikimedia.org/wiki/File:Precisionrecall.svg]{.small}

Recuerde: De todas las clases positivas, cuántas instancias se identificaron correctamente.

1
Recall = TP / (TP + FN)

Precisión: De todas las instancias positivas pronosticadas, cuántas se pronosticaron correctamente.

1
Precision = TP / (TP + FP)

F-Score: de Precision and Recall, F-Measure se calcula y se usa como métrica a veces. F: la medida no es más que la media armónica de precisión y recuperación.

1
F-Score = (2 * Recall * Precision) / (Recall + Precision)

Introducción a AUC - Curva ROC

La curva AUC–ROC es la métrica de selección de modelo para el problema de clasificación bi-multiclase. ROC es una curva de probabilidad para diferentes clases. ROC nos dice qué tan bueno es el modelo para distinguir las clases dadas, en términos de la probabilidad predicha.

Una curva ROC típica tiene una tasa de falsos positivos (FPR) en el eje X y una tasa de verdaderos positivos (TPR) en el eje Y.

ROC{.img-responsive}

El área cubierta por la curva es el área entre la línea naranja (ROC) y el eje. Esta área cubierta es AUC. Cuanto mayor sea el área cubierta, mejores serán los modelos de aprendizaje automático para distinguir las clases dadas. El valor ideal para AUC es 1.

Diferentes escenarios con curva ROC y selección de modelo {#diferentes escenarios con curva ROC y selección de modelo}

Escenario #1 (mejor escenario)

Para cualquier modelo de clasificación, el mejor escenario es cuando hay una clara distinción entre las dos/todas las clases.

S1{.img-responsive}

El gráfico anterior muestra la probabilidad de clase prevista para las clases 0 y 1. El umbral es 0,5, lo que significa que, si la probabilidad prevista de la clase para una instancia es inferior a 0,5, se prevé que esa instancia sea una instancia de clase 0. Si la probabilidad de la clase para una instancia es igual o mayor a 0.5, la instancia se clasifica como la instancia de clase 1.

La curva AUC-ROC para este caso es la siguiente.

S1 ROC{.img-responsive}

Como podemos ver aquí, tenemos una clara distinción entre las dos clases como resultado, tenemos el AUC de 1. Aquí se logra el área máxima entre la curva ROC y la línea base.

Escenario #2 (adivinación aleatoria)

En el caso de que ambas distribuciones de clase simplemente se imiten entre sí, el AUC es 0,5. En otras palabras, nuestro modelo tiene una precisión del 50 % para las instancias y su clasificación. El modelo no tiene ninguna capacidad de discriminación en este caso.

S2 ROC{.img-responsive}

Podemos ver que no hay una discriminación clara entre las dos clases.

S2{.img-responsive}

Es evidente a partir del diagrama de la curva ROC AUC, que el área entre ROC y el eje es 0,5. Este todavía no es el peor modelo, pero hace una conjetura aleatoria, como lo haría un humano.

Escenario #3 (Peor escenario)

Si el modelo clasifica erróneamente las clases, es el peor de los casos.

S3{.img-responsive}

Completamente opuesto al mejor de los casos (escenario n.° 1), en este caso, todas las instancias de la clase 1 se clasifican incorrectamente como clase 0 y todas las instancias de la clase 0 se clasifican incorrectamente como clase 1.

S3 ROC{.img-responsive}

Como resultado, obtenemos que AUC sea 0, que es el peor de los casos.

Escenario n.° 4 (Industria/Escenario de normas)

En un escenario habitual de la industria, los mejores casos nunca se observan. Nunca obtenemos una distinción clara entre las dos clases.

S4{.img-responsive}

En este caso, como se observa, tenemos cierta superposición y eso introduce errores de tipo 1 y tipo 2 en la predicción del modelo. En este caso, obtenemos que el AUC esté entre 0,5 y 1.

Ejemplo con Python

¡Veamos un ejemplo de curvas ROC con algunos datos y un clasificador en acción!

Paso 1: importar bibliotecas

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# roc curve and auc score
from sklearn.datasets import make_classification
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import roc_curve
from sklearn.metrics import roc_auc_score

Paso 2: Definición de una función de Python para trazar las curvas ROC.

1
2
3
4
5
6
7
8
def plot_roc_curve(fpr, tpr):
    plt.plot(fpr, tpr, color='orange', label='ROC')
    plt.plot([0, 1], [0, 1], color='darkblue', linestyle='--')
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver Operating Characteristic (ROC) Curve')
    plt.legend()
    plt.show()

Paso 3: generar datos de muestra.

1
data_X, class_label = make_classification(n_samples=1000, n_classes=2, weights=[1,1], random_state=1)

Paso 4: divida los datos en subconjuntos de datos de entrenamiento y prueba.

1
trainX, testX, trainy, testy = train_test_split(data_X, class_label, test_size=0.3, random_state=1)

Paso 5: ajuste un modelo en los datos del tren.

1
2
model = RandomForestClassifier()
model.fit(trainX, trainy)

Paso 6: Prediga las probabilidades para los datos de prueba.

1
probs = model.predict_proba(testX)

Paso 7: Mantenga las probabilidades de la clase positiva únicamente.

1
probs = probs[:, 1]

Paso 8: Calcule la puntuación AUC.

1
2
auc = roc_auc_score(testy, probs)
print('AUC: %.2f' % auc)

Producción:

1
AUC: 0.95

Paso 9: Obtenga la Curva ROC.

1
fpr, tpr, thresholds = roc_curve(testy, probs)

Paso 10: Trace la curva ROC usando nuestra función definida

1
plot_roc_curve(fpr, tpr)

Producción:

Salida{.img-responsive}

Conclusión

La curva AUC-ROC es una de las métricas más utilizadas para evaluar el rendimiento de los algoritmos de aprendizaje automático, especialmente en los casos en los que tenemos conjuntos de datos desequilibrados. En este artículo vemos en detalle las curvas ROC y sus conceptos asociados. Finalmente, demostramos cómo se pueden trazar las curvas ROC usando Python.