Curva de compensación de errores de detección

Machine LearningMachine LearningBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este tutorial, aprenderemos sobre las curvas de compensación de errores de detección (DET) y las compararemos con las curvas Característica de Operación del Receptor (ROC). Las curvas DET son una variación de las curvas ROC, donde la Tasa de Falsos Negativos (FNR) se grafica en el eje y en lugar de la Tasa de Verdaderos Positivos (TPR). Usaremos scikit-learn, una popular biblioteca de Python para aprendizaje automático, para generar datos sintéticos y comparar el rendimiento estadístico de dos clasificadores en diferentes umbrales utilizando curvas ROC y DET.

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 las 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 sus comentarios después de la sesión y resolveremos el problema rápidamente para usted.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/ensemble("Ensemble Methods") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/preprocessing("Preprocessing and Normalization") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/pipeline("Pipeline") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/metrics("Metrics") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/ensemble -.-> lab-49103{{"Curva de compensación de errores de detección"}} sklearn/svm -.-> lab-49103{{"Curva de compensación de errores de detección"}} sklearn/preprocessing -.-> lab-49103{{"Curva de compensación de errores de detección"}} sklearn/pipeline -.-> lab-49103{{"Curva de compensación de errores de detección"}} sklearn/model_selection -.-> lab-49103{{"Curva de compensación de errores de detección"}} sklearn/metrics -.-> lab-49103{{"Curva de compensación de errores de detección"}} sklearn/datasets -.-> lab-49103{{"Curva de compensación de errores de detección"}} ml/sklearn -.-> lab-49103{{"Curva de compensación de errores de detección"}} end

Generar datos sintéticos

Usaremos la función make_classification de scikit-learn para generar datos sintéticos. Esta función genera un problema de clasificación aleatorio de n clases, con n_informative características informativas, n_redundant características redundantes y n_clusters_per_class clusters por clase. Generaremos 1000 muestras con 2 características informativas y un estado aleatorio de 1. Luego dividiremos los datos en conjuntos de entrenamiento y prueba con una proporción 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 los clasificadores

Definiremos dos clasificadores diferentes para comparar su rendimiento estadístico en diferentes umbrales utilizando curvas ROC y DET. Usaremos la función make_pipeline de scikit-learn para crear una canalización que escala los datos utilizando StandardScaler y entrena un clasificador LinearSVC. También usaremos la clase RandomForestClassifier de scikit-learn para entrenar un clasificador de bosque aleatorio con una profundidad máxima de 5, 10 estimadores y un 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
    ),
}

Trazar curvas ROC y DET

Usaremos las clases RocCurveDisplay y DetCurveDisplay de scikit-learn para trazar las curvas ROC y DET, respectivamente. La función RocCurveDisplay.from_estimator calcula la curva ROC y la traza en el eje dado. Del mismo modo, la función DetCurveDisplay.from_estimator calcula la curva DET y la traza en el eje dado. Crearemos dos subgráficos, uno para las curvas ROC y otro para las curvas DET, y trazaremos las curvas para cada clasificador.

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("Receiver Operating Characteristic (ROC) curves")
ax_det.set_title("Detection Error Tradeoff (DET) curves")

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

plt.legend()
plt.show()

Interpretación de los resultados

Es más fácil evaluar visualmente el rendimiento general de diferentes algoritmos de clasificación utilizando curvas DET que utilizando curvas ROC. Las curvas DET dan retroalimentación directa de la compensación de errores de detección para ayudar en el análisis de los puntos de operación. El usuario puede entonces decidir la FNR que está dispuesto a aceptar a expensas de la FPR (o viceversa).

Resumen

En este tutorial, aprendimos sobre las curvas de compensación de errores de detección (DET en inglés) y las comparamos con las curvas Característica del Operador Receptor (ROC en inglés). Usamos scikit-learn para generar datos sintéticos y comparar el rendimiento estadístico de dos clasificadores en diferentes umbrales utilizando curvas ROC y DET. Las curvas DET son una variación de las curvas ROC, donde la Tasa de Falsos Negativos (FNR en inglés) se grafica en el eje y en lugar de la Tasa de Verdaderos Positivos (TPR en inglés). Las curvas DET dan retroalimentación directa de la compensación de errores de detección para ayudar en el análisis de los puntos de operación, lo que las convierte en una herramienta útil para evaluar el rendimiento de los algoritmos de clasificación.