83 votos

¿Qué algoritmo debo utilizar para detectar anomalías en las series temporales?

Antecedentes

Trabajo en el Centro de Operaciones de Red, donde supervisamos los sistemas informáticos y su rendimiento. Una de las métricas clave a supervisar es el número de visitantes \customers actualmente conectado a nuestros servidores. Para hacerlo visible, nosotros (el equipo de operaciones) recopilamos métricas como datos de series temporales y dibujamos gráficos. Grafito nos permite hacerlo, tiene una API bastante rica que utilizo para construir un sistema de alertas para notificar a nuestro equipo si se producen caídas repentinas (en su mayoría) y otros cambios. Por ahora he establecido un umbral estático basado en el valor medio, pero no funciona muy bien (hay muchos falsos positivos) debido a la diferente carga durante el día y la semana (factor de estacionalidad).

Se parece a esto: a number of users per system

Los datos reales (un ejemplo para una métrica, rango de tiempo de 15 minutos; el primer número es un número de usuarios, el segundo - sello de tiempo ):

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

Lo que intento conseguir

He creado un script en Python que recibe puntos de datos recientes, los compara con la media histórica y alerta si hay un cambio o una caída repentina. Debido a la estacionalidad, el umbral "estático" no funciona bien y el script genera alertas falsas. Quiero mejorar un algoritmo de alerta para que sea más preciso y que funcione sin necesidad de ajustar constantemente el umbral de alerta.

Qué consejos necesito y qué cosas he descubierto

Buscando en Google me di cuenta de que estoy buscando algoritmos de aprendizaje automático para la detección de anomalías (no supervisados). Investigando un poco más, me di cuenta de que hay montones de ellos y es muy difícil entender cuál es el aplicable en mi caso. Debido a mis limitados conocimientos de matemáticas no puedo leer sofisticados artículos académicos y estoy buscando algo sencillo para un principiante en el campo.

Me gusta Python y estoy un poco familiarizado con R, así que estaré encantado de ver ejemplos para estos lenguajes. Por favor, recomiende un buen libro o artículo que me ayude a resolver mi problema. Gracias por su tiempo y discúlpenme por una descripción tan larga

Enlaces útiles

Preguntas similares:

Recursos externos:

4voto

Fredrik Mörk Puntos 85694

Dado que la periodicidad de las series temporales debe ser bien comprendida, se puede concebir un algoritmo simple, pero eficaz, basado en la diferenciación.

Una simple diferenciación de un paso detectará una caída repentina de un valor anterior

$$y_t'= y_t - y_{t-1}$$

pero si la serie tiene un fuerte componente periódico es de esperar que esa caída sea considerable de forma regular. En este caso sería mejor comparar cualquier valor con su homólogo en el mismo punto del ciclo anterior, es decir, un periodo atrás.

$$y_t'= y_t - y_{t-n} \quad \text{where } n=\text{length of period}$$

En el caso de la pregunta publicada, sería natural esperar dos componentes periódicos significativos, uno la duración de un día y el otro la duración de una semana. Pero esto no es una gran complicación, ya que la duración del período más largo puede dividirse claramente por la duración del más corto.

Si el muestreo se realiza cada hora, $n$ en la ecuación anterior debe ajustarse a $24*7 = 168$

Si las caídas son más bien de carácter proporcional, una simple diferencia no detectará fácilmente una caída repentina cuando la actividad sea baja. En tales circunstancias, el algoritmo puede modificarse para calcular ratios en su lugar.

$$y_t^*= \frac{y_t}{y_{t-n}}$$

Hice algunas pruebas en R utilizando un conjunto de datos simulado. En él los datos se muestrean 6 veces al día y hay fuertes períodos diarios y semanales, junto con otros ruidos y fluctuaciones. Se añadieron gotas en lugares aleatorios y de duraciones entre 1 y 3.
Para aislar las gotas, primero se calcularon las relaciones a la distancia 42, y luego se fijó un umbral en 0,6, ya que sólo interesa el cambio negativo de cierto tamaño. A continuación, se calculó una diferencia de un paso y se fijó un umbral en -0,5. Al final parece que se ha colado un falso positivo (el del final de la semana 16). Los gráficos de la izquierda y la derecha muestran los mismos datos, sólo que de forma diferente.

enter image description here

3voto

user10586 Puntos 18

¿Sería más útil pensar que los cambios en la serie temporal son el comienzo de una nueva tendencia en lugar de una anomalía? Tomar la diferencia entre puntos adyacentes ayudaría a saber cuándo cambia la pendiente (derivada) y podría señalar el comienzo de una nueva tendencia en la fecha. También podría ser útil tomar las diferencias de los valores de la diferencia (la segunda derivada). Una búsqueda en Google sobre "inicio de tendencia en las series temporales" puede dar buenas sugerencias de métodos. En los datos financieros se presta mucha atención a las nuevas tendencias (¿compra o venta?), por lo que hay artículos sobre este tema.

Una buena introducción a las ondículas es "El mundo según las ondículas" de Hubbard creo que es el autor.

2voto

Pude obtener algunos resultados agradables para series temporales de múltiples estacionalidades (diarias, semanales) utilizando dos algoritmos diferentes:

  • Descomposición de la tendencia estacional utilizando loess (o STL) para establecer la serie del punto medio.
  • Regresión no lineal para establecer umbrales en torno a ese punto medio, basados en la relación entre la varianza y el nivel.

STL realiza una descomposición en el dominio del tiempo de su serie temporal en un componente de tendencia, un único componente estacional y un resto. El componente estacional es su estacionalidad de alta frecuencia (por ejemplo, diaria), mientras que la tendencia incluye tanto la estacionalidad de baja frecuencia (por ejemplo, semanal) como la tendencia propiamente dicha. Puede separar los dos simplemente ejecutando el STL de nuevo en la tendencia. De todos modos, una vez que aísle la serie restante de los otros componentes, puede realizar su detección de anomalías contra esa serie.

Hice un informe más detallado aquí:

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

1voto

szemek Puntos 46

Inspirado por David, ¿has probado a utilizar la FFT? Podría detectar las caídas repentinas, ya que éstas indican tus anomalías. Las anomalías pueden aparecer en un espectro estrecho. Así que puedes capturarlas fácilmente.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X