Anomalidetektion
Kunna hitta avvikelser med statistiska och avståndsbaserade metoder.
Förkunskaper
Intuition
Anomalidetektion är klassificering där den intressanta klassen är mycket ovanlig (0,01–1 %) och ofta saknar etiketter.
| Metod | Idé | Passar |
|---|---|---|
| z-poäng / IQR | långt från medelvärdet | en dimension, ungefär normalfördelat |
| Isolation Forest | avvikelser isoleras med få slumpmässiga snitt | tabelldata, många dimensioner |
| LOF | lokal täthet lägre än grannarnas | kluster med olika täthet |
| One-class SVM | lär en gräns runt det normala | små dataset |
| Autoencoder | högt rekonstruktionsfel = avvikande | bilder, sekvenser, komplex struktur |
Det svåra är inte metoden utan tröskeln. Med 0,1 % anomalier och ett larm på 1 % av datan är nio av tio larm falska — även med en bra modell. Det är basfrekvensproblemet igen.
Kod
import numpy as np
from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor
# contamination = din förväntan om andelen avvikelser — sätt den medvetet
iso = IsolationForest(contamination=0.01, random_state=0).fit(X_tr)
poang = -iso.score_samples(X_test) # högre = mer avvikande
# Tröskeln sätts av hur många larm verksamheten orkar hantera
kapacitet_per_dag = 50
trosk = np.percentile(poang, 100 * (1 - kapacitet_per_dag / len(poang)))
larm = poang >= trosk
print(f"{larm.sum()} larm av {len(poang)} ({larm.mean():.2%})")
if y_test is not None: # om etiketter finns för utvärdering
from sklearn.metrics import precision_score, recall_score, average_precision_score
print("precision", round(precision_score(y_test, larm), 3),
"recall", round(recall_score(y_test, larm), 3),
"AP", round(average_precision_score(y_test, poang), 3))
Använd PR-AUC (average precision), inte ROC-AUC. Vid extrem obalans ser ROC-AUC bra ut även för en modell som är oanvändbar i praktiken, eftersom den domineras av de många negativa exemplen.
Dimensionera efter kapacitet: fråga «hur många larm kan någon faktiskt granska per dag?» och sätt tröskeln därefter. En perfekt modell med 500 larm per dag och tre granskare är värdelös.
Behärskning innebär
- Hittar avvikelser med statistiska och avståndsbaserade metoder
- Hanterar extrem obalans
- Väljer tröskel efter kostnad
Logga in för att göra övningarna och bygga upp din behärskning.
Källor
- scikit-learn User Guide (BSD-3) — BSD-3-Clause
- Wikipedia — Anomaly detection (CC BY-SA 4.0) — CC BY-SA 4.0