Basics di Rilevamento delle Anomalie con Distribuzione Gaussiana Multivariata
'Introduzione al Rilevamento Anomalie con Gaussiana Multivariata'
Panoramica della rilevazione di anomalie, revisione della distribuzione gaussiana multivariata e implementazione di un algoritmo di base per la rilevazione di anomalie in Python con due esempi
La nostra innata capacità di riconoscere i pattern ci permette di utilizzare questa abilità per colmare le lacune o prevedere cosa accadrà in seguito. Tuttavia, occasionalmente succede qualcosa che non si adatta alle nostre aspettative e non rientra nella nostra percezione di un pattern. Chiamiamo tali eventi anomalie. Se stiamo cercando di fare una previsione, potremmo voler escludere le anomalie dai nostri dati di addestramento. Oppure forse vogliamo identificare le anomalie per aiutare a migliorare la nostra vita. In entrambi i casi, le tecniche di rilevazione di anomalie possono rivelarsi utili e applicabili nella maggior parte dei settori e delle aree di interesse.
Questo articolo ti guiderà attraverso le basi della rilevazione di anomalie e l’implementazione di un modello statistico di rilevazione di anomalie.
Cos’è la rilevazione di anomalie?
In termini generali, la rilevazione di anomalie si riferisce al processo di identificazione di fenomeni fuori dall’ordinario. Lo scopo della rilevazione di anomalie è identificare eventi, situazioni, punti dati o risultati che non sono in linea con le nostre aspettative e non si adattano ad un pattern sottostante. Pertanto, la chiave per implementare la rilevazione di anomalie è capire il pattern sottostante degli eventi attesi. Se conosciamo il pattern degli eventi attesi, possiamo usarlo per mappare i punti dati mai visti in precedenza; se il nostro mapping non ha successo e il nostro nuovo punto dati cade al di fuori del nostro pattern atteso, è probabile che abbiamo trovato la nostra anomalia.
Esistono tre tipi di anomalie che si verificano tipicamente. Il primo tipo include istanze individuali che sono considerate anomale rispetto all’intero dataset (ad esempio, un singolo veicolo che viaggia a velocità molto ridotta su un’autostrada è anomalo rispetto al traffico autostradale). Il secondo tipo include istanze che sono anomalie all’interno di un contesto specifico (ad esempio, transazioni con carta di credito che sembrano OK se confrontate con tutte le transazioni con carta di credito, ma sono anomale rispetto al pattern di spesa specifico di un individuo). Il terzo tipo di anomalie è collettivo: un insieme di istanze può essere considerato anomalo anche se ogni istanza presa singolarmente segue una certa aspettativa (ad esempio, una singola transazione fraudolenta con carta di credito su Amazon potrebbe non sembrare fuori dall’ordinario, ma un insieme di transazioni che avvengono di seguito in breve tempo è sospetto) [1].
- Apprendimento automatico a effetti misti per variabili categoriche ad alta cardinalità — Parte I un confronto empirico di diversi metodi
- Gli scienziati del MIT costruiscono un sistema in grado di generare modelli di intelligenza artificiale per la ricerca biologica.
- Apprendere il linguaggio delle molecole per prevedere le loro proprietà
Le tecniche di rilevazione di anomalie si possono dividere in tre categorie:
- Rilevazione supervisionata richiede etichette positive e anomale nel dataset. Algoritmi di apprendimento supervisionato come le reti neurali o i boschi potenziati possono essere applicati per categorizzare i punti dati in classi attese/anomale. Purtroppo, i dataset di anomalie tendono ad essere molto sbilanciati e in generale non hanno abbastanza campioni di addestramento per consentire tecniche di sovracampionamento o sottocampionamento per aiutare l’apprendimento supervisionato.
- Rilevazione semi-supervisionata si occupa di dati parzialmente etichettati. Le tecniche semi-supervisionate assumono che i dati di input contengano solo istanze positive e che tali dati seguano un pattern atteso. Queste tecniche cercano di apprendere la distribuzione dei casi positivi al fine di generare istanze positive. Durante il test, l’algoritmo valuterà la probabilità che l’istanza anomala potrebbe essere stata generata dal modello e utilizzerà questa probabilità per prevedere i casi anomali. [2]
- Rilevazione non supervisionata utilizza dati completamente non etichettati al fine di creare un confine di aspettativa e tutto ciò che cade al di fuori di questo confine viene considerato anomalo.
Le tecniche di rilevazione di anomalie possono essere applicate a qualsiasi tipo di dati e il formato dei dati influenza quale algoritmo sarà più utile. I tipi di dati includono serie (serie temporali, liste collegate, linguaggio, suoni), tabellari (ad esempio, dati dei sensori del motore), immagini (ad esempio, immagini a raggi X) e grafici (ad esempio, flussi di lavoro o processi).
![Esempio di rilevazione di anomalie in immagini a raggi X del torace [4]](https://miro.medium.com/v2/resize:fit:640/format:webp/0*3YwOfi0OlvtsPSZO.png)
Dato il variegato panorama di problemi e tecniche, la rilevazione di anomalie è effettivamente un’ampia area della scienza dei dati con molte applicazioni. Alcune di queste applicazioni includono: rilevamento di frodi, applicazioni di sicurezza informatica, analisi di dati di vendita o transazionali, identificazione di malattie rare, monitoraggio dei processi produttivi, ricerca di esopianeti, preelaborazione per l’apprendimento automatico e molto altro ancora. Pertanto, l’accesso ad algoritmi potenti e performanti ha il potenziale per avere un impatto significativo in molti campi.
Diamo un’occhiata all’algoritmo più basilare che può essere utilizzato per rilevare anomalie.
Distribuzione Gaussiana per il rilevamento delle anomalie
Una delle tecniche di rilevamento delle anomalie di base utilizza la potenza della distribuzione Gaussiana (cioè Normale) per identificare gli outlier.
Scoperta da Carl Friedrich Gauss, la distribuzione Gaussiana modella molti fenomeni naturali ed è quindi una scelta popolare per la modellazione delle caratteristiche in un insieme di dati. La funzione di densità di probabilità di questa distribuzione è una curva a campana centrata sulla media aritmetica e la larghezza della curva è definita dalla varianza dell’insieme di dati. Con la maggior parte dei casi che si trovano al centro o vicino ad esso, la funzione di densità di probabilità presenta due code allungate su ciascuna estremità. Più rara è l’istanza – più lontana è dal centro – più è probabile che sia un outlier o un’anomalia. Eureka! Possiamo utilizzare questo concetto per modellare le anomalie nel nostro insieme di dati.
La funzione di densità di probabilità, definita come f(x), misura la probabilità di un certo risultato x nel nostro insieme di dati. Formalmente,
Supponiamo che il nostro insieme di dati abbia solo una caratteristica e che tale caratteristica segua una distribuzione normale, quindi possiamo modellare il nostro algoritmo di rilevamento delle anomalie utilizzando f(x) di cui sopra. Possiamo quindi impostare una soglia epsilon che determinerà se un caso è anomalo o meno. Epsilon dovrebbe essere impostato euristicamente e il suo valore dipenderà dal caso d’uso e dalla sensibilità preferita per le anomalie.
![Grafico che rappresenta la distribuzione normale [5]](https://miro.medium.com/v2/resize:fit:640/format:webp/1*tqga3Xi0Ms8xDJtyZefiZQ.png)
In una distribuzione normale, il 2,5% delle istanze si verifica a due deviazioni standard al di sotto del valore medio. Quindi, se impostiamo la nostra soglia a 0,054, circa il 2,5% degli eventi nel nostro insieme di dati verrà classificato come anomalie (la CDF di due deviazioni standard al di sotto della media è 2,5 e la PDF a -2 è 0,054). Soglie più basse produrranno meno anomalie classificate e soglie più alte saranno meno sensibili.
Nel mondo reale, è probabile che ci sia un compromesso poiché alcuni casi positivi potrebbero cadere al di sotto della soglia e alcune anomalie potrebbero nascondersi al di sopra della soglia. Sarà necessario comprendere il caso d’uso e testare diversi valori epsilon prima di stabilirne uno più adatto.
Un esempio con una sola caratteristica è banale: cosa fare se abbiamo più di una caratteristica? Se le nostre caratteristiche sono completamente indipendenti, possiamo effettivamente prendere il prodotto della funzione di densità di probabilità delle caratteristiche per classificare le anomalie.
Per un caso con due caratteristiche non correlate, questo diventa
In sostanza, il prodotto delle probabilità delle caratteristiche può garantire che se almeno una caratteristica ha un outlier, possiamo rilevare un’anomalia (dato che il nostro epsilon è abbastanza alto); se la nostra istanza presenta un valore anomalo in diverse caratteristiche, la nostra probabilità sarà ancora più piccola (poiché il nostro valore di probabilità totale è un prodotto di frazioni) e un valore sarà ancora più probabile che sia un’anomalia.
Tuttavia, non possiamo assumere che le nostre caratteristiche siano indipendenti. Ed è qui che entra in gioco una funzione di densità di probabilità multivariata. Nel caso multivariato, costruiamo una matrice di covarianza (denotata da Σ) per catturare come le caratteristiche sono correlate tra loro. Quindi, possiamo utilizzare la matrice di covarianza per evitare il “doppio conteggio” delle relazioni tra le caratteristiche (questa è un modo molto rudimentale di esprimere ciò che sta realmente accadendo). La formula per la funzione di densità di probabilità della distribuzione multivariata è mostrata di seguito e queste slide di Duke fanno un buon lavoro nel derivare la formula.
Qui, x è un vettore di input, μ è un vettore di medie delle caratteristiche e Σ è una matrice di covarianza tra le caratteristiche.
Per semplificarci la vita, possiamo utilizzare la libreria scipy per implementare questa funzione: scipy.stats.multivariate_normal prende in input un vettore di medie e deviazioni standard delle caratteristiche e ha un metodo .pdf per restituire la densità di probabilità data un insieme di punti.
Proviamo questa implementazione su un esempio concreto.
Implementazione del modello a due feature in Python
Prima di tutto, osserviamo un esempio a due feature che ci permetterà di visualizzare anomalie nello spazio euclideo. Per questo esempio, ho generato due feature con 100 campioni estratti dalla distribuzione normale (questi sono i campioni positivi). Ho calcolato le medie e le deviazioni standard delle feature e ho adattato un modello normale multivariato dalla libreria scipy.stats con le informazioni sulla distribuzione. Da notare: Ho adattato il mio modello solo con campioni positivi. Nei dati del mondo reale, vogliamo pulire il nostro dataset per assicurarci che le feature seguano una distribuzione normale e non contengano valori anomali o strani – questo migliorerà la capacità dei modelli di individuare anomalie (soprattutto perché aiuterà a garantire il requisito di distribuzione normale delle feature). Infine, ho aggiunto 5 campioni anomali al mio dataset e ho utilizzato il metodo .pdf per riportare le probabilità.
Il seguente scatterplot mostra il risultato: la feature x1 è rappresentata sull’asse x, la feature x2 è rappresentata sull’asse y, le anomalie sono annotate e il colore rappresenta la probabilità della funzione di densità di probabilità multivariata.
![Scatterplot che mostra punti positivi e anomali [5]](https://miro.medium.com/v2/resize:fit:640/format:webp/1*JdnneJ0Ktw73gpAfXZ8_FA.png)
Una volta impostata la nostra soglia abbastanza bassa, saremo in grado di distinguere le anomalie dai valori attesi. I due grafici sottostanti confrontano i valori di epsilon tra 1×10^-7 e 1×10^-9. Il valore di epsilon di 1×10^-9 tende a individuare meglio le anomalie previste, mentre 1×10^-7 identifica alcuni campioni positivi come anomalie.
![Confronto degli scatterplot delle anomalie identificate con epsilon più alto e più basso [5]](https://miro.medium.com/v2/resize:fit:640/format:webp/1*S60Up3h6cVHT_2hHbOD-JA.png)
In questo esempio, è facile identificare l’epsilon perché possiamo rappresentare visivamente e identificare le anomalie e analizzare i nostri risultati. Vediamo come cambia in un esempio con un po’ più di feature.
Implementazione del modello multivariato con Python
In questo esempio, userò il dataset del vino dalla libreria ODDS [3]. Questo dataset contiene 13 feature numeriche e 129 istanze. Le feature raccolgono informazioni sul vino e il dataset originale è stato utilizzato per compiti di classificazione basati sull’analisi del vino. Per l’individuazione di anomalie, una delle classi target è stata campionata in modo ridotto ed è presentata come un’outlier. Ci sono in totale 10 anomalie tra le 129 istanze (~8%). Stiamo lavorando con un dataset abbastanza pulito senza valori mancanti.
La prima cosa che dobbiamo fare è assicurarci che le nostre feature seguano una distribuzione gaussiana. Dove possibile, dovremmo rimuovere gli outlier e normalizzare la distribuzione utilizzando una delle tattiche di normalizzazione. In questo dataset, 4 feature seguono già una distribuzione normale (alcol, cenere, alcalinità della cenere e fenoli non flavonoidi) e 4 feature possono essere normalizzate prendendo il loro logaritmo (fenoli totali, proantocianidine, intensità del colore e tonalità). Mentre esistono strategie migliori per le feature rimanenti, per lo scopo di questo esercizio le ho semplicemente rimosse dal nostro dataset di addestramento. Infine, ho rimosso gli outlier escludendo tutte le righe che contengono almeno un valore di feature che è al di sopra o al di sotto di 2 deviazioni standard dalla media. Il resto del codice è lo stesso dell’esempio precedente.
A differenza dell’esempio a due feature della sezione precedente, non è più fattibile visualizzare i risultati su un piano bidimensionale, ma possiamo utilizzare metriche della matrice di confusione (incluse la recall e la precision) e l’area sotto la curva ROC per aiutarci a trovare l’epsilon corretto per il caso d’uso.
Dato che di solito c’è un compromesso tra precisione e recall, il valore di epsilon dipende dal requisito di sensibilità del nostro caso d’uso. Per questo esempio, ho cercato un epsilon che massimizza l’area sotto la curva. Alcuni casi d’uso potrebbero richiedere di individuare il maggior numero possibile di anomalie (a discapito dell’inclusione di valori positivi), mentre altri casi d’uso potrebbero richiedere di individuare solo le anomalie se siamo assolutamente sicuri (a discapito di perdere alcune anomalie dal nostro rapporto finale). Ho calcolato le metriche di valutazione per diversi valori di epsilon.
![Confronto dei grafici a linee delle metriche di valutazione per valore di epsilon [5]](https://miro.medium.com/v2/resize:fit:640/format:webp/1*ktua4Y2SBGiKgRI19idV3A.png)
All’aumentare di epsilon, aumenta la recall. La precisione è piuttosto bassa per tutti i valori di epsilon proposti, ma tende a raggiungere il picco intorno a 0,0035 e 0,0065. L’AUC cerca di trovare un equilibrio tra precisione e recall e ha un picco intorno a 0,0065. Diamo un’occhiata alla matrice di confusione.
![Tabella che rappresenta la matrice di confusione [5]](https://miro.medium.com/v2/resize:fit:640/format:webp/1*Ld-c6e0JbHCC7ttrVyTJ9A.png)
Il nostro modello si comporta abbastanza bene nel trovare tutte le anomalie e ne perde solo una. Questo è un risultato fantastico considerando che ho escluso un terzo delle caratteristiche. Purtroppo, il nostro modello mostra anche 40 istanze positive come anomalie, il che significa che se usiamo il modello per la rilevazione delle anomalie, dovremmo controllare manualmente la metà delle istanze positive per vedere se sono effettivamente anomale.
Per migliorare questo modello possiamo ulteriormente ingegnerizzare le restanti caratteristiche e trovare valori di epsilon che possano essere un po’ meno sensibili agli outlier. Il resto di questo problema è banale ed è lasciato come esercizio per il lettore (iykyk). Puoi trovare il codice sorgente qui .
Svantaggi Potenziali con la Rilevazione delle Anomalie Gaussiane
La distribuzione gaussiana multivariata è un ottimo modello per la rilevazione delle anomalie: è semplice, veloce e facile da eseguire. Tuttavia, i suoi svantaggi possono impedirne l’utilizzo per numerosi casi d’uso.
Primo, la distribuzione multivariata può produrre valori di densità di probabilità piuttosto bassi. In generale, questo non è un problema per i computer moderni. Ma potrebbero esserci casi in cui i valori sono troppo bassi per essere gestiti efficacemente da un computer.
Secondo, dobbiamo assicurarci che le nostre caratteristiche seguano una distribuzione normale. Questo potrebbe non essere troppo problematico se si dedica tempo ed impegno per eseguire una corretta ingegnerizzazione delle caratteristiche e manipolazione dei dati, ma investire sforzi è rischioso poiché non sapremo il rendimento fino a quando non faremo il lavoro.
Terzo, questo modello non gestisce le caratteristiche categoriche e se il nostro dataset include caratteristiche categoriche, dobbiamo creare un modello separato per ogni combinazione di caratteristiche categoriche (cosa che potrebbe richiedere molto lavoro).
Infine, il modello assume che tutte le caratteristiche siano ugualmente rilevanti e non ci sia una relazione complessa tra le caratteristiche. Un’opzione per affrontare questo problema è implementare la funzione di densità di probabilità della distribuzione multivariata da zero e includere alcuni parametri per aiutare con l’importanza delle caratteristiche. Per risolvere il problema delle relazioni tra le caratteristiche, potremmo fare ulteriori ingegnerizzazioni delle caratteristiche e creare nuove caratteristiche, ma questo processo può essere difficile, richiedere molto tempo e comportare rischi (in termini di rendimento).
Tuttavia, l’utilizzo della distribuzione gaussiana multivariata per la rilevazione delle anomalie è un ottimo primo passo per i problemi di rilevazione delle anomalie tabulari. Può essere utilizzato per stabilire un punto di riferimento o può rivelarsi uno strumento perfetto per individuare anomalie in un dataset e ci fornisce un modo intuitivo per capire la rilevazione delle anomalie.
Grazie per aver letto! Nel prossimo futuro spero di realizzare una serie completa sulla rilevazione delle anomalie, quindi se questo argomento ti interessa, resta sintonizzato.
Fonti:
- https://www.kaggle.com/code/matheusfacure/semi-supervised-anomaly-detection-survey
- https://ai.googleblog.com/2023/02/unsupervised-and-semi-supervised.html
- Saket Sathe and Charu C. Aggarwal. LODES: Local Density meets Spectral Outlier Detection. SIAM Conference on Data Mining, 2016.
- Nakao, T., Hanaoka, S., Nomura, Y. et al. Unsupervised Deep Anomaly Detection in Chest Radiographs. J Digit Imaging 34 , 418–427 (2021). https://doi.org/10.1007/s10278-020-00413-2
- https://github.com/viyaleta/Anomaly-Detection/blob/main/Examples/1%20Anomaly%20Detection%20with%20Guassian%20Distribution.ipynb
Composizione matematica grazie all’editor LaTeX online di Codecogs .
Puoi trovare il Jupyter Notebook con gli esempi qui .