ML Learning Hub
Non Superviséintermédiaire

Détection d'Anomalies & Valeurs Aberrantes

Trouver le point de données sur mille qui n'a pas sa place

Approches statistiques (Z-Score, IQR) et algorithmiques (Isolation Forest, LOF) pour détecter les observations anormales rares.

35 min
8 diagrammes
7 Concepts Couverts

Prérequis

Probability & Statistics
Model Evaluation

Concepts Couverts

Z-ScoreIQRIsolation ForestLOFOne-Class SVMContaminationAUC-PR

Formules Clés

Z-Score

Écarts-types par rapport à la moyenne — |z| > 3 est conventionnellement anormal

Clôture IQR

Clôtures de Tukey — les points en dehors de cet intervalle sont des anomalies (IQR = Q3-Q1)

Score d'Isolation

Isolation Forest : les anomalies ont des longueurs de chemin moyennes plus courtes h(x)

Score LOF

Facteur d'Anomalie Locale : rapport de densité locale aux densités des voisins

Simulation Interactive

Loading visualization…
🎯

Pourquoi la Détection d'Anomalies Est Importante

motivation

La fraude par carte de crédit coûte 32 milliards de dollars par an. Les attaques d'intrusion réseau causent des billions de dommages. Les pannes d'équipements industriels coûtent 50 milliards de dollars par an. La détection d'anomalies est la première ligne de défense critique dans tous ces systèmes. Le défi central : vous avez rarement des exemples étiquetés d'anomalies (elles sont rares par définition), donc la plupart de la détection d'anomalies est non supervisée — vous apprenez seulement ce que « normal » signifie, puis vous signalez les déviations.

En diagnostic médical, un faux négatif (manquer un cancer) est catastrophique ; en détection de fraude, les faux positifs (bloquer de vrais clients) détruisent les revenus. Choisir le bon seuil est une décision métier.

💡

Le Point de Vue Statistique

intuition

L'intuition la plus simple : les données normales se concentrent dans des régions de haute densité. Les anomalies vivent dans des régions de faible densité. Le Z-Score signale les points à plus de k écarts-types de la moyenne — mais suppose des distributions gaussiennes. Les clôtures IQR sont non paramétriques : elles signalent les points en dehors de 1,5×IQR des quartiles, les rendant robustes aux données non gaussiennes. Les deux sont univariés — ils vérifient chaque caractéristique indépendamment et manquent les anomalies multivariées (une température de 20°C est normale ; une pression de 5 bars est normale ; mais température=20 ET pression=5 ensemble peut être anormal).

⚖️

Méthodes Statistiques vs Algorithmiques

comparison

Le Z-Score et l'IQR sont rapides et interprétables mais supposent l'indépendance et la normalité des caractéristiques. Isolation Forest construit des arbres aléatoires et mesure à quelle vitesse chaque point peut être isolé — les anomalies s'isolent vite car elles sont dans des régions creuses. LOF compare la densité locale de chaque point à celle de ses voisins : si vos voisins sont bien plus denses que vous, vous êtes une anomalie. One-Class SVM trouve la sphère minimale englobant les points normaux. La détection d'anomalies par autoencodeur entraîne un réseau neuronal à reconstruire des données normales — une erreur de reconstruction élevée signale une anomalie.

Isolation Forest passe à l'échelle avec des millions de points et gère bien les données haute dimension. LOF est meilleur pour les données groupées à densités variables. Les autoencodeurs excellents pour la détection d'anomalies dans les images et les séries temporelles.

⚙️

Algorithme de la Forêt d'Isolation

algorithm
1

Construire un ensemble d'arbres d'isolation (arbres binaires aléatoires)

2

Pour chaque arbre : sélectionner aléatoirement une caractéristique, puis une valeur de division aléatoire

3

Récurser jusqu'à ce que chaque point soit isolé (seul dans une feuille)

4

Score d'anomalie = longueur de chemin moyenne à travers tous les arbres

5

Chemin court → point isolé rapidement → anomalie

6

Les points normaux nécessitent plus de divisions → chemin moyen plus long

</>

Détection d'Anomalies avec scikit-learn

code
python39 lines
from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor
from sklearn.svm import OneClassSVM
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_classification
import numpy as np

class="tok-comment"># ── Données dclass="tok-str">'exemple (class="tok-num">5 % d'anomalies) ───────────────────────────────
X_normal, _ = make_classification(n_samples=class="tok-num">475, n_features=class="tok-num">10, random_state=class="tok-num">42)
X_anom  = np.random.randn(class="tok-num">25, class="tok-num">10) * class="tok-num">4    class="tok-comment"># class="tok-num">25 anomalies évidentes
X = np.vstack([X_normal, X_anom])
y_vrai = np.array([class="tok-num">0]*class="tok-num">475 + [class="tok-num">1]*class="tok-num">25)       class="tok-comment"># class="tok-num">0=normal, class="tok-num">1=anomalie

X_normalise = StandardScaler().fit_transform(X)

class="tok-comment"># ── Isolation Forest ───────────────────────────────────────────────
foret = IsolationForest(
    n_estimators=class="tok-num">200,
    contamination=class="tok-num">0.05,   class="tok-comment"># fraction attendue dclass="tok-str">'anomalies
    random_state=class="tok-num">42
)
etiq_foret = foret.fit_predict(X_normalise)  class="tok-comment"># class="tok-num">1=normal, -class="tok-num">1=anomalie
scores_foret = foret.score_samples(X_normalise)  class="tok-comment"># plus bas = plus anormal

class="tok-comment"># ── Facteur d'Anomalie Locale (LOF) ────────────────────────────────
lof = LocalOutlierFactor(n_neighbors=class="tok-num">20, contamination=class="tok-num">0.05)
etiq_lof = lof.fit_predict(X_normalise)

class="tok-comment"># ── Z-Score (univarié, par caractéristique) ─────────────────────────
from scipy import stats
z_scores = np.abs(stats.zscore(X))
masque_anomalies = (z_scores > class="tok-num">3).any(axis=class="tok-num">1)

class="tok-comment"># ── Évaluer avec des étiquettes connues ────────────────────────────
from sklearn.metrics import roc_auc_score, average_precision_score
class="tok-comment"># Convertir : class="tok-num">1=normal → class="tok-num">0, -class="tok-num">1=anomalie → class="tok-num">1
y_pred = (etiq_foret == -class="tok-num">1).astype(int)
print(fclass="tok-str">"AUC-ROC : {roc_auc_score(y_vrai, -scores_foret):.3f}")
print(fclass="tok-str">"AP :      {average_precision_score(y_vrai, -scores_foret):.3f}")
⚠️

Pièges de la Détection d'Anomalies

pitfall

Le paramètre contamination dans Isolation Forest et LOF contrôle directement le seuil de décision. Si vous définissez contamination=0.05 mais que votre taux réel d'anomalies est 0,1%, vous étiquetterez incorrectement de nombreux points normaux comme anomalies. Calibrer toujours avec la connaissance du domaine. Deuxième piège : la haute dimensionnalité brise le Z-Score et les méthodes basées sur la distance. Appliquer l'ACP en premier quand les caractéristiques > 20. Troisième : la dérive de concept — « normal » change avec le temps. Ré-entraîner ou utiliser la détection d'anomalies en ligne pour les données en flux.

Ne jamais évaluer la détection d'anomalies avec la précision — le déséquilibre des classes la rend sans signification. Utiliser Précision@k, AUC-PR (aire sous la courbe précision-rappel), ou F1 au seuil choisi.

?Vérification des Connaissances

La progression est sauvegardée dans votre navigateur — aucun compte requis.

Besoin d'un ingénieur IA ou data scientist ?

Je conçois des modèles ML sur mesure, des agents IA, de la vision par ordinateur et de l'automatisation — de l'idée à la production.