Característica operativa del receptor (Receiver Operating Characteristic, ROC) con validación cruzada

Ejemplo de la métrica Característica operativa del receptor (ROC, Receiver Operating Characteristic) para evaluar la calidad de los resultados del clasificador mediante validación cruzada.

Las curvas ROC suelen presentar la tasa de verdaderos positivos en el eje Y y la tasa de falsos positivos en el eje X. Esto significa que la esquina superior izquierda del gráfico es el punto «ideal» - una tasa de falsos positivos de cero y una tasa de verdaderos positivos de uno-. Esto no es muy realista, pero significa que un área bajo la curva (AUC) mayor suele ser mejor.

La «inclinación» de las curvas ROC también es importante, ya que lo ideal es maximizar la tasa de verdaderos positivos y minimizar la tasa de falsos positivos.

Este ejemplo muestra la respuesta ROC de diferentes conjuntos de datos, creados a partir de la validación cruzada K-fold. Tomando todas estas curvas, es posible calcular el área media bajo la curva, y ver la varianza de la curva cuando el conjunto de entrenamiento se divide en diferentes subconjuntos. Esto muestra, a grandes rasgos, cómo se ve afectada la salida del clasificador por los cambios en los datos de entrenamiento, y cuán diferentes son las divisiones generadas por la validación cruzada K-fold entre sí.

Receiver operating characteristic example
print(__doc__)

import numpy as np
import matplotlib.pyplot as plt

from sklearn import svm, datasets
from sklearn.metrics import auc
from sklearn.metrics import plot_roc_curve
from sklearn.model_selection import StratifiedKFold

# #############################################################################
# Data IO and generation

# Import some data to play with
iris = datasets.load_iris()
X = iris.data
y = 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.c_[X, random_state.randn(n_samples, 200 * n_features)]

# #############################################################################
# Classification and ROC analysis

# Run classifier with cross-validation and plot ROC curves
cv = StratifiedKFold(n_splits=6)
classifier = svm.SVC(kernel='linear', probability=True,
                     random_state=random_state)

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

fig, ax = plt.subplots()
for i, (train, test) in enumerate(cv.split(X, y)):
    classifier.fit(X[train], y[train])
    viz = plot_roc_curve(classifier, X[test], y[test],
                         name='ROC fold {}'.format(i),
                         alpha=0.3, lw=1, ax=ax)
    interp_tpr = np.interp(mean_fpr, viz.fpr, viz.tpr)
    interp_tpr[0] = 0.0
    tprs.append(interp_tpr)
    aucs.append(viz.roc_auc)

ax.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r',
        label='Chance', alpha=.8)

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=.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=.2,
                label=r'$\pm$ 1 std. dev.')

ax.set(xlim=[-0.05, 1.05], ylim=[-0.05, 1.05],
       title="Receiver operating characteristic example")
ax.legend(loc="lower right")
plt.show()

Tiempo total de ejecución del script: (0 minutos 0.282 segundos)

Galería generada por Sphinx-Gallery