ROC con Validación Cruzada

Beginner

This tutorial is from open-source community. Access the source code

Introducción

En este laboratorio, aprenderemos a estimar y visualizar la varianza de la métrica Receiver Operating Characteristic (ROC) utilizando validación cruzada en Python. Las curvas ROC se utilizan en la clasificación binaria para medir el rendimiento de un modelo al trazar la tasa de verdaderos positivos (TPR) contra la tasa de falsos positivos (FPR). Utilizaremos la biblioteca Scikit-learn para cargar el conjunto de datos iris, crear características ruidosas y clasificar el conjunto de datos con Máquina de Vectores de Soporte (SVM). Luego graficaremos las curvas ROC con validación cruzada y calcularemos el área media debajo de la curva (AUC) para ver la variabilidad de la salida del clasificador cuando el conjunto de entrenamiento se divide en diferentes subconjuntos.

Consejos sobre la VM

Una vez que se haya iniciado la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje comentarios después de la sesión y resolveremos el problema inmediatamente para usted.

Cargar y preparar los datos

Primero, cargaremos el conjunto de datos iris utilizando la biblioteca Scikit-learn. El conjunto de datos iris contiene 3 clases de plantas de iris, y crearemos un problema de clasificación binaria eliminando una clase para binarizar el conjunto de datos. También agregaremos características ruidosas para complicar el problema.

import numpy as np
from sklearn.datasets import load_iris

iris = load_iris()
target_names = iris.target_names
X, y = iris.data, iris.target
X, y = X[y!= 2], y[y!= 2]
n_samples, n_features = X.shape

## add noisy features
random_state = np.random.RandomState(0)
X = np.concatenate([X, random_state.randn(n_samples, 200 * n_features)], axis=1)

Clasificación y análisis ROC

A continuación, ejecutaremos un clasificador SVM con validación cruzada y graficaremos las curvas ROC por pliegue. Utilizaremos StratifiedKFold de Scikit-learn para generar los particionamientos de validación cruzada. También calcularemos la AUC media de las curvas ROC y veremos la variabilidad de la salida del clasificador al graficar la desviación estándar de las TPR.

import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.metrics import auc
from sklearn.metrics import RocCurveDisplay
from sklearn.model_selection import StratifiedKFold

n_splits = 6
cv = StratifiedKFold(n_splits=n_splits)
classifier = svm.SVC(kernel="linear", probability=True, random_state=random_state)

tprs = []
aucs = []
mean_fpr = np.linspace(0, 1, 100)

fig, ax = plt.subplots(figsize=(6, 6))
for fold, (train, test) in enumerate(cv.split(X, y)):
    classifier.fit(X[train], y[train])
    viz = RocCurveDisplay.from_estimator(
        classifier,
        X[test],
        y[test],
        name=f"ROC fold {fold}",
        alpha=0.3,
        lw=1,
        ax=ax,
        plot_chance_level=(fold == n_splits - 1),
    )
    interp_tpr = np.interp(mean_fpr, viz.fpr, viz.tpr)
    interp_tpr[0] = 0.0
    tprs.append(interp_tpr)
    aucs.append(viz.roc_auc)

mean_tpr = np.mean(tprs, axis=0)
mean_tpr[-1] = 1.0
mean_auc = auc(mean_fpr, mean_tpr)
std_auc = np.std(aucs)
ax.plot(
    mean_fpr,
    mean_tpr,
    color="b",
    label=r"Mean ROC (AUC = %0.2f $\pm$ %0.2f)" % (mean_auc, std_auc),
    lw=2,
    alpha=0.8,
)

std_tpr = np.std(tprs, axis=0)
tprs_upper = np.minimum(mean_tpr + std_tpr, 1)
tprs_lower = np.maximum(mean_tpr - std_tpr, 0)
ax.fill_between(
    mean_fpr,
    tprs_lower,
    tprs_upper,
    color="grey",
    alpha=0.2,
    label=r"$\pm$ 1 std. dev.",
)

ax.set(
    xlim=[-0.05, 1.05],
    ylim=[-0.05, 1.05],
    xlabel="Tasa de Falsos Positivos",
    ylabel="Tasa de Verdaderos Positivos",
    title=f"Curva ROC Media con Variabilidad\n(Etiqueta Positiva '{target_names[1]}')",
)
ax.axis("square")
ax.legend(loc="lower right")
plt.show()

Resumen

En este laboratorio, aprendimos a estimar y visualizar la varianza de la métrica Receiver Operating Characteristic (ROC) utilizando validación cruzada en Python. Cargamos el conjunto de datos iris, creamos características ruidosas y clasificamos el conjunto de datos con SVM. Luego graficamos las curvas ROC con validación cruzada y calculamos la AUC media para ver la variabilidad de la salida del clasificador cuando el conjunto de entrenamiento se divide en diferentes subconjuntos. Las curvas ROC pueden ayudarnos a evaluar el rendimiento de un clasificador binario y ver el equilibrio entre verdaderos positivos y falsos positivos. La validación cruzada puede ayudarnos a estimar la variabilidad de la salida del clasificador y elegir el mejor modelo para nuestro problema.