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ă.

Curs
AI Engineering from Scratch
Fază
Bazele învățării automate
Lectură
29 min.
Verificat
Cuprinsul lecției
  1. Obiective de învățare
  2. Problema
  3. Conceptul
  4. Tipuri de anomalii
  5. Formularea nesupravegheată
  6. Supravegheat în raport cu nesupravegheat: compromisul
  7. Metoda Z-score
  8. Metoda IQR
  9. Isolation Forest
  10. Local Outlier Factor (LOF)
  11. Comparație
  12. Provocările evaluării
  13. Pipeline de detectare a anomaliilor
  14. Construiți
  15. Detectorul Z-score
  16. Detectorul IQR
  17. Isolation Forest de la zero
  18. Scenarii demonstrative
  19. Folosiți
  20. Parametrul contamination din sklearn
  21. One-Class SVM
  22. Abordarea cu autoencoder (avanpremieră)
  23. Detectarea anomaliilor prin ansamblu
  24. Considerații pentru producție
  25. Livrați
  26. Alegerea unui prag
  27. Scalarea în producție
  28. Exerciții
  29. Termeni-cheie
  30. 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.

Диаграмма к уроку «Detectarea anomaliilor»

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:

  1. 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”.
  2. 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ă.
  3. 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.

Диаграмма к уроку «Detectarea anomaliilor»

Cum funcționează:

  1. Construiți mulți arbori aleatori (o pădure de izolare)
  2. În fiecare nod, alegeți o caracteristică aleatoare și o valoare de divizare aleatoare între minimul și maximul caracteristicii
  3. Continuați divizarea până când fiecare punct este izolat (în propria frunză)
  4. 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ște min(256, n_samples); contamination stabileș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ă:

  1. Pentru fiecare punct, găsiți cei k vecini cei mai apropiați
  2. Calculați densitatea locală de accesibilitate (cât de densă este vecinătatea)
  3. Comparați densitatea fiecărui punct cu densitățile vecinilor săi
  4. 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. Cu novelty=True, predict, decision_function și score_samples trebuie 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.

Диаграмма к уроку «Detectarea anomaliilor»

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:

  1. 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).
  2. Proiectați caracteristici. Caracteristici brute plus caracteristici derivate (statistici mobile, caracteristici de timp, rapoarte).
  3. Antrenați detectorul. Ajustați-l pe datele de bază. Modelul învață cum arată „normalul”.
  4. Atribuiți scoruri datelor noi. Fiecare observație nouă primește un scor de anomalie.
  5. 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.
  6. Alertați și investigați. Punctele semnalate sunt trimise spre verificare umană sau răspuns automat.
  7. 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), unde scores este 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 cu 1.0 este 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 python este pseudocod și nu rulează: linia avg_path = average path length across all trees nu este sintaxă Python, iar rng, self.trees, c și max_samples nu sunt definite în fragment. Fișierul complet definește aceste elemente, dar aproximă H(n-1) prin log(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:

  1. Un singur cluster cu valori atipice. Un cluster gaussian 2D cu anomalii injectate departe de centru. Toate metodele ar trebui să funcționeze aici.
  2. 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.
  3. 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.py implementează 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 1 pentru observații normale și -1 pentru valori atipice. Pentru LocalOutlierFactor(novelty=True), metodele de predicție și scor trebuie aplicate numai datelor noi, nu setului X_train folosit 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: contamination nu schimbă arborii unui model dat, dar cele două obiecte din fragment nu au același random_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, nu este 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:

  1. Rulați mai multe detectoare (Z-score, IQR, Isolation Forest, LOF)
  2. Normalizați scorurile fiecărui detector la [0, 1]
  3. Calculați media scorurilor normalizate
  4. 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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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 potrivit
  • code/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:

  1. 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.
  2. 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.
  3. 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.
  4. 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

  1. 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ă?

  2. 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ă.

  3. 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?

  4. 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.

  5. 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


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.