Quale algoritmo dovrei usare per rilevare anomalie nelle serie temporali?


70

sfondo

Sto lavorando in Network Operations Center, monitoriamo i sistemi informatici e le loro prestazioni. Una delle metriche chiave da monitorare è un numero di visitatori / clienti attualmente connessi ai nostri server. Per renderlo visibile, noi (team Ops) raccogliamo metriche come dati di serie temporali e tracciamo grafici. La grafite ci consente di farlo, ha un'API piuttosto ricca che utilizzo per creare un sistema di allerta per avvisare il nostro team in caso di cadute improvvise (principalmente) e altri cambiamenti. Per ora ho impostato una soglia statica basata sul valore medio ma non funziona molto bene (ci sono molti falsi positivi) a causa del diverso carico durante il giorno e la settimana (fattore di stagionalità).

Sembra qualcosa del genere: un numero di utenti per sistema

I dati effettivi (un esempio per una metrica, intervallo di tempo di 15 minuti; il primo numero è un numero di utenti, il secondo - timestamp):

[{"target": "metric_name", "datapoints": [[175562.0, 1431803460], [176125.0, 1431803520], [176125.0, 1431803580], [175710.0, 1431803640], [175710.0, 1431803700], [175733.0, 1431803760], [175733.0, 1431803820], [175839.0, 1431803880], [175839.0, 1431803940], [175245.0, 1431804000], [175217.0, 1431804060], [175629.0, 1431804120], [175104.0, 1431804180], [175104.0, 1431804240], [175505.0, 1431804300]]}]

Quello che sto cercando di realizzare

Ho creato uno script Python che riceve i punti dati recenti, li confronta con la media storica e avvisa se si verifica un cambiamento o una caduta improvvisi. A causa della stagionalità, la soglia "statica" non funziona bene e lo script genera avvisi di falsi positivi. Voglio migliorare un algoritmo di avviso per essere più precisi e farlo funzionare senza regolare costantemente la soglia di avviso.

Che consiglio ho bisogno e cose che ho scoperto

Cercando su google ho pensato che stavo cercando algoritmi di machine learning per il rilevamento di anomalie (senza supervisione). Ulteriori indagini hanno dimostrato che ce ne sono tonnellate ed è molto difficile capire quale sia applicabile nel mio caso. A causa delle mie conoscenze matematiche limitate, non riesco a leggere documenti accademici sofisticati e sto cercando qualcosa di semplice per un principiante nel campo.

Mi piace Python e ho familiarità con R un po ', quindi sarò felice di vedere esempi per queste lingue. Consiglia un buon libro o un articolo che mi aiuterà a risolvere il mio problema. Grazie per il tuo tempo e mi scusi per una descrizione così lunga

Link utili

Domande simili:

Risorse esterne:


1
Hai dato un'occhiata a uno degli algoritmi più semplici come CUSUM?
Vladislavs Dovgalecs,

@xeon, non ancora. Sono nuovo sull'argomento e ho bisogno di un po 'di tempo per digerire tutto. Grazie per averlo sollevato, è un buon punto di partenza, posso implementarlo ora
Ilya Khadykin,

1
Questa è un'ottima domanda, @ ma-ge. Ho uno scenario simile. Il mio approccio era quello di impostare gli allarmi costruendo previsioni periodiche continue usando la auto.arimafunzione dell'eccellente forecastpacchetto di R (vedi jstatsoft.org/v27/i03/paper ). È possibile ottimizzare i livelli di confidenza regolando il levelparametro, ad es data.model <- auto.arima(data.zoo, ic = c("bic")); data.prediction.warningLimits <- forecast(data.model, h=1, level=0.99).
Alex Woolford,

3
I ragazzi di Twitter hanno scritto un articolo molto interessante su questo argomento. Dai
ognjenz,

Ehi @IlyaKhadykin Spero che tu stia bene! hai mai avuto una soluzione per questo problema? Sto facendo qualcosa esattamente lo stesso in cui ogni minuto abbiamo determinati utenti e riceviamo anche molti falsi positivi. A partire da ora stiamo calcolando il punteggio per ogni 5 minuti di dati di intervallo e abbinandolo al modello storico. SE AVETE QUALUNQUE PARTICOLARE ALGORITMO CHE FUNZIONA, PUOI PER FAVORE CONDIVIDERE COME LO HA FATTO. Grazie in anticipo!
ak3191

Risposte:


24

Penso che la chiave sia un qualificatore "inaspettato" nel tuo grafico. Per rilevare l' imprevisto devi avere un'idea di cosa ci si aspetta .

yt=c+ϕyt1+Φ24yt24+Φ25yt25+εttet=yty^t è "troppo grande" si lancia un avviso.

σεεt|et|<3σεet>3σε

Il numero di visitatori è probabilmente abbastanza persistente, ma super stagionale. Potrebbe funzionare meglio provare i manichini stagionali invece della stagionalità moltiplicativa, quindi proveresti ARMAX dove X sta per variabili esogene, che potrebbero essere qualcosa di simile a manichino festivo, manichini dell'ora, manichini del fine settimana ecc.


5
Questo approccio presuppone uno specifico modello ARIMA che avrà parametri distorti in base alle anomalie che sono state implicitamente presunte inesistenti. Un approccio più generale sarebbe quello di identificare ANCHE prima le anomalie e poi un modello ARIMA ottimale che porta a test in linea di significato. Ulteriori anomalie possono essere spostamenti di livello, impulsi stagionali e andamenti dell'ora locale che richiedono una soluzione più generale di quella proposta qui. Vedi unc.edu/~jbhill/tsay.pdf per una procedura completa. Puoi anche "Rilevamento automatico degli interventi" di Google per ulteriori informazioni.
IrishStat,

@IrishStat Ho suggerito ARIMAX con manichini per eventi. OP può tenere conto di eventi noti come arresti anomali del sito Web con manichini. Ciò ridurrà la varianza dell'errore e ci saranno più avvisi. Non c'è motivo di costruire il modello complicato, perché è semplicemente impossibile tenere conto di tutto quando si tratta di traffico del sito web. I modelli semplici funzioneranno meglio.
Aksakal,

2
@ ma-ge, un'altra cosa: potresti voler usare intervalli sovrapposti. Supponiamo che tu raccolga dati ogni minuto, ma per la modellazione puoi scegliere un passaggio in 10 minuti. Crea alcuni problemi per la stima (a causa dell'autocorrelazione), ma il modello risultante molto probabilmente sarà più robusto.
Aksakal,

I modelli @Aksakal dovrebbero essere semplici quanto necessari, ma non troppo semplici.
IrishStat,

17

Sul blog tecnico di Netflix è disponibile un articolo sul loro robusto strumento di rilevamento delle anomalie (RAD). http://techblog.netflix.com/2015/02/rad-outlier-detection-on-big-data.html

Si occupa di stagionalità e set di dati di volume molto elevato, quindi può soddisfare le vostre esigenze. Il codice è open source Java e Apache Pig https://github.com/Netflix/Surus/blob/master/resources/examples/pig/rad.pig

L'algoritmo sottostante si basa su un solido PCA - vedi documento originale qui: http://statweb.stanford.edu/~candes/papers/RobustPCA.pdf


12

La maggior parte degli algoritmi di rilevamento anomali nel pacchetto open source riguarda dati di serie temporali aziendali con dati a bassa frequenza, giornalieri / settimanali / mensili. Questi dati sembrano essere per un'area specializzata che viene catturata in pochi minuti, quindi non sono sicuro che il rilevamento di valori anomali open source sarebbe utile. Potresti provare ad adattare questo approccio ai tuoi dati.

Di seguito descrivo alcuni approcci di pacchetti disponibili in open source R:

  1. tsoutliers : implementa l' algoritmo di rilevamento anomalo di Chen e Liu all'interno del framework arima. vedi la mia domanda precedente su questo sito. Approccio fantastico, ma molto lento non sono sicuro che sarà in grado di gestire dati ad alta frequenza come il tuo. Ha il vantaggio di rilevare tutti i tipi di valori anomali, come menzionato nella mia precedente domanda / post.
  2. Rilevamento di anomalie di Twitter : utilizza l' algoritmo di Rosner per rilevare anomalie basate su serie temporali. L'algoritmo decompone la serie temporale e quindi rileva anomalie. Secondo la mia opinione personale, questo non è efficiente e preciso nel rilevare gli outlires in serie temporali.
  3. tsoutlier nel pacchetto di previsione: simile all'algoritmo di Twitter in termini di decomposizione di serie temporali e quindi di rilevamento di valori anomali. Solo rileverà valori anomali o impulsi additivi.

Esistono pacchetti commerciali che hanno approcci dedicati per provare a rilevare anomalie. Un altro approccio classico è l' algoritmo di rilevamento delle serie temporali di Tsay , simile all'approccio di Chen e Liu che rileva diversi tipi di valori anomali. Di recente mi sono imbattuto anche in questa soluzione software commerciale chiamata metafor che potrebbe essere più adatta ai tuoi dati.

Spero sia utile


Grazie, mi dà una prospettiva su problemi e approcci simili; ringraziamenti speciali per i link!
Ilya Khadykin,

Se qualcuno è alla ricerca di Metafor, siamo stati acquisiti da Splunk. I nostri algoritmi TSAD sono inclusi nelle recenti versioni di Splunk IT Service Intelligence ("ITSI").
Alex Cruise,

5

m

L(m,τ1:m,θ1:(m+1))=i=1m+1p(y(τi1+1):τiθi)

y1,,yn1<τ1<<τm<npθiimchangepoint pacchetto per R. Se vuoi saperne di più, puoi controllare le seguenti pubblicazioni e i riferimenti che forniscono:

Rebecca Killick e Idris A. Eckley. (2013) changepoint: un pacchetto R per Changepoint Analysis. (carta online)

Eckley, IA, Fearnhead, P. e Killick, R. (2011) Analisi dei modelli di punti di cambio. [in:] Modelli bayesiani di serie storiche , ed. D. Barber, AT Cemgil e S. Chiappa, Cambridge University Press.


4

Hai provato a utilizzare le regole di controllo statistico dei processi (ad es. Western Electric http://en.wikipedia.org/wiki/Western_Electric_rules )?

Li uso per i dati di serie temporali - spesso con un pizzico di intuizione sui dati - per valutare se i dati vanno da qualche parte, non voglio che vadano. Come il tuo esempio, queste regole dicono che se il delta / change è coerente su più punti dati, segnala che potrebbe esserci un problema.

Anche Statistical Process Control (SPC) può essere utile per allenarti se stai migliorando o peggiorando rispetto a prima.

Un problema con SPC è che gran parte si basa su una distribuzione normale che probabilmente non soddisfa i tuoi dati che non possono andare sotto lo zero. Altri meglio di me con SPC possono suggerire opzioni qui. Mi piace usarlo per segnalare un problema ma, come tutti i modelli, è meglio usato con una gran quantità di conoscenza dei dati stessi (e della fonte).


4

Dato che la periodicità delle serie temporali dovrebbe essere ben compresa, si può escogitare un algoritmo semplice, ma efficace, basato sulla differenziazione.

Una semplice differenza in un solo passaggio rileverà una caduta improvvisa rispetto a un valore precedente

yt=ytyt1

ma se la serie ha una forte componente periodica, ti aspetteresti che tale calo sia considerevole su base regolare. In questo caso sarebbe meglio confrontare qualsiasi valore con la sua controparte nello stesso punto del ciclo precedente, cioè un periodo fa.

yt=ytytnwhere n=length of period

Nel caso della domanda pubblicata sarebbe naturale aspettarsi due componenti periodiche significative, una per la durata di un giorno, l'altra per la durata di una settimana. Ma questo non è molto complicato, poiché la lunghezza del periodo più lungo può essere divisa ordinatamente per la lunghezza del più breve.

n247=168

Se le gocce hanno più di un carattere proporzionale, una semplice differenza non riuscirà facilmente a rilevare una caduta improvvisa quando l'attività è bassa. In tali circostanze, l'algoritmo può essere modificato per calcolare invece i rapporti.

yt=ytytn

Ho fatto alcuni test in R usando un set di dati simulato. In esso i dati vengono campionati 6 volte al giorno e ci sono forti periodi giornalieri e settimanali, insieme ad altri rumori e fluttuazioni. Le gocce sono state aggiunte in punti casuali e di durate tra 1 e 3.
Per isolare le gocce, i primi rapporti sono stati calcolati alla distanza 42, quindi una soglia fissata a 0,6, poiché è interessante solo la variazione negativa di una determinata dimensione. Quindi è stata calcolata una differenza di un passo e una soglia è stata impostata a -0,5. Alla fine sembra essersi verificato un falso positivo (quello alla fine della settimana 16). I grafici a sinistra e a destra mostrano gli stessi dati, solo in modi diversi.

inserisci qui la descrizione dell'immagine


3

Sarebbe più utile pensare ai cambiamenti nelle serie temporali come l'inizio di una nuova tendenza piuttosto che un'anomalia? Prendere la differenza tra punti adiacenti aiuterebbe a capire quando la pendenza (derivata) sta cambiando e potrebbe segnalare l'inizio di una nuova tendenza nella data. Anche prendere le differenze dei valori di differenza (la seconda derivata) potrebbe essere utile. Effettuare una ricerca su Google "serie temporali all'inizio della tendenza) può dare buoni suggerimenti per i metodi. Nei dati finanziari si presta molta attenzione alle nuove tendenze (comprate o vendete?), Quindi ci sono articoli su questo argomento.

Una buona introduzione a wavelet è "Il mondo secondo le wavelet" di Hubbard, credo sia l'autore.


2

Sono stato in grado di ottenere alcuni risultati interessanti per le serie temporali a stagionalità multipla (giornaliera, settimanale) utilizzando due diversi algoritmi:

  • Decomposizione delle tendenze stagionali usando loess (o STL) per stabilire le serie di punti medi.
  • Regressione non lineare per stabilire soglie attorno a quel punto medio, in base alla relazione tra la varianza e il livello.

STL effettua una scomposizione nel dominio del tempo delle serie temporali in un componente di tendenza, un singolo componente stagionale e un resto. La componente stagionale è la stagionalità delle alte frequenze (ad esempio, ogni giorno), mentre la tendenza include sia la stagionalità delle basse frequenze (ad esempio, settimanale) e la tendenza corretta. È possibile separare i due semplicemente eseguendo nuovamente STL sulla tendenza. Ad ogni modo, una volta isolate le serie rimanenti dagli altri componenti, è possibile eseguire il rilevamento delle anomalie rispetto a quelle serie.

Ho fatto un commento più dettagliato qui:

https://techblog.expedia.com/2016/07/28/applying-data-science-to-monitoring/


1

Ispirato da David, hai provato a usare FFT? Potrebbe essere in grado di individuare cadute improvvise perché indicano le tue anomalie. Le anomalie potrebbero apparire in uno spettro ristretto. Quindi puoi catturarli facilmente.

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.