come confrontare diversi set di dati di serie storiche


8

Sto cercando di rilevare alcune anomalie tra le serie storiche # usando Python e sklearn (ma altri suggerimenti di pacchetti sono sicuramente benvenuti!).

Ho un set di 10 serie storiche; ogni serie temporale è costituita dai dati raccolti dal valore di coppia di uno pneumatico (quindi 10 pneumatici in totale) e gli insiemi potrebbero non contenere lo stesso numero di punti dati (le dimensioni dell'insieme differiscono) . I dati di ogni serie temporale sono praticamente solo il tire_id, il timestamp e il sig_value (valore dal segnale o dal sensore). I dati di esempio per una serie storica si presentano così:

tire_id        timestamp        sig_value
tire_1           23:06.1            12.75
tire_1           23:07.5                0
tire_1           23:09.0            -10.5

Ora ne ho 10 e 2 si comportano in modo strano. Capisco che si tratta di un problema di rilevamento di anomalie, ma la maggior parte degli articoli che leggo online rileva punti di anomalia all'interno della stessa serie temporale (ovvero se in alcuni punti i valori di coppia non sono normali per quello pneumatico).

Per rilevare quali 2 pneumatici si comportano in modo anomalo, ho provato a utilizzare il metodo di clustering, fondamentalmente k-significa clustering (poiché non è supervisionato).

Per preparare i dati da inserire nel clustering k-means, per ogni serie temporale (ovvero per ogni pneumatico), ho calcolato:

  1. Le prime 3 serie di massimo locale adiacente e minimo locale con ampiezza massima (differenza)
  2. Media del valore della coppia
  3. Deviazione standard dei valori di coppia

Ho anche impostato il numero di cluster su solo 2, quindi cluster 1 o 2.

Quindi il mio risultato finale (dopo aver assegnato i cluster) è simile al seguente:

        amplitude  local maxima  local minima  sig_value_std  \
tire_0     558.50        437.75       -120.75      77.538645   
tire_0     532.75        433.75        -99.00      77.538645   
tire_0     526.25        438.00        -88.25      77.538645   
tire_1     552.50       -116.50        436.00      71.125912   
tire_1     542.75        439.25       -103.50      71.125912   

        sig_value_average  cluster  
tire_0          12.816990        0  
tire_0          12.816990        0  
tire_0          12.816990        0  
tire_1          11.588038        1  
tire_1          11.588038        0 

Ora ho una domanda su cosa fare con questo risultato ... quindi ogni pneumatico ha 3 file di dati, dato che ho scelto le prime 3 coppie di max / min locali con 3 ampiezze maggiori, e ciò significa che ogni riga può essere assegnato a un cluster, e talvolta sono assegnati a cluster diversi per 1 pneumatico anche. Inoltre, la dimensione del cluster è normalmente maggiore di solo 2.

Le mie domande sono:

  1. Come fare il rilevamento di anomalie su "serie di serie temporali" non solo su singoli punti dati?
  2. Il mio approccio è ragionevole / logico? Se lo è, come posso ripulire il mio risultato per ottenere quello che voglio? E se no, cosa posso fare per migliorare?

Risposte:


1

Domanda piuttosto interessante!

Prima di tutto dai un'occhiata alla mia modifica poiché la tua domanda non era chiara secondo la terminologia standard. hai un set di serie storiche e vuoi rilevare i valori anomali (anomalie).

  1. Il tuo approccio è piuttosto chiaro e logico e mostra la comprensione del problema e della soluzione. Il punto riguarda il modo in cui hai scelto di applicarlo.
  2. K-significa non è il modo migliore. Vorrei sottolineare che la scelta di 2 cluster è molto intelligente qui poiché speri che i cluster si formino in base a una struttura normale / anormale. In pratica non funziona bene se le funzionalità estratte dalle serie temporali non inibiscono il comportamento anomalo.
  3. Presumo che gli algoritmi di incorporamento siano il modo giusto per farlo. Molto probabilmente se applichi un PCA semplice, vedrai serie temporali anomale da qualche parte più lontano di altre. Di seguito scrivo il codice. Provalo e lasciami un messaggio se non ha funzionato, quindi scelgo soluzioni più sofisticate (ad esempio potresti costruire uno spazio di fase e vedere lì i tuoi dati o monitorare il ripetersi di serie temporali, ecc.)
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt

pca = PCA(n_components=2)
X_new = pca.fit_transform(X)
plt.figure(figsize=(10,10))
plt.plot(X_new[:,0],X_new[:,1],"*")
plt.show()

dove X è una matrice 10xN in cui ogni riga è una serie temporale.

Puoi scegliere più componenti per PCA e confrontare PC diversi tra loro.

Comunque il problema non è così difficile e se non ha funzionato aggiornerò la mia risposta con un'altra soluzione.

Spero che sia d'aiuto e buona fortuna!


ciao Kasra! Grazie mille per aver cercato di aiutare! Sto provando il tuo metodo e ho notato una carenza / limitazione del tuo metodo ... vale a dire che il tuo approccio presuppone che ogni set di dati di serie temporali che sto usando abbia lo stesso numero di punti dati, il che non è il caso qui ... altri suggerimenti? :(
alwaysaskingquestions

Sicuro se voti / accetti la risposta se ha funzionato. Nella primissima fase basta tagliare le serie storiche. Tagliarli per avere le stesse dimensioni della serie temporale più breve. Se non ha aiutato, rilascia un altro commento qui.
Kasra Manshaei

Ciao Kasra, non voglio perdere i dati; è possibile non tagliare i dati? Voglio usarli tutti.
Sempre rispondendo alle domande

Quindi sostituisci la coda delle tue serie temporali con l'ultimo valore.
Provalo

non cambia sostanzialmente i dati? perché ora sto aggiungendo valore ai set di dati più brevi ... quindi questo sta cambiando i miei risultati, giusto? (grazie mille per essere paziente con me!)
rispondendo alle domande
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.