comment comparer différents ensembles de données de séries chronologiques

8

J'essaie de faire une détection d'anomalie entre les séries temporelles # en utilisant Python et sklearn (mais d'autres suggestions de packages sont certainement les bienvenues!).

J'ai un ensemble de 10 séries chronologiques; chaque série chronologique se compose de données collectées à partir de la valeur de couple d'un pneu (donc 10 pneus au total) et les ensembles peuvent ne pas contenir le même nombre de points de données (la taille de l'ensemble diffère) . Chaque donnée de série chronologique est à peu près juste le pneu_id, l'horodatage et la valeur sig_ (valeur du signal ou du capteur). Des exemples de données pour une série chronologique ressemblent à ceci:

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

Maintenant, j'en ai 10, et 2 d'entre eux se comportent étrangement. Je comprends qu'il s'agit d'un problème de détection d'anomalie, mais la plupart des articles que j'ai lus en ligne détectent des points d'anomalie dans la même série temporelle (alias si à certains moments les valeurs de couple ne sont pas normales pour ce pneu).

Pour détecter quels 2 pneus se comportent anormalement, j'ai essayé d'utiliser la méthode de clustering, essentiellement le clustering k-means (car il n'est pas supervisé).

Pour préparer les données à alimenter dans le cluster k-means, pour chaque série chronologique (aka pour chaque pneu), j'ai calculé:

  1. Les 3 premiers ensembles de maximum local et de minimum local adjacents avec l'amplitude (différence) la plus élevée
  2. Valeur moyenne du couple
  3. Écart type des valeurs de couple

J'ai également défini le nombre de clusters à seulement 2, donc soit le cluster 1 ou 2.

Donc mon résultat final (après avoir assigné des clusters) ressemble à ceci:

        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 

Maintenant, j'ai une question de savoir quoi faire avec ce résultat ... donc chaque pneu a 3 lignes de données, car j'ai choisi les 3 premières paires de max / min locales avec les 3 plus grandes amplitudes, et cela signifie que chaque ligne peut être assignés à un cluster, et parfois ils sont affectés à différents clusters pour 1 pneu même. De plus, la taille du cluster est normalement supérieure à seulement 2.

Mes questions sont:

  1. Comment faire la détection d'anomalies sur un "ensemble de séries chronologiques" et pas seulement sur des points de données individuels?
  2. Mon approche est-elle raisonnable / logique? Si c'est le cas, comment puis-je nettoyer mon résultat pour obtenir ce que je veux? Et sinon, que puis-je faire pour m'améliorer?
poser toujours des questions
la source

Réponses:

1

Question assez intéressante!

Tout d'abord, jetez un œil à ma modification car votre question n'était pas claire selon la terminologie standard. vous disposez d'un ensemble de séries chronologiques et vous souhaitez détecter les valeurs aberrantes (anomalies).

  1. Votre approche est assez claire et logique et montre la compréhension du problème et de la solution. Le point concerne la façon dont vous avez choisi de l'appliquer.
  2. K-means n'est pas le meilleur moyen. Je voudrais souligner que le choix de 2 grappes est très intelligent ici car vous espérez que les grappes se formeront sur la base d'une structure normale / anormale. Cela ne fonctionne tout simplement pas bien dans la pratique si les fonctionnalités que vous avez extraites de votre série chronologique n'inhibent pas le comportement anormal.
  3. Je suppose que les algorithmes d'intégration sont la bonne façon de le faire. Très probablement, si vous appliquez une PCA simple, vous verrez des séries chronologiques anormales quelque part plus loin que les autres. Ci-dessous, j'écris le code. Essayez-le et envoyez-moi une ligne si cela n'a pas fonctionné, alors je vais pour des solutions plus sophistiquées (par exemple, vous pouvez construire un espace de phase et y voir vos données ou surveiller la récurrence des séries chronologiques, etc.)
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()

où X est une matrice 10xN dans laquelle chaque ligne est une série chronologique.

Vous pouvez choisir plus de composants pour PCA et comparer différents PC les uns contre les autres.

Quoi qu'il en soit, le problème n'est pas si difficile et si cela n'a pas fonctionné, je mettrai à jour ma réponse avec une autre solution.

J'espère que ça aide et bonne chance!

Kasra Manshaei
la source
salut Kasra! Merci beaucoup d'avoir essayé d'aider! J'essaie votre méthode et j'ai remarqué une pénurie / limitation de votre méthode ... c'est que votre approche suppose que chaque série de données chronologiques que j'utilise a le même nombre de points de données, ce qui n'est pas le cas ici ... d'autres suggestions? :(
alwaysaskingquestions
Bien sûr, si vous votez / acceptez la réponse si cela a fonctionné. À la toute première étape, il suffit de couper des séries chronologiques. Coupez-les pour avoir la même taille que les séries temporelles les plus courtes. Si cela n'a pas aidé, déposez un autre commentaire ici.
Kasra Manshaei
Salut Kasra, je ne veux pas perdre les données; est-il possible de ne pas couper les données? Je veux tous les utiliser.
poser des questions
Remplacez donc la queue de votre série chronologique par la dernière valeur. Essayez-le et faites-moi savoir si cela a fonctionné
Kasra Manshaei
cela ne change-t-il pas fondamentalement les données? parce que maintenant j'ajoute de la valeur aux ensembles de données plus courts .... donc cela change mes résultats non? (merci beaucoup d'avoir été patient avec moi!)
toujoursquestionner les questions