Introduction
Dans ce tutoriel, nous allons apprendre à connaître les courbes de compromis entre erreurs de détection (DET) et les comparer aux courbes Caractéristique Opérative du Récepteur (ROC). Les courbes DET sont une variante des courbes ROC, où le taux de faux négatifs (FNR) est représenté sur l'axe des ordonnées au lieu du taux de vrais positifs (TPR). Nous utiliserons scikit-learn, une bibliothèque Python populaire pour l'apprentissage automatique, pour générer des données synthétiques et comparer les performances statistiques de deux classifieurs pour différents seuils en utilisant les courbes ROC et DET.
Conseils sur la machine virtuelle
Une fois le démarrage de la machine virtuelle terminé, cliquez dans le coin supérieur gauche pour basculer vers l'onglet Carnet de notes pour accéder au carnet Jupyter Notebook pour pratiquer.
Parfois, vous devrez peut-être attendre quelques secondes pour que le carnet Jupyter Notebook soit chargé. La validation des opérations ne peut pas être automatisée en raison des limitations du carnet Jupyter Notebook.
Si vous rencontrez des problèmes pendant l'apprentissage, n'hésitez pas à demander à Labby. Donnez votre feedback après la session, et nous résoudrons rapidement le problème pour vous.
Générer des données synthétiques
Nous allons utiliser la fonction make_classification de scikit-learn pour générer des données synthétiques. Cette fonction génère un problème de classification aléatoire à n classes, avec n_informative caractéristiques informatives, n_redundant caractéristiques redondantes et n_clusters_per_class grappes par classe. Nous allons générer 1000 échantillons avec 2 caractéristiques informatives et un état aléatoire de 1. Nous allons ensuite diviser les données en ensembles d'entraînement et de test avec un ratio 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)
Définir les classifieurs
Nous allons définir deux classifieurs différents pour comparer leurs performances statistiques pour différents seuils en utilisant les courbes ROC et DET. Nous utiliserons la fonction make_pipeline de scikit-learn pour créer un pipeline qui met à l'échelle les données à l'aide de StandardScaler et entraîne un classifieur LinearSVC. Nous utiliserons également la classe RandomForestClassifier de scikit-learn pour entraîner un classifieur forêt aléatoire avec une profondeur maximale de 5, 10 estimateurs et un maximum de 1 caractéristique.
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
),
}
Tracer les courbes ROC et DET
Nous utiliserons les classes RocCurveDisplay et DetCurveDisplay de scikit-learn pour tracer respectivement les courbes ROC et DET. La fonction RocCurveDisplay.from_estimator calcule la courbe ROC et la trace sur l'axe donné. De manière similaire, la fonction DetCurveDisplay.from_estimator calcule la courbe DET et la trace sur l'axe donné. Nous allons créer deux sous-graphiques, l'un pour les courbes ROC et l'autre pour les courbes DET, et tracer les courbes pour chaque classifieur.
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()
Interprétation des résultats
Il est plus facile d'évaluer visuellement la performance globale de différents algorithmes de classification en utilisant les courbes DET plutôt qu'en utilisant les courbes ROC. Les courbes DET donnent des informations directes sur le compromis entre les erreurs de détection pour faciliter l'analyse des points d'opération. L'utilisateur peut ensuite décider du taux de faux négatifs (FNR) qu'il est prêt à accepter au détriment du taux de faux positifs (FPR) (ou vice-versa).
Résumé
Dans ce tutoriel, nous avons appris sur les courbes de compromis entre les erreurs de détection (DET) et les avons comparées avec les courbes Caractéristique de l'Opérateur de Réception (ROC). Nous avons utilisé scikit-learn pour générer des données synthétiques et comparer les performances statistiques de deux classifieurs pour différents seuils en utilisant les courbes ROC et DET. Les courbes DET sont une variante des courbes ROC, où le taux de faux négatifs (FNR) est représenté sur l'axe des ordonnées au lieu du taux de vrais positifs (TPR). Les courbes DET donnent des informations directes sur le compromis entre les erreurs de détection pour faciliter l'analyse des points d'opération, ce qui les rend un outil utile pour évaluer les performances des algorithmes de classification.