ROC com Validação Cruzada

Beginner

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

Introdução

Neste laboratório, aprenderemos a estimar e visualizar a variância da métrica Receiver Operating Characteristic (ROC) usando validação cruzada em Python. As curvas ROC são usadas na classificação binária para medir o desempenho de um modelo, plotando a taxa de verdadeiros positivos (TPR) contra a taxa de falsos positivos (FPR). Usaremos a biblioteca Scikit-learn para carregar o conjunto de dados iris, criar recursos ruidosos e classificar o conjunto de dados com a Máquina de Vetores de Suporte (SVM). Em seguida, plotaremos as curvas ROC com validação cruzada e calcularemos a média da Área Sob a Curva (AUC) para ver a variabilidade da saída do classificador quando o conjunto de treinamento é dividido em diferentes subconjuntos.

Dicas da Máquina Virtual

Após o término do inicialização da VM, clique no canto superior esquerdo para mudar para a aba Notebook para acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para você.

Carregar e preparar os dados

Primeiro, carregaremos o conjunto de dados iris usando a biblioteca Scikit-learn. O conjunto de dados iris contém 3 classes de plantas de íris, e binarizarmos o conjunto de dados descartando uma classe para criar um problema de classificação binária. Também adicionaremos recursos ruidosos para tornar o problema mais difícil.

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

## adicionar recursos ruidosos
random_state = np.random.RandomState(0)
X = np.concatenate([X, random_state.randn(n_samples, 200 * n_features)], axis=1)

Classificação e análise ROC

Em seguida, executaremos um classificador SVM com validação cruzada e plotaremos as curvas ROC por dobra. Usaremos StratifiedKFold do Scikit-learn para gerar as divisões de validação cruzada. Também calcularemos a AUC média das curvas ROC e veremos a variabilidade da saída do classificador plotando o desvio padrão dos TPRs.

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"ROC média (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 desvio padrão",
)

ax.set(
    xlim=[-0.05, 1.05],
    ylim=[-0.05, 1.05],
    xlabel="Taxa de Falsos Positivos",
    ylabel="Taxa de Verdadeiros Positivos",
    title=f"Curva ROC média com variabilidade\n(rótulo positivo '{target_names[1]}')",
)
ax.axis("square")
ax.legend(loc="lower right")
plt.show()

Resumo

Neste laboratório, aprendemos como estimar e visualizar a variância da métrica Receiver Operating Characteristic (ROC) usando validação cruzada em Python. Carregamos o conjunto de dados iris, criamos recursos ruidosos e classificamos o conjunto de dados com SVM. Em seguida, plotamos as curvas ROC com validação cruzada e calculamos a AUC média para observar a variabilidade da saída do classificador quando o conjunto de treinamento é dividido em diferentes subconjuntos. As curvas ROC podem nos ajudar a avaliar o desempenho de um classificador binário e a ver o trade-off entre verdadeiros positivos e falsos positivos. A validação cruzada pode nos ajudar a estimar a variabilidade da saída do classificador e escolher o melhor modelo para nosso problema.