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:
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:
- Détection de séries chronologiques et d'anomalies
- Détection d'anomalies de séries temporelles avec Python
- Anomalies de séries chronologiques
- Algorithmes pour la détection d'anomalies de séries chronologiques
- Application des ondelettes aux algorithmes de détection d'anomalies basés sur des séries chronologiques
- Quel algorithme devrais-je utiliser?
Ressources externes:
la source
auto.arima
fonction de l'excellentforecast
package de R (voir jstatsoft.org/v27/i03/paper ). Vous pouvez régler les niveaux de confiance en ajustant lelevel
paramètre, par exempledata.model <- auto.arima(data.zoo, ic = c("bic")); data.prediction.warningLimits <- forecast(data.model, h=1, level=0.99)
.Réponses:
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 .
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.
la source
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
la source
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
: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
la source
changepoint
package for R. Si vous souhaitez en savoir plus, vous pouvez consulter les publications suivantes et les références qu’elles fournissent:la source
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).
la source
É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
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.
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.
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.
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.
la source
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.
la source
J'ai pu obtenir de bons résultats pour des séries chronologiques à plusieurs saisonnalités (quotidiennes, hebdomadaires) en utilisant deux algorithmes différents:
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/
la source
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.
la source