Faza 02 · lecția 16
Detectarea anomaliilor
Scopul lecției: Tip: Construire Limbaj: Python Cerințe preliminare: Faza 2, lecțiile 01–09 Durată: ~75 de minute
Versiunea curentă AlexBred.com: primele 100 de lecții ale programului în limba română.
Cuprinsul lecției
- Obiective de învățare
- Problema
- Conceptul
- Tipuri de anomalii
- Formularea nesupravegheată
- Supravegheat în raport cu nesupravegheat: compromisul
- Metoda Z-score
- Metoda IQR
- Isolation Forest
- Local Outlier Factor (LOF)
- Comparație
- Provocările evaluării
- Pipeline de detectare a anomaliilor
- Construiți
- Detectorul Z-score
- Detectorul IQR
- Isolation Forest de la zero
- Scenarii demonstrative
- Folosiți
- Parametrul contamination din sklearn
- One-Class SVM
- Abordarea cu autoencoder (avanpremieră)
- Detectarea anomaliilor prin ansamblu
- Considerații pentru producție
- Livrați
- Alegerea unui prag
- Scalarea în producție
- Exerciții
- Termeni-cheie
- Lecturi suplimentare
Normalul este ușor de definit. Anormal este tot ce nu se potrivește.
Tip: Construire Limbaj: Python Cerințe preliminare: Faza 2, lecțiile 01–09 Durată: ~75 de minute
Obiective de învățare
- Implementați de la zero metodele Z-score, IQR și Isolation Forest pentru detectarea anomaliilor
- Distingeți între anomaliile punctuale, contextuale și colective și selectați metoda de detectare potrivită fiecăreia
- Explicați de ce detectarea anomaliilor este formulată drept modelarea datelor normale, nu drept clasificarea anomaliilor
- Comparați detectarea nesupravegheată a anomaliilor cu clasificarea supravegheată și evaluați compromisul dintre acoperirea anomaliilor noi și precizie
Problema
Un card de credit este folosit în New York la ora 14:00, apoi în Tokyo la 14:05. Un senzor dintr-o fabrică indică 150 de grade, când intervalul normal este 80–120. Un server trimite 50.000 de cereri pe secundă, când media zilnică este 200.
Acestea sunt anomalii. Detectarea lor contează. Frauda costă miliarde. Defecțiunile echipamentelor provoacă timpi de nefuncționare. Intruziunile în rețea costă date.
Provocarea: rareori aveți exemple etichetate de anomalii. Frauda reprezintă 0,1% dintre tranzacții. Defecțiunile echipamentelor apar de câteva ori pe an. Nu puteți antrena un clasificator standard, deoarece aproape că nu există nimic în clasa „anomalie” din care să învețe. Chiar dacă aveți câteva etichete, anomaliile pe care le-ați observat nu sunt singurele tipuri pe care le veți întâlni. Schema de fraudă de mâine arată diferit de cea de astăzi.
Detectarea anomaliilor inversează problema. În loc să învățați ce este anormal, învățați ce este normal. Orice se abate de la normal este suspect. Aceasta funcționează fără etichete, se adaptează la tipuri noi de anomalii și se extinde la seturi masive de date.
Notă tehnică a traducerii: Raritatea clasei pozitive nu face imposibilă clasificarea supravegheată; ponderarea claselor, eșantionarea și modelele adaptate dezechilibrului pot fi utile dacă există etichete reprezentative. Nici detectarea nesupravegheată nu garantează descoperirea fraudelor noi, adaptarea la schimbarea distribuției sau scalarea: deviațiile benigne pot primi scoruri mari, iar noile anomalii pot semăna cu datele normale.
Conceptul
Tipuri de anomalii
Nu toate anomaliile sunt la fel:
- Anomalii punctuale. Un singur punct de date neobișnuit indiferent de context. O temperatură de 500 de grade. O tranzacție de 50.000 $ dintr-un cont care cheltuiește în mod normal 50 $.
- Anomalii contextuale. Un punct de date neobișnuit în contextul său. O temperatură de 90 de grade este normală vara, dar anormală iarna. Aceeași valoare, alt context.
- Anomalii colective. O secvență de puncte de date neobișnuită ca grup, chiar dacă fiecare punct individual ar putea fi normal. Cinci autentificări eșuate sunt normale. Cincizeci la rând reprezintă un atac de forță brută.
Majoritatea metodelor detectează anomalii punctuale. Anomaliile contextuale necesită caracteristici de timp sau de locație. Anomaliile colective necesită metode care țin cont de secvențe.
Formularea nesupravegheată
În clasificarea standard, aveți etichete pentru ambele clase. În detectarea anomaliilor, vă aflați de obicei într-una dintre următoarele trei situații:
- Complet nesupravegheată. Nu există deloc etichete. Ajustați detectorul pe toate datele și sperați că anomaliile sunt suficient de rare pentru a nu corupe modelul „normalului”.
- Semisupervizată. Aveți un set de date curat, care conține numai date normale. Ajustați modelul pe acest set curat și atribuiți scoruri tuturor celorlalte date. Aceasta este cea mai puternică configurație atunci când este posibilă.
- Slab supervizată. Aveți câteva anomalii etichetate. Folosiți-le pentru evaluare, nu pentru antrenare. Antrenați nesupravegheat, apoi măsurați precizia/recall pe subsetul etichetat.
Ideea-cheie: detectarea anomaliilor este fundamental diferită de clasificare. Modelați distribuția datelor normale, nu frontiera de decizie dintre două clase.
Notă tehnică a traducerii: Terminologia nu este universală. Antrenarea numai pe exemple normale este numită frecvent novelty detection sau configurație semisupervizată. „Supravegherea slabă” poate desemna folosirea efectivă la antrenare a unor etichete incomplete ori zgomotoase; folosirea câtorva etichete exclusiv pentru evaluare rămâne o procedură nesupravegheată evaluată cu etichete. În plus, Isolation Forest și LOF atribuie scoruri fără a estima explicit o distribuție probabilistică a normalului.
Supravegheat în raport cu nesupravegheat: compromisul
Dacă aveți anomalii etichetate, ar trebui să le folosiți pentru antrenare (clasificare supravegheată) sau numai pentru evaluare (detectare nesupravegheată)?
Supravegheat (tratat drept clasificare):
- Detectează exact tipurile de anomalii observate anterior
- Precizie mai mare pentru tipurile de anomalii cunoscute
- Ratează complet tipurile noi de anomalii
- Necesită reantrenare când apar tipuri noi de anomalii
- Necesită suficiente exemple de anomalii (adesea prea puține)
Nesupravegheat (modelează normalul, semnalează abaterile):
- Detectează orice abatere de la normal, inclusiv tipuri noi
- Nu necesită anomalii etichetate
- Rată mai mare de rezultate fals pozitive (nu orice lucru neobișnuit este rău)
- Mai robust la schimbarea distribuției
În practică, cele mai bune sisteme le combină pe amândouă: detectare nesupravegheată pentru acoperire largă, modele supravegheate pentru tipuri cunoscute de anomalii cu prioritate mare și verificare umană pentru cazurile ambigue.
Notă tehnică a traducerii: Niciuna dintre liste nu reprezintă o garanție. Clasificatoarele pot generaliza dincolo de tiparele văzute, iar detectoarele nesupravegheate pot rata abateri sau pot reacționa puternic la schimbări benigne ale distribuției. Combinarea metodelor poate ajuta, dar trebuie validată pentru costurile și prevalența din mediul de utilizare.
Metoda Z-score
Cea mai simplă abordare. Calculați media și abaterea standard a fiecărei caracteristici. Semnalați orice punct aflat la mai mult de k abateri standard față de medie.
z_score = (x - medie) / abatere_standard
anomalie dacă |z_score| > prag
Pragul implicit este 3,0 (99,7% dintre datele normale se află în intervalul de 3 abateri standard pentru o distribuție gaussiană).
Puncte forte: Simplă. Rapidă. Interpretabilă („această valoare este la 4,5 abateri standard față de normal”).
Puncte slabe: Presupune că datele au o distribuție normală. Este sensibilă la valorile atipice din datele de antrenare (valorile atipice deplasează media și măresc abaterea standard, devenind mai greu de detectat). Eșuează pe distribuții multimodale.
Când funcționează bine: Monitorizarea unei singure caracteristici, când datele au aproximativ formă de clopot. Timpi de răspuns ai serverului, toleranțe de fabricație, citiri ale senzorilor cu niveluri de bază stabile.
Când eșuează: Date cu mai multe clustere (două sedii cu temperaturi de bază diferite), date asimetrice (sume ale tranzacțiilor în care 1.000 $ este rar, dar nu anormal), date cu valori atipice în setul de antrenare.
Notă tehnică a traducerii: Regula de 99,7% este regula empirică pentru o distribuție normală univariată. Dacă un punct este semnalat atunci când oricare dintre multe caracteristici depășește pragul, rata totală de alarmă sub normalitate poate fi mult mai mare de 0,3% și depinde de numărul și dependența caracteristicilor.
Metoda IQR
Este mai robustă decât Z-score. Folosește intervalul intercuartil în locul mediei și abaterii standard.
Q1 = percentila 25
Q3 = percentila 75
IQR = Q3 - Q1
limită_inferioară = Q1 - factor * IQR
limită_superioară = Q3 + factor * IQR
anomalie dacă x < limită_inferioară sau x > limită_superioară
Factorul implicit este 1,5.
Puncte forte: Robustă la valorile extreme (percentilele nu sunt afectate de valorile extreme). Funcționează pe distribuții asimetrice. Nu presupune normalitate.
Puncte slabe: Numai univariată (se aplică independent fiecărei caracteristici). Nu poate detecta anomalii neobișnuite numai atunci când caracteristicile sunt considerate împreună (un punct poate fi normal în fiecare caracteristică luată separat, dar anormal în spațiul comun).
Notă practică: Factorul 1,5 din IQR corespunde mustăților dintr-o diagramă box plot. Punctele din afara mustăților sunt potențiale valori atipice. Folosirea lui 3,0 în loc de 1,5 face detectorul mai conservator (mai puține semnalări, mai puține rezultate fals pozitive). Factorul potrivit depinde de toleranța la alarme false.
Notă tehnică a traducerii: Cuartilele și IQR au o influență limitată a valorilor extreme, dar nu sunt literalmente neafectate de contaminare. Regula 1,5×IQR identifică puncte potențial atipice, nu anomalii verificate, iar pe distribuții asimetrice poate semnala valori legitime din cozi. Aplicarea „oricărei caracteristici” are și aici un efect de comparații multiple.
Isolation Forest
Ideea-cheie: anomaliile sunt puține și diferite. Într-o partiționare aleatoare a datelor, anomaliile sunt mai ușor de izolat — au nevoie de mai puține divizări aleatoare pentru a fi separate de restul.
Cum funcționează:
- Construiți mulți arbori aleatori (o pădure de izolare)
- În fiecare nod, alegeți o caracteristică aleatoare și o valoare de divizare aleatoare între minimul și maximul caracteristicii
- Continuați divizarea până când fiecare punct este izolat (în propria frunză)
- Anomaliile au lungimi medii mai mici ale traseelor în toți arborii
De ce funcționează: Punctele normale se află în regiuni dense. Sunt necesare multe divizări aleatoare pentru a izola unul de vecinii săi. Anomaliile se află în regiuni rare. Una sau două divizări aleatoare sunt suficiente pentru a le izola.
Scorul anomaliei se bazează pe lungimea medie a traseului în toți arborii, normalizată prin lungimea așteptată a traseului într-un arbore binar aleator de căutare:
scor(x) = 2^(-lungimea_medie_a_traseului(x) / c(n))
Unde c(n) este lungimea așteptată a traseului pentru n eșantioane. Un scor apropiat de 1 indică o anomalie. Un scor apropiat de 0,5 indică normalitatea. Un scor apropiat de 0 indică un punct foarte normal (adânc în clustere dense).
Puncte forte: Nu presupune o distribuție. Funcționează în dimensiuni mari. Se scalează bine datorită subeșantionării; pentru un număr fix de arbori și o dimensiune fixă a subeșantionului, costul crește liniar cu numărul de eșantioane procesate. Gestionează tipuri mixte de caracteristici.
Notă tehnică a traducerii: articolul original despre Isolation Forest descrie complexitatea ca liniară, cu o constantă mică; subeșantionarea reduce costul fiecărui arbore, dar nu transformă complexitatea totală într-una subliniară în raport cu datele parcurse.
Puncte slabe: Are dificultăți cu anomaliile din regiuni dense (efect de mascare). Divizarea aleatoare este mai puțin eficientă când multe caracteristici sunt irelevante.
Hiperparametri-cheie:
n_estimators: Numărul de arbori. De obicei sunt suficienți 100. Mai mulți arbori produc scoruri mai stabile, dar încetinesc calculul.max_samples: Numărul de eșantioane pentru fiecare arbore. 256 este valoarea implicită din articolul original. Valorile mai mici fac arborii individuali mai puțin exacți, dar sporesc diversitatea. Subeșantionarea face ca Isolation Forest să fie rapid — fiecare arbore vede o mică parte din date.contamination: Fracțiunea așteptată de anomalii. Este folosită numai la stabilirea pragului. Nu afectează scorurile propriu-zise.
Notă tehnică a traducerii: Arborii de izolare au o limită de înălțime și pot lăsa mai multe observații într-o frunză, cu o corecție a lungimii traseului; nu izolează neapărat fiecare punct. Metoda necesită caracteristici numerice sau codificate, iar performanța se poate degrada în multe dimensiuni irelevante. În scikit-learn,
max_samples="auto"foloseștemin(256, n_samples);contaminationstabilește offsetul de decizie, nu arborii ori scorurile brute.
Local Outlier Factor (LOF)
LOF compară densitatea locală din jurul unui punct cu densitatea din jurul vecinilor săi. Un punct dintr-o regiune rară, înconjurată de regiuni dense, este anormal.
Cum funcționează:
- Pentru fiecare punct, găsiți cei k vecini cei mai apropiați
- Calculați densitatea locală de accesibilitate (cât de densă este vecinătatea)
- Comparați densitatea fiecărui punct cu densitățile vecinilor săi
- Dacă un punct are o densitate mult mai mică decât vecinii, este o valoare atipică
Scor LOF:
- Un LOF apropiat de 1,0 înseamnă o densitate similară cu a vecinilor (normal)
- Un LOF mai mare de 1,0 înseamnă o densitate mai mică decât a vecinilor (potențial anormal)
- Un LOF mult mai mare de 1,0 (de exemplu, 2,0+) înseamnă o densitate semnificativ mai mică (anomalie probabilă)
Partea „locală” este esențială. Luați un set de date cu două clustere: un cluster dens de 1.000 de puncte și unul rar de 50 de puncte. Un punct de la marginea clusterului rar nu este neobișnuit global — are 50 de vecini. Dar este neobișnuit local dacă vecinii săi imediați sunt mai denși decât el. LOF surprinde această nuanță ratată de metodele globale.
Puncte forte: Detectează anomalii locale (puncte neobișnuite în vecinătatea lor, chiar dacă nu sunt neobișnuite global). Funcționează pe clustere cu densități diferite.
Puncte slabe: Lentă pe seturi mari de date (O(n^2) pentru implementarea naivă). Sensibilă la alegerea lui k. Nu funcționează bine în dimensiuni foarte mari (blestemul dimensionalității afectează calcularea distanțelor).
Notă tehnică a traducerii: Scorul LOF original este mai mare pentru puncte mai anormale, dar scikit-learn expune pentru datele de antrenare
negative_outlier_factor_, adică opusul scorului. Cunovelty=True,predict,decision_functionșiscore_samplestrebuie folosite numai pe observații noi, nu pe setul folosit la ajustare.
Comparație
| Metodă | Ipoteze | Viteză | Gestionează multe dimensiuni | Detectează anomalii locale |
|---|---|---|---|---|
| Z-score | Distribuție normală | Foarte rapidă | Da (pe caracteristică) | Nu |
| IQR | Niciuna (pe caracteristică) | Foarte rapidă | Da (pe caracteristică) | Nu |
| Isolation Forest | Niciuna | Rapidă | Da | Parțial |
| LOF | Distanța este semnificativă | Lentă | Slab | Da |
Provocările evaluării
Evaluarea detectoarelor de anomalii este mai dificilă decât evaluarea clasificatoarelor:
- Dezechilibru extrem al claselor. Cu 0,1% anomalii, predicția „normal” pentru orice punct produce o acuratețe de 99,9%. Acuratețea este inutilă.
- AUROC induce în eroare. Cu un dezechilibru puternic, AUROC poate arăta bine chiar și când modelul ratează majoritatea anomaliilor la praguri practice.
- Metrici mai bune: Precision@k (dintre primele k elemente semnalate, câte sunt anomalii reale), AUPRC (aria de sub curba precizie–recall) și recall la o rată fixă de rezultate fals pozitive.
Notă tehnică a traducerii: AUROC măsoară o proprietate de ordonare și nu devine matematic invalidă numai din cauza dezechilibrului, dar poate ascunde un număr operațional mare de rezultate fals pozitive. Curbele PR și AUPRC fac performanța clasei rare mai vizibilă, însă depind de prevalență; metricile trebuie alese împreună cu pragul și costurile aplicației.
Pipeline de detectare a anomaliilor
În practică, detectarea anomaliilor urmează acest flux:
- Colectați date de bază. În mod ideal, o perioadă despre care știți că nu conține anomalii (sau conține foarte puține).
- Proiectați caracteristici. Caracteristici brute plus caracteristici derivate (statistici mobile, caracteristici de timp, rapoarte).
- Antrenați detectorul. Ajustați-l pe datele de bază. Modelul învață cum arată „normalul”.
- Atribuiți scoruri datelor noi. Fiecare observație nouă primește un scor de anomalie.
- Selectați pragul. Alegeți valoarea-limită a scorului. Aceasta este o decizie de afaceri: un prag mai mare înseamnă mai puține alarme false, dar mai multe anomalii ratate.
- Alertați și investigați. Punctele semnalate sunt trimise spre verificare umană sau răspuns automat.
- Colectați feedback. Înregistrați dacă elementele semnalate au fost anomalii reale sau alarme false. Folosiți aceste date pentru a evalua detectorul și a regla pragul în timp.
Pipeline-ul nu este niciodată „terminat”. Distribuțiile datelor se schimbă, apar tipuri noi de anomalii, iar pragurile trebuie ajustate. Tratați detectarea anomaliilor drept un sistem viu, nu un model construit o singură dată.
Notă tehnică a traducerii: Un prag mai mare produce mai puține semnalări numai dacă scorurile mai mari înseamnă observații mai anormale; unele API-uri folosesc semnul opus. Datele de bază presupus „curate” trebuie auditate, deoarece contaminarea sau schimbarea sezonieră pot modifica modelul normalului și pragurile.
Construiți
Codul din code/anomaly_detection.py implementează de la zero Z-score, IQR și Isolation Forest.
Detectorul Z-score
def zscore_detect(X, threshold=3.0):
mean = X.mean(axis=0)
std = X.std(axis=0)
std[std == 0] = 1.0
z = np.abs((X - mean) / std)
return z.max(axis=1) > threshold
Simplu și vectorizat. Semnalează un punct dacă oricare dintre caracteristici depășește pragul.
Notă tehnică a traducerii: Fragmentul returnează numai masca booleană, dar funcția din fișierul complet returnează tuplul
(labels, scores), undescoreseste valoarea Z maximă pe caracteristici. Codul care consumă funcția trebuie să folosească interfața implementării reale.
Detectorul IQR
def iqr_detect(X, factor=1.5):
q1 = np.percentile(X, 25, axis=0)
q3 = np.percentile(X, 75, axis=0)
iqr = q3 - q1
iqr[iqr == 0] = 1.0
lower = q1 - factor * iqr
upper = q3 + factor * iqr
outside = (X < lower) | (X > upper)
return outside.any(axis=1)
Notă tehnică a traducerii: Și acest fragment returnează numai masca, în timp ce implementarea completă returnează
(labels, scores). Înlocuirea unui IQR zero cu1.0este dependentă de scară și creează limite artificiale în jurul unei caracteristici constante; o alternativă este ignorarea caracteristicii constante ori tratarea ei explicită.
Isolation Forest de la zero
Implementarea de la zero construiește arbori de izolare care partiționează aleatoriu spațiul caracteristicilor:
class IsolationTree:
def __init__(self, max_depth):
self.max_depth = max_depth
def fit(self, X, depth=0):
n, p = X.shape
if depth >= self.max_depth or n <= 1:
self.is_leaf = True
self.size = n
return self
self.is_leaf = False
self.feature = np.random.randint(p)
x_min = X[:, self.feature].min()
x_max = X[:, self.feature].max()
if x_min == x_max:
self.is_leaf = True
self.size = n
return self
self.threshold = np.random.uniform(x_min, x_max)
left_mask = X[:, self.feature] < self.threshold
self.left = IsolationTree(self.max_depth).fit(X[left_mask], depth + 1)
self.right = IsolationTree(self.max_depth).fit(X[~left_mask], depth + 1)
return self
Lungimea traseului necesar pentru izolarea unui punct determină scorul anomaliei. Traseele mai scurte indică puncte mai anormale.
Clasa IsolationForest învelește mai mulți arbori:
class IsolationForest:
def __init__(self, n_estimators=100, max_samples=256, seed=42):
self.n_estimators = n_estimators
self.max_samples = max_samples
def fit(self, X):
sample_size = min(self.max_samples, X.shape[0])
max_depth = int(np.ceil(np.log2(sample_size)))
for _ in range(self.n_estimators):
idx = rng.choice(X.shape[0], size=sample_size, replace=False)
tree = IsolationTree(max_depth=max_depth)
tree.fit(X[idx])
self.trees.append(tree)
def anomaly_score(self, X):
avg_path = average path length across all trees
scores = 2.0 ** (-avg_path / c(max_samples))
return scores
Factorul de normalizare c(n) este lungimea așteptată a unei căutări nereușite într-un arbore binar de căutare cu n elemente. Este egal cu 2 * H(n-1) - 2*(n-1)/n, unde H este numărul armonic. Normalizarea asigură comparabilitatea scorurilor între seturi de date de dimensiuni diferite.
Notă tehnică a traducerii: Al doilea bloc marcat
pythoneste pseudocod și nu rulează: liniaavg_path = average path length across all treesnu este sintaxă Python, iarrng,self.trees,cșimax_samplesnu sunt definite în fragment. Fișierul complet definește aceste elemente, dar aproximăH(n-1)prinlog(n-1) + gamma, deci nu calculează exact numărul armonic. În plus, dacă arborele complet alege o caracteristică constantă, se oprește imediat în acea frunză, chiar dacă alte caracteristici ar permite o divizare.
Scenarii demonstrative
Codul generează mai multe scenarii de testare:
- Un singur cluster cu valori atipice. Un cluster gaussian 2D cu anomalii injectate departe de centru. Toate metodele ar trebui să funcționeze aici.
- Date multimodale. Trei clustere cu dimensiuni și densități diferite. Punctele dintre clustere sunt anormale. Z-score are dificultăți, deoarece intervalele fiecărei caracteristici sunt largi.
- Date cu dimensionalitate mare. 50 de caracteristici, dar anomaliile diferă numai în 5 dintre ele. Testează dacă metodele pot găsi anomalii într-un subset de caracteristici.
Fiecare demonstrație compară toate metodele folosind precizie, recall, F1 și Precision@k.
Notă tehnică a traducerii: Revizia actuală a
code/anomaly_detection.pyimplementează demonstrațiile pentru un singur cluster și pentru date multimodale, dar nu conține generatorul ori demonstrația cu 50 de caracteristici. De asemenea, compară Z-score, IQR și implementarea proprie Isolation Forest, nu toate metodele discutate în lecție și nu LOF.
Folosiți
Cu sklearn (folosind implementările bibliotecii, nu pe cele de la zero):
from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor
iso = IsolationForest(n_estimators=100, contamination=0.05, random_state=42)
iso.fit(X_train)
predictions = iso.predict(X_test)
lof = LocalOutlierFactor(n_neighbors=20, contamination=0.05, novelty=True)
lof.fit(X_train)
predictions = lof.predict(X_test)
Observați că contamination stabilește fracțiunea așteptată de anomalii. Setarea ei corectă contează — o valoare prea mică ratează anomalii, iar una prea mare creează alarme false.
Codul din anomaly_detection.py compară implementările de la zero cu sklearn pe aceleași date.
Notă tehnică a traducerii: Fișierul complet nu importă sklearn și nu face comparația declarată. În plus, predicțiile sklearn folosesc convenția
1pentru observații normale și-1pentru valori atipice. PentruLocalOutlierFactor(novelty=True), metodele de predicție și scor trebuie aplicate numai datelor noi, nu setuluiX_trainfolosit la ajustare.
Parametrul contamination din sklearn
Parametrul contamination din sklearn determină pragul pentru convertirea scorurilor continue de anomalie în predicții binare. Nu modifică scorurile subiacente.
iso_5 = IsolationForest(contamination=0.05)
iso_10 = IsolationForest(contamination=0.10)
Ambele produc aceleași scoruri de anomalie. Dar iso_5 semnalează primele 5%, iar iso_10 semnalează primele 10%. Dacă nu cunoașteți rata reală a anomaliilor (de obicei nu o cunoașteți), setați contamination la „auto” și lucrați direct cu scorurile brute. Stabiliți propriul prag pe baza compromisului de cost între rezultate fals pozitive și fals negative.
Notă tehnică a traducerii:
contaminationnu schimbă arborii unui model dat, dar cele două obiecte din fragment nu au acelașirandom_state; dacă sunt ajustate separat, arborii și scorurile lor brute pot diferi aleatoriu. Pentru comparație trebuie fixată aceeași sămânță. În scikit-learn,contamination="auto"stabilește pragul conform articolului original; nu estimează automat prevalența și nu semnalează o fracțiune învățată a datelor.
One-Class SVM
Un alt detector nesupravegheat de anomalii care merită cunoscut. One-Class SVM ajustează o frontieră în jurul datelor normale într-un spațiu de caracteristici cu dimensionalitate mare (folosind trucul nucleului).
from sklearn.svm import OneClassSVM
oc_svm = OneClassSVM(kernel="rbf", gamma="auto", nu=0.05)
oc_svm.fit(X_train)
predictions = oc_svm.predict(X_test)
Parametrul nu aproximează fracțiunea de anomalii. One-Class SVM funcționează bine pe seturi de date mici și medii, dar nu se scalează la date foarte mari (matricea nucleului crește pătratic).
Notă tehnică a traducerii: În formularea One-Class SVM,
nueste o limită superioară pentru fracțiunea erorilor de antrenare și o limită inferioară pentru fracțiunea vectorilor suport; nu este pur și simplu o estimare a proporției de anomalii. Performanța și scalarea depind și de nucleu,gamma, toleranță și distribuția datelor.
Abordarea cu autoencoder (avanpremieră)
Autoencoderele sunt rețele neurale care învață să comprime și să reconstruiască datele. Antrenați-le pe date normale. La testare, anomaliile au o eroare mare de reconstrucție, deoarece rețeaua a învățat să reconstruiască numai tipare normale.
Acest subiect este tratat în Faza 3 (Învățare profundă), dar principiul este același: modelați normalul și semnalați abaterile.
Notă tehnică a traducerii: O eroare mare de reconstrucție este o euristică, nu o consecință garantată. Un autoencoder cu capacitate mare poate reconstrui bine și unele anomalii, iar anumite observații normale pot avea eroare mare; separarea depinde de arhitectură, regularizare, contaminarea datelor și prag.
Detectarea anomaliilor prin ansamblu
La fel cum metodele de ansamblu îmbunătățesc clasificarea (lecția 11), combinarea mai multor detectoare îmbunătățește detectarea. Cea mai simplă abordare:
- Rulați mai multe detectoare (Z-score, IQR, Isolation Forest, LOF)
- Normalizați scorurile fiecărui detector la [0, 1]
- Calculați media scorurilor normalizate
- Semnalați punctele aflate peste pragul scorului mediu
Aceasta reduce rezultatele fals pozitive, deoarece metodele diferite au moduri de eșec diferite. Un punct semnalat de toate cele patru metode este aproape sigur anormal. Un punct semnalat de una singură ar putea fi o particularitate a metodei respective.
Ansamblurile mai sofisticate ponderează fiecare detector prin fiabilitatea sa estimată (măsurată pe un set de validare cu anomalii cunoscute, dacă este disponibil).
Notă tehnică a traducerii: Media scorurilor necesită orientare și calibrare comparabile; o normalizare min–max simplă este sensibilă la extreme. Detectoarele pot avea erori corelate, astfel încât acordul lor nu face un punct „aproape sigur” anormal și nu garantează reducerea rezultatelor fals pozitive. Regula de consens poate reduce recall-ul.
Considerații pentru producție
- Deriva pragului. Pe măsură ce distribuția datelor se schimbă, un prag fix devine depășit. Monitorizați distribuția scorurilor de anomalie și ajustați-o periodic.
- Oboseala provocată de alerte. Prea multe alarme false, iar operatorii nu le mai acordă atenție. Începeți cu un prag mare (mai puține alerte, mai fiabile) și reduceți-l pe măsură ce încrederea crește.
- Abordarea prin ansamblu. În producție, combinați mai multe detectoare. Semnalați un punct numai dacă mai multe metode sunt de acord că este anormal. Aceasta reduce semnificativ rezultatele fals pozitive.
- Proiectarea caracteristicilor. Caracteristicile brute sunt rareori suficiente. Adăugați statistici mobile, rapoarte, timpul de la ultimul eveniment și caracteristici specifice domeniului. Un set bun de caracteristici contează mai mult decât alegerea detectorului.
- Bucla de feedback. Când operatorii investighează elementele semnalate și le confirmă sau le resping, reintroduceți rezultatul în sistem. Acumulați în timp date etichetate pentru a evalua și îmbunătăți detectorul.
Notă tehnică a traducerii: Consensul între detectoare poate reduce numărul alertelor, dar nu garantează o reducere semnificativă a falsurilor pozitive și poate elimina anomalii detectabile doar de o metodă. Orice regulă de ansamblu și ajustare a pragului trebuie evaluată pe ferestre temporale reprezentative, fără folosirea setului final de testare pentru reglare repetată.
Livrați
Această lecție produce:
outputs/skill-anomaly-detector.md— o abilitate de decizie pentru alegerea detectorului potrivitcode/anomaly_detection.py— Z-score, IQR și Isolation Forest de la zero
Alegerea unui prag
Scorul anomaliei este continuu. Aveți nevoie de un prag pentru a lua decizii binare. Aceasta este o decizie de afaceri, nu una tehnică.
Luați în considerare două scenarii:
- Detectarea fraudei. Ratarea unei fraude este costisitoare (returnări de plăți, încrederea clientului). Alarmele false îi iau unui analist uman 5 minute pentru investigare. Setați pragul jos pentru a detecta mai multă fraudă și acceptați mai multe alarme false.
- Mentenanța echipamentelor. O alarmă falsă înseamnă o oprire inutilă care costă 50.000 $. O defecțiune ratată înseamnă o reparație de 500.000 $. Setați pragul astfel încât să echilibreze aceste costuri.
În ambele cazuri, pragul optim depinde de raportul costurilor dintre rezultate fals pozitive și fals negative. Reprezentați precizia și recall-ul la praguri diferite, suprapuneți funcția de cost și alegeți punctul cu cost minim.
Notă tehnică a traducerii: Alegerea pragului este o decizie socio-tehnică: necesită estimări statistice valide ale scorurilor și prevalenței, costuri operaționale, constrângeri de capacitate și reguli de afaceri. Costurile incerte sau schimbătoare trebuie analizate prin sensibilitate, iar pragul se selectează pe validare, nu pe setul final de testare.
Scalarea în producție
Pentru detectarea în timp real a anomaliilor în producție:
- Antrenare pe loturi, scorare online. Antrenați modelul periodic (zilnic, săptămânal) pe date normale recente. Atribuiți scor fiecărei observații noi pe măsură ce sosește.
- Calculul caracteristicilor trebuie să corespundă. Dacă ați antrenat cu statistici mobile pe 30 de zile, aveți nevoie de 30 de zile de istoric pentru calcularea caracteristicilor unei observații noi. Păstrați într-un tampon istoricul necesar.
- Monitorizarea distribuției scorurilor. Urmăriți în timp distribuția scorurilor de anomalie. Dacă scorul median crește, fie datele se schimbă, fie modelul este depășit.
- Explicabilitate. Când semnalați o anomalie, spuneți de ce. Z-score: „Caracteristica X este la 4,2 abateri standard peste normal.” Isolation Forest: „Acest punct a fost izolat în medie în 3,1 divizări (punctele normale necesită 8,5).”
Notă tehnică a traducerii: Reantrenarea pe date „normale” recente cere un mecanism care să împiedice absorbția anomaliilor confirmate în baza de referință. O derivă a scorului median poate proveni și din schimbarea pipeline-ului de caracteristici ori a versiunii modelului. Lungimea traseului Isolation Forest explică raritatea conform modelului, dar nu identifică singură caracteristicile cauzale ale anomaliei.
Exerciții
-
Reglarea pragului. Rulați detectorul Z-score cu praguri de la 1,0 la 5,0, în pași de 0,5. Reprezentați grafic precizia și recall-ul pentru fiecare prag. Unde este punctul optim pentru datele dumneavoastră?
-
Anomalii multivariate. Creați date 2D în care fiecare caracteristică luată separat pare normală, dar combinația este anormală (de exemplu, puncte aflate departe de diagonala clusterului principal). Arătați că Z-score pe fiecare caracteristică le ratează, dar Isolation Forest le detectează.
-
LOF de la zero. Implementați Local Outlier Factor folosind k cei mai apropiați vecini. Comparați-l cu LocalOutlierFactor din sklearn pe aceleași date. Folosiți k=10 și k=50 — cum afectează rezultatele alegerea lui k?
-
Detectarea anomaliilor în flux. Modificați detectorul Z-score pentru a funcționa într-un flux: actualizați media și varianța curente pe măsură ce sosesc puncte noi (algoritmul online al lui Welford). Comparați-l cu Z-score pe loturi, pe aceleași date.
-
Evaluare în lumea reală. Luați un set de date cu anomalii cunoscute (de exemplu, fraude cu carduri de credit de pe Kaggle). Evaluați toate cele patru metode folosind precision@100, precision@500 și AUPRC. Care metodă funcționează cel mai bine? De ce?
Termeni-cheie
| Termen | Ce spun oamenii | Ce înseamnă de fapt |
|---|---|---|
| Anomalie | „Valoare atipică, punct neobișnuit” | Un punct de date care se abate semnificativ de la tiparul așteptat al datelor normale |
| Anomalie punctuală | „O singură valoare ciudată” | O observație individuală neobișnuită indiferent de context |
| Anomalie contextuală | „Valoare normală, context greșit” | O observație neobișnuită în contextul său (timp, locație etc.), dar care poate fi normală în alt context |
| Isolation Forest | „Divizări aleatoare pentru găsirea valorilor atipice” | Un ansamblu de arbori aleatori care izolează anomaliile în mai puține divizări decât punctele normale |
| Local Outlier Factor | „Compară densitatea cu vecinii” | O metodă care semnalează punctele a căror densitate locală este mult mai mică decât densitatea vecinilor |
| Z-score | „Abateri standard față de medie” | (x - medie) / abatere_standard, măsoară distanța unui punct față de centru în unități de abatere standard |
| IQR | „Interval intercuartil” | Q3 - Q1, măsoară dispersia celor 50% de date din centru și este folosit pentru detectarea robustă a valorilor atipice |
| Contaminare | „Fracțiunea așteptată de anomalii” | Un hiperparametru care îi spune detectorului ce proporție din date ar trebui să semnaleze drept anormală |
| Precision@k | „Dintre primele k semnalări, câte sunt reale” | Precizia calculată numai pentru cele mai suspecte k puncte, utilă în detectarea anomaliilor cu clase dezechilibrate |
| AUPRC | „Aria de sub curba precizie–recall” | O metrică ce rezumă performanța precizie–recall la toate pragurile, mai bună decât AUROC pentru date dezechilibrate |
Lecturi suplimentare
- Liu et al., Isolation Forest (2008) — articolul original despre Isolation Forest
- Breunig et al., LOF: Identifying Density-Based Local Outliers (2000) — articolul original despre LOF
- Documentația scikit-learn despre detectarea valorilor atipice — prezentare generală a tuturor detectoarelor de anomalii din sklearn
- Chandola et al., Anomaly Detection: A Survey (2009) — studiu cuprinzător al metodelor de detectare a anomaliilor
- Goldstein și Uchida, A Comparative Evaluation of Unsupervised Anomaly Detection Algorithms (2016) — comparație empirică a 10 metode pe seturi de date reale
Sursă: Anomaly Detection — original
Navigare: înapoi: 02.15 — Fundamentele seriilor temporale · Faza 2 — Bazele învățării automate · Catalog complet · în continuare: 02.17 — Gestionarea datelor dezechilibrate.