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 Machine Learning en la industria para resolver problemas comerciales complejos. Para seleccionar qué modelo de Machine Learning se debe usar en producción, se elige una métrica de selección sobre la cual se califican los diferentes modelos de Machine Learning.

    Una de las métricas más utilizadas hoy en día es AUC-ROC (Área bajo 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 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 selección de modelo y curva ROC
    • Ejemplo de curva ROC con Python

    Introducción a la matriz de confusión

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

    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 predichos se muestran como filas.

    Definiciones de TP, FP, TN y FN

    Entendamos las terminologías, que también usaremos muy a menudo para comprender 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 = True Negative: el modelo predijo correctamente la clase negativa, que sería la clase negativa.

    Errores 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 la 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ásicos de la representación de la matriz de confusión.

    Fuente: https://commons.wikimedia.org/wiki/File:Precisionrecall.svg

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

    Recall = TP / (TP + FN)
    

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

    Precision = TP / (TP + FP)
    

    Puntuación F: A partir de Precision and Recall, F-Measure se calcula y se usa como métrica a veces. F – Measure no es más que la media armónica de Precision y Recall.

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

    Introducción a AUC – Curva ROC

    La curva AUC-ROC es la métrica de selección del modelo para el problema de clasificación de dos clases múltiples. 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.

    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 Machine Learning para distinguir las clases dadas. El valor ideal para AUC es 1.

    Diferentes escenarios con selección de modelo y curva ROC

    Escenario n. ° 1 (mejor escenario de caso)

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

    El gráfico anterior muestra la probabilidad de clase predicha para las clases 0 y 1. El umbral es 0,5, lo que significa que si la probabilidad predicha de la clase para una instancia es menor que 0,5, se predice que esa instancia será una instancia de clase 0. Si la probabilidad de la clase para una instancia es igual o mayor que 0.5, la instancia se clasifica como instancia de clase 1.

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

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

    Escenario n. ° 2 (conjetura aleatoria)

    En el caso de que ambas distribuciones de clases 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.

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

    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 suposición aleatoria, como lo haría un humano.

    Escenario n. ° 3 (peor escenario)

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

    Completamente opuesto al mejor escenario (escenario # 1), en este caso, todas las instancias de la clase 1 están mal clasificadas como clase 0 y todas las instancias de la clase 0 están mal clasificadas como clase 1.

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

    Escenario n. ° 4 (Escenario industrial / normativo)

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

    En este caso, como se observó, tenemos algunos solapamientos 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

    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.

    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: Genere datos de muestra.

    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 tren y prueba.

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

    Paso 5: ajusta un modelo a los datos del tren.

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

    Paso 6: Predecir probabilidades para los datos de prueba.

    probs = model.predict_proba(testX)
    

    Paso 7: Mantenga solo las probabilidades de la clase positiva.

    probs = probs[:, 1]
    

    Paso 8: Calcule la puntuación AUC.

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

    Salida:

    AUC: 0.95
    

    Paso 9: Obtenga la curva ROC.

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

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

    plot_roc_curve(fpr, tpr)
    

    Salida:

    Conclusión

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

     

    Etiquetas:

    Deja una respuesta

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