Quel algorithme devrais-je utiliser pour détecter des anomalies sur des séries chronologiques?

70

Contexte

Je travaille dans le centre d'opérations réseau, nous surveillons les systèmes informatiques et leurs performances. L'un des indicateurs clés à surveiller est le nombre de visiteurs \ clients actuellement connectés à nos serveurs. Pour le rendre visible, nous (l'équipe d'opérations) collectons des métriques telles que des données de séries chronologiques et des graphiques. Le graphite nous permet de le faire, il a une API assez riche que j'utilise pour construire un système d'alerte afin d'avertir notre équipe en cas de chutes soudaines (principalement) et d'autres changements. Pour l'instant, j'ai défini un seuil statique basé sur la valeur moyenne, mais cela ne fonctionne pas très bien (il y a beaucoup de faux positifs) en raison d'une charge différente pendant la journée et la semaine (facteur de saisonnalité).

Cela ressemble à quelque chose comme ça: un nombre d'utilisateurs par système

Les données réelles (un exemple pour une métrique, intervalle de temps de 15 minutes; le premier nombre est un nombre d'utilisateurs, le deuxième horodatage):

[{"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]]}]

Ce que j'essaie d'accomplir

J'ai créé un script Python qui reçoit les points de données récents, les compare à la moyenne historique et avertit en cas de changement soudain ou de chute. En raison de la saisonnalité, le seuil "statique" ne fonctionne pas correctement et le script génère des alertes de faux positifs. Je souhaite améliorer un algorithme d'alerte pour le rendre plus précis et le faire fonctionner sans réglage constant du seuil d'alerte.

De quel conseil ai-je besoin et des choses que j'ai découvertes

En cherchant sur Google, je me suis dit que je cherchais des algorithmes d'apprentissage automatique pour la détection des anomalies (non supervisés). Une enquête plus approfondie a montré qu'il y en avait des tonnes et il est très difficile de comprendre laquelle est applicable dans mon cas. En raison de mes connaissances limitées en mathématiques, je ne peux pas lire de documents académiques sophistiqués et je cherche quelque chose de simple pour un débutant dans le domaine.

J'aime Python et je connais un peu R, donc je serai heureux de voir des exemples pour ces langages. Veuillez recommander un bon livre ou un article qui m'aidera à résoudre mon problème. Merci pour votre temps et excusez-moi pour une si longue description

Liens utiles

Questions similaires:

Ressources externes:

Ilya Khadykin
la source
1
Avez-vous examiné l'un des algorithmes les plus simples tels que CUSUM?
Vladislavs Dovgalecs
@ xeon, pas encore. Je suis nouveau sur le sujet et j'ai besoin de temps pour tout digérer. Merci d'avoir soulevé ce point, c'est un bon point de départ, je peux le mettre en œuvre dès maintenant
Ilya Khadykin
1
C'est une excellente question, @ ma-ge. J'ai un scénario similaire. Mon approche consistait à configurer des alertes en construisant des prévisions périodiques en continu à l'aide de la auto.arimafonction de l'excellent forecastpackage de R (voir jstatsoft.org/v27/i03/paper ). Vous pouvez régler les niveaux de confiance en ajustant le levelparamètre, par exemple data.model <- auto.arima(data.zoo, ic = c("bic")); data.prediction.warningLimits <- forecast(data.model, h=1, level=0.99).
Alex Woolford
3
Les gars de Twitter ont écrit un article très intéressant sur ce sujet. Découvrez-le: blog.twitter.com/2015/…
ognjenz
Hey @IlyaKhadykin J'espère que vous allez bien! Avez-vous déjà eu une solution à ce problème? Je fais quelque chose de exactement pareil dans lequel chaque minute nous avons certains utilisateurs et nous obtenons aussi beaucoup de faux positifs. À partir de maintenant, nous calculons le score pour toutes les 5 minutes de données d'intervalle et le comparons au modèle historique. SI VOUS AVEZ UN ALGORITHME PARTICULIER, VOUS POUVEZ PARTAGER COMME VOUS L'AVEZ FAIT. Merci d'avance!
ak3191

Réponses:

24

Je pense que la clé est un qualificatif "inattendu" dans votre graphique. Afin de détecter les imprévus, vous devez avoir une idée de ce qui est attendu .

yt=c+ϕyt1+Φ24yt24+Φ25yt25+εttet=yty^t est "trop ​​gros" vous lancez une alerte.

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

Le nombre de visiteurs est probablement assez persistant, mais très saisonnier. Il serait peut-être préférable d’essayer les mannequins saisonniers au lieu de la saisonnalité multiplicative, puis essayez ARMAX, où X représente des variables exogènes, qui peuvent être différentes de celles des mannequins de vacances, des mannequins du week-end, des mannequins de week-end, etc.

Aksakal
la source
5
Cette approche suppose un modèle ARIMA spécifique qui comportera des paramètres biaisés basés sur les anomalies supposées implicitement inexistantes. Une approche plus générale consisterait à identifier d'abord les anomalies, puis un modèle ARIMA optimal conduisant à des tests de significativité en ligne. Les anomalies additionnelles peuvent être des changements de niveau, des impulsions saisonnières et des tendances de l'heure locale qui nécessitent une solution plus générale que celle proposée ici. Voir unc.edu/~jbhill/tsay.pdf pour une procédure complète. Vous pouvez également utiliser Google "Détection automatique des interventions" pour plus d'informations.
IrishStat
@IrishStat J'ai suggéré ARIMAX avec des nuls pour les événements. OP peut prendre en compte des événements connus, tels que des pannes de site Web avec des nuls. Cela réduira la variance d'erreur et il y aura plus d'alertes. Il n’ya aucune raison de construire ce modèle compliqué, car il est tout simplement impossible de tout comptabiliser en matière de trafic sur les sites Web. Les modèles simples fonctionneront mieux.
Aksakal
2
@ ma-ge, encore une chose: vous pouvez utiliser des intervalles qui se chevauchent. Supposons que vous collectez des données toutes les minutes, mais pour la modélisation, vous pouvez choisir une étape en 10 minutes. Cela crée des problèmes d'estimation (dus à l'autocorrélation), mais le modèle résultant sera probablement plus robuste.
Aksakal
Les modèles @Aksakal doivent être aussi simples que nécessaire MAIS pas trop simples.
IrishStat
17

Le blog technique de Netflix contient un article sur leur outil de détection des anomalies robustes (RAD). http://techblog.netflix.com/2015/02/rad-outlier-detection-on-big-data.html

Il traite de la saisonnalité et des jeux de données très volumineux afin de répondre à vos besoins. Le code est open source Java et Apache Pig https://github.com/Netflix/Surus/blob/master/resources/examples/pig/rad.pig.

L'algorithme sous-jacent est basé sur une PCA robuste - voir l'article original ici: http://statweb.stanford.edu/~candes/papers/RobustPCA.pdf

Paul McGettigan
la source
12

La plupart des algorithmes de détection de valeurs aberrantes dans un package open source concernent les données de séries chronologiques d’affaires avec des données de fréquence basse fréquence, journalières / hebdomadaires / mensuelles. Ces données semblent concerner un domaine spécialisé qui est capturé en quelques minutes. Je ne suis donc pas sûr que la détection des valeurs aberrantes open source serait utile. Vous pouvez essayer d’adapter cette approche à vos données.

Ci-dessous, je présente quelques approches de paquets disponibles en open source R:

  1. tsoutliers : Implémente l' algorithme de détection de valeurs aberrantes de Chen et Liu dans le cadre d'arima. voir ma question précédente sur ce site. Approche fantastique, mais très lente, ne sachant pas si elle sera capable de gérer des données à haute fréquence comme la vôtre. Il a l'avantage de détecter tous les types de valeurs aberrantes, comme mentionné dans ma question / message précédent.
  2. Détection d'anomalies de Twitter : Utilise l' algorithme de Rosner pour détecter des anomalies basées sur des séries chronologiques. L'algorithme décompose les séries de temps, puis détecte les anomalies. À mon avis, cela n’est ni efficace ni précis pour détecter les dépassements dans les séries chronologiques.
  3. Ensemble de prévisions: similaire à l'algorithme de twitter en termes de décomposition de séries chronologiques et de détection des valeurs aberrantes. Seuls détecteront les valeurs aberrantes ou impulsions additives.

Il existe des packages commerciaux qui ont des approches dédiées pour tenter de détecter les anomalies. Une autre approche classique est l' algorithme de détection des valeurs aberrantes de la série chronologique de Tsay , similaire à celle de Chen et Liu qui détecte différents types de valeurs aberrantes. Je suis aussi récemment tombé sur cette solution logicielle commerciale appelée metafor, qui pourrait mieux convenir à vos données.

J'espère que c'est utile

prévisionniste
la source
Merci, cela me donne une perspective sur des problèmes et des approches similaires; merci spécial pour les liens!
Ilya Khadykin
Si quelqu'un cherche Metafor, nous avons été acquis par Splunk. Nos algorithmes TSAD sont inclus dans les versions récentes de 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 package for R. Si vous souhaitez en savoir plus, vous pouvez consulter les publications suivantes et les références qu’elles fournissent:

Rebecca Killick et Idris A. Eckley. (2013) changepoint: un package R pour l'analyse des points de changement. (papier en ligne)

Eckley, IA, Fearnhead, P. et Killick, R. (2011), Analyse de modèles de points de changement. [en:] Bayesian Time Series Models , eds. D. Barber, AT Cemgil et S. Chiappa, Cambridge University Press.

Tim
la source
4

Avez-vous essayé d'utiliser des règles de contrôle de processus statistique (par exemple, http://en.wikipedia.org/wiki/Western_Electric_rules de Western Electric )?

Je les utilise pour les données de séries chronologiques - souvent avec une pointe d'intuition sur les données - pour évaluer si les données vont quelque part que je ne veux pas. Comme dans votre exemple, ces règles indiquent que si le delta / changement est cohérent sur plusieurs points de données, cela indique qu'il peut y avoir un problème.

De même, le contrôle statistique du processus (SPC) peut vous aider à vous améliorer si votre état s'améliore ou empire.

Un problème avec SPC est qu’il dépend en grande partie d’une distribution normale qui ne convient probablement pas à vos données qui ne peuvent pas descendre en dessous de zéro. D'autres, mieux que moi avec SPC, peuvent suggérer des options ici. J'aime l'utiliser pour signaler un problème, mais, comme pour tous les modèles, il est préférable de l'utiliser avec un minimum de connaissances sur les données elles-mêmes (et leur source).

MarkR
la source
4

Étant donné que la périodicité de la série chronologique doit être bien comprise, un algorithme simple, mais efficace, basé sur la différenciation peut être conçu.

Une simple différenciation en une étape détectera une chute soudaine d'une valeur précédente

yt=ytyt1

mais si la série comporte une forte composante périodique, vous vous attendriez à ce que cette baisse soit considérable régulièrement. Dans ce cas, il serait préférable de comparer toute valeur à sa contrepartie au même moment du cycle précédent, c'est-à-dire il y a une période.

yt=ytytnwhere n=length of period

Dans le cas de la question affichée, il serait naturel de s'attendre à deux composantes périodiques importantes, l'une d'une journée et l'autre d'une semaine. Mais cela n’a pas beaucoup de complications, car la durée de la période la plus longue peut être nettement divisée par la longueur de la période la plus courte.

n247=168

Si les baisses ont davantage un caractère proportionnel, une simple différence ne pourra facilement pas détecter une chute soudaine lorsque l'activité est faible. Dans de telles circonstances, l'algorithme peut être modifié pour calculer des ratios à la place.

yt=ytytn

J'ai fait quelques tests dans R en utilisant un jeu de données simulé. Les données y sont échantillonnées 6 fois par jour et il existe de fortes périodes quotidiennes et hebdomadaires, ainsi que d’autres bruits et fluctuations. Des gouttes ont été ajoutées à des endroits aléatoires et de durées comprises entre 1 et 3.
Pour isoler les gouttes, les premiers rapports ont été calculés à la distance 42, puis à un seuil fixé à 0,6, car seul un changement négatif d'une certaine taille présente un intérêt. Ensuite, une différence en une étape a été calculée et un seuil défini à -0,5. En fin de compte, un faux positif semble avoir glissé (celui de fin de semaine 16). Les graphiques à gauche et à droite montrent les mêmes données, mais de différentes manières.

entrez la description de l'image ici

AkselA
la source
3

Serait-il plus utile de considérer les changements dans la série chronologique comme le début d'une nouvelle tendance plutôt que comme une anomalie? Prendre la différence entre des points adjacents aiderait à savoir quand la pente (dérivée) change et pourrait signaler le début d'une nouvelle tendance dans la date. Prendre également les différences des valeurs de différence (la dérivée seconde) pourrait être utile. Effectuer une recherche Google sur les "séries chronologiques début de tendance) peut donner de bonnes suggestions de méthodes. Dans les données financières, une attention toute particulière est accordée aux nouvelles tendances (achetez-vous ou vendez-vous?). Il existe donc des documents sur ce sujet.

Une bonne introduction aux ondelettes est "Le monde d'après les ondelettes" de Hubbard, je crois, en est l'auteur.

DavidF
la source
2

J'ai pu obtenir de bons résultats pour des séries chronologiques à plusieurs saisonnalités (quotidiennes, hebdomadaires) en utilisant deux algorithmes différents:

  • Décomposition de la tendance saisonnière en utilisant loess (ou STL) pour établir la série des points médians.
  • Régression non linéaire pour établir des seuils autour de ce point médian, en fonction de la relation entre la variance et le niveau.

STL effectue une décomposition dans le domaine temporel de votre série temporelle en un composant de tendance, un composant saisonnier unique et un reste. La composante saisonnière est votre saisonnalité haute fréquence (par exemple, quotidienne), tandis que la tendance inclut à la fois la saisonnalité basse fréquence (par exemple, hebdomadaire) et la tendance proprement dite. Vous pouvez séparer les deux en exécutant simplement à nouveau STL sur la tendance. Quoi qu'il en soit, une fois que vous avez isolé le reste de la série des autres composants, vous pouvez effectuer la détection de votre anomalie par rapport à cette série.

J'ai rédigé un article plus détaillé ici:

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

Willie Wheeler
la source
1

Inspiré par David, avez-vous essayé d'utiliser FFT? Il pourrait peut-être détecter des gouttes soudaines, car celles-ci indiquent vos anomalies. Les anomalies peuvent apparaître dans un spectre étroit. Ainsi, vous pouvez facilement les capturer.

Romeo Kienzler
la source