Curva de Comércio de Erros de Detecção

Beginner

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

Introdução

Neste tutorial, aprenderemos sobre as curvas de Comércio de Erros de Detecção (DET) e as compararemos com as curvas Característica Operacional do Receptor (ROC). As curvas DET são uma variação das curvas ROC, onde a Taxa de Falso Negativo (FNR) é plotada no eixo y em vez da Taxa de Positivo Verdadeiro (TPR). Usaremos o scikit-learn, uma popular biblioteca Python para aprendizado de máquina, para gerar dados sintéticos e comparar o desempenho estatístico de dois classificadores em diferentes limiares usando as curvas ROC e DET.

Dicas de Máquina Virtual

Após o arranque da VM, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para a prática.

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

Se tiver 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 si.

Gerar Dados Sintéticos

Usaremos a função make_classification do scikit-learn para gerar dados sintéticos. Esta função gera um problema de classificação aleatória de n classes, com n_informativas características informativas, n_redundantes características redundantes e n_clusters_per_class clusters por classe. Geraremos 1000 amostras com 2 características informativas e um estado aleatório de 1. Em seguida, dividiremos os dados em conjuntos de treino e teste com uma proporção de 60/40.

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

X, y = make_classification(
    n_samples=1_000,
    n_features=2,
    n_redundant=0,
    n_informative=2,
    random_state=1,
    n_clusters_per_class=1,
)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=0)

Definir os Classificadores

Definiremos dois classificadores diferentes para comparar seu desempenho estatístico em diferentes limiares usando as curvas ROC e DET. Usaremos a função make_pipeline do scikit-learn para criar um pipeline que escala os dados usando StandardScaler e treina um classificador LinearSVC. Também usaremos a classe RandomForestClassifier do scikit-learn para treinar um classificador de floresta aleatória com profundidade máxima de 5, 10 estimadores e um máximo de 1 característica.

from sklearn.ensemble import RandomForestClassifier
from sklearn.pipeline import make_pipeline
from sklearn.svm import LinearSVC

classifiers = {
    "Linear SVM": make_pipeline(StandardScaler(), LinearSVC(C=0.025, dual="auto")),
    "Random Forest": RandomForestClassifier(
        max_depth=5, n_estimators=10, max_features=1
    ),
}

Plotar Curvas ROC e DET

Usaremos as classes RocCurveDisplay e DetCurveDisplay do scikit-learn para plotar as curvas ROC e DET, respectivamente. A função RocCurveDisplay.from_estimator calcula a curva ROC e a plota no eixo fornecido. Similarmente, a função DetCurveDisplay.from_estimator calcula a curva DET e a plota no eixo fornecido. Criaremos dois subplots, um para as curvas ROC e outro para as curvas DET, e plotaremos as curvas para cada classificador.

import matplotlib.pyplot as plt
from sklearn.metrics import DetCurveDisplay, RocCurveDisplay

fig, [ax_roc, ax_det] = plt.subplots(1, 2, figsize=(11, 5))

for name, clf in classifiers.items():
    clf.fit(X_train, y_train)

    RocCurveDisplay.from_estimator(clf, X_test, y_test, ax=ax_roc, name=name)
    DetCurveDisplay.from_estimator(clf, X_test, y_test, ax=ax_det, name=name)

ax_roc.set_title("Curvas Característica Operacional do Receptor (ROC)")
ax_det.set_title("Curvas de Comércio de Erros de Detecção (DET)")

ax_roc.grid(linestyle="--")
ax_det.grid(linestyle="--")

plt.legend()
plt.show()

Interpretação dos Resultados

É mais fácil avaliar visualmente o desempenho geral de diferentes algoritmos de classificação usando curvas DET do que usando curvas ROC. As curvas DET fornecem feedback direto sobre o trade-off de erro de detecção, auxiliando na análise do ponto de operação. O utilizador pode então decidir a FNR que está disposto a aceitar em detrimento da FPR (ou vice-versa).

Resumo

Neste tutorial, aprendemos sobre as curvas de Comércio de Erros de Detecção (DET) e as comparámos com as curvas Característica Operacional do Receptor (ROC). Usámos o scikit-learn para gerar dados sintéticos e comparar o desempenho estatístico de dois classificadores através de limiares usando as curvas ROC e DET. As curvas DET são uma variação das curvas ROC, onde a Taxa de Falso Negativo (FNR) é plotada no eixo y em vez da Taxa de Verdadeiro Positivo (TPR). As curvas DET fornecem feedback direto sobre o trade-off de erro de detecção para auxiliar na análise do ponto de operação, tornando-as uma ferramenta útil para avaliar o desempenho de algoritmos de classificação.