Rilevazione di anomalie: quale algoritmo usare?


10

Contesto: sto sviluppando un sistema che analizza i dati clinici per filtrare i dati non plausibili che potrebbero essere errori di battitura.

Quello che ho fatto finora:

Per quantificare la plausibilità, il mio tentativo finora è stato di normalizzare i dati e quindi calcolare un valore di plausibilità per il punto p in base alla sua distanza dai punti di dati noti nell'insieme D (= l'insieme di addestramento):

plausibility(p)=qDGauss(distance(p,q))

Con tale quantificazione, posso quindi selezionare una soglia che separa i dati plausibili dai dati non plausibili. Sto usando Python / Numpy.

I miei problemi:

  1. Questo algoritmo non può rilevare dimensioni indipendenti. Idealmente, potrei inserire nell'algoritmo tutto ciò che so sul record e fargli scoprire da solo che la dimensione X non influenza la plausibilità del record.
  2. L'algoritmo non funziona davvero per valori discreti come valori booleani o input selezionati. Potrebbero essere mappati su valori continui, ma è controintuitivo che Seleziona 1 sia più vicino a Seleziona 2 che a Seleziona 3.

Domanda:

Che tipo di algoritmi dovrei cercare per questo compito? Sembra che ci siano molte opzioni tra cui approcci basati sul vicino più vicino, basati sul clustering e statistici. Inoltre, ho difficoltà a trovare documenti che trattano del rilevamento di anomalie di questa complessità.

Qualsiasi consiglio è molto apprezzato.

[Modifica] Esempio:

Supponiamo che i dati consistessero in Altezza di una persona, Peso di una persona e Data / ora, quindi sono dati 3D. Peso e altezza sono correlati, ma il timestamp è completamente indipendente. Se solo considero le distanze euclidee, dovrei scegliere una piccola soglia per adattarmi alla maggior parte dei miei dati di convalida incrociata. Idealmente, l'algoritmo ignorerebbe semplicemente la dimensione del timestamp, perché è irrilevante determinare se un record è plausibile, perché il timestamp non è in alcun modo correlato con le altre dimensioni. Qualsiasi timestamp è plausibile.

D'altra parte, si potrebbero inventare esempi in cui il timestamp è importante. Ad esempio, potrebbe essere che il valore Y per la funzione X sia plausibile quando misurato prima di una determinata data, ma non dopo una determinata data.


Si prega di consultare la mia risposta a stats.stackexchange.com/questions/97946/changepoints-in-r poiché tratta questa domanda irritante (per alcuni!).
IrishStat,

Sarebbe stats.stackexchange.com/questions/213 essere il tipo di cosa che stai cercando?
whuber

Dubito che tu possa farlo funzionare per i booleani.
Aksakal,

@whuber Non ne sono sicuro, non sembra coprire come le dimensioni irrilevanti possano essere ignorate.
Georg,

1
A proposito, sto anche lottando per trovare una formalizzazione per l'approccio che ho descritto. Se conoscessi il termine formale, mi aiuterebbe anche nella mia ricerca. Forse c'è una variazione a questo algoritmo che affronta almeno il problema della dimensione indipendente / irrilevante.
Georg,

Risposte:


7

Una formulazione tipica di Anomaly Detection è quella di trovare la media e la varianza per ciascuna delle funzioni di dati non anomali e se è un vettore di quelle caratteristiche con componenti allora definire la probabilità di una combinazione di caratteristiche comemxxip(x)

p(x)=i=1mp(xi;μi,σi2)

dove ogni è distribuito gaussiano:xixiN(μi,σi2)

si verifica un'anomalia ogni volta chep(x)<ϵ

La distribuzione di ogni non deve necessariamente essere normale, ma è meglio se è almeno normale. Ma le funzionalità che usi sono arbitrarie; possono essere presi direttamente dai dati non elaborati o calcolati, quindi ad esempio se si ritiene che una funzione sia meglio modellata utilizzando impostare la funzione su anziché .xixiloglog(xi)xi

Questo sembra essere molto simile a quello che stai già facendo se prendi .q=μ

Determinareϵ

L'algoritmo è adatto ad esempi negativi (non anomalie). Ma è determinato dal set di convalida incrociata ed è in genere selezionato come valore che fornisce il miglior punteggioF 1ϵF1

F1=2PrecisionRecallPrecision+Recall

Ma per calcolare la F1 devi sapere cosa è anomalo e cosa no; cioè i veri positivi sono quando il sistema prevede un'anomalia ed è effettivamente un'anomalia, i falsi positivi sono anomalie previste che in realtà non lo sono e così via. Quindi, a meno che tu non lo abbia, potresti dover ricorrere alle congetture.

Il problema delle funzionalità correlate

Quanto sopra ha uno svantaggio se le funzionalità sono correlate. Se lo sono, il calcolo di cui sopra può non riuscire a contrassegnare qualcosa di anomalo in realtà. Una soluzione a questo è l'utilizzo del gaussiano multivariato per le funzioni cui è la matrice di covarianza.ΣmΣ

p(x)=1(2π)m2(detΣ)1/2e12(xμ)TΣ1(xμ)

La stessa cosa vale per trovare e questo approccio ha anche uno svantaggio che è che devi calcolare l'inverso di . Quindi devono esserci almeno tanti esempi quanti sono gli elementi e se il numero di elementi è grande, il processo sarà intensivo dal punto di vista computazionale e si dovrà proteggere nuovamente gli elementi linearmente dipendenti. Tieni a mente queste avvertenze, ma sembra che tu non sia un problema.ϵΣ


Ho già provato questo approccio, inclusa la distribuzione gaussiana multivariata. In effetti, le funzionalità non correlate non rappresentano un grosso problema con questo approccio. Quello che ho scoperto è che questo approccio non è adatto a modelli complessi. Ad esempio, se avessi un set di dati 2D con funzionalità F1, F2 in cui si verifica approssimativamente F2 = F1 ^ 3, la distribuzione gaussiana multivariata disegnerà solo un'ellisse attorno ai dati e modellerà i dati molto approssimativamente. Ecco perché ho scelto l'approccio descritto nella domanda (dove non c'è una q ma molte q).
Georg,

Quindi, c'è un modo per adottare l'approccio gaussiano multivariato e applicarlo per acquisire modelli di dati più complessi? Ad esempio, i modelli di miscele potrebbero aiutarmi in questo caso? Ho letto un po 'di quelli nella mia ricerca, ma non ho ancora capito come applicarli.
Georg,

@Georg Hmm Mi chiedo se il tuo problema non sia un problema di modelli complessi, ma dati complessi e modelli troppo semplicistici. O in altre parole inadeguato. Nel caso sopra, cosa succede se invece di usare usi ? Le funzionalità possono essere prese dai dati o calcolate. (F1,F2)(F1,F21/3)
aspettiamo

Sì, il sottofondo è ciò che intendo. E sì, funzionerebbe, ma voglio che l'algoritmo lo rilevi automaticamente. Non riesco a modificare manualmente le funzionalità, dovrebbe funzionare in ogni caso.
Georg,

Ecco un esempio: i due grafici visualizzano i dati per altezza (asse x) e peso (asse y) (scusate le didascalie tedesche;)). La prima trama mostra il risultato dell'approccio gaussiano multivariato, la seconda dell'approccio descritto nella domanda. In entrambi i casi, la soglia è stata scelta in modo tale che il 97% dei dati CV sia considerato plausibile. Il secondo approccio è in grado di catturare meglio la complessità dei dati. 1: dl.dropboxusercontent.com/u/26034024/anomaly/gauss.png 2: dl.dropboxusercontent.com/u/26034024/anomaly/distance.png
Georg

3

Ho quasi finito il progetto dove avevo bisogno di risolvere questi problemi e vorrei condividere la mia soluzione, nel caso in cui qualcuno abbia gli stessi problemi.

Prima di tutto, l'approccio che ho descritto è molto simile a una stima della densità del kernel . Quindi, era bello sapere per la ricerca ...

Funzionalità indipendenti

Funzionalità indipendenti possono essere filtrate misurando il suo coefficiente di correlazione . Ho confrontato tutte le funzionalità per coppia e misurato la correlazione. Quindi, ho preso il massimo coefficiente di correlazione assoluta di ogni caratteristica come fattore di ridimensionamento. In questo modo, le caratteristiche che non sono correlate con nessun'altra vengono moltiplicate per un valore vicino a 0 e quindi il loro effetto sulla distanza euclidea(aka ) è trascurabile.||x1x2||distance(x1,x2)

Attenzione: il coefficiente di correlazione può misurare solo correlazioni lineari. Vedi la pagina wiki collegata per i dettagli. Se la correlazione nei dati può essere approssimata linearmente, questo funziona bene. Altrimenti, dovresti dare un'occhiata all'ultima pagina di questo documento e vedere se puoi usare la loro misurazione della correlazione per trovare un fattore di ridimensionamento.

Valori discreti

Ho usato l'algoritmo descritto solo per valori continui. Sono stati usati valori discreti per filtrare il set di allenamento. Quindi, se ho l'altezza e il peso di una persona e so che è femmina, guarderò solo campioni di altre femmine per verificare un'anomalia.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.