Compartir a través de


series_decompose_anomalies()

Se aplica a: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

La detección de anomalías se basa en la descomposición de series. Para obtener más información, consulte series_decompose()..

La función toma una expresión que contiene una serie (matriz numérica dinámica) como entrada y extrae puntos anómalos con puntuaciones.

Sintaxis

series_decompose_anomalies (Serie, [ Tendencia ,de estacionalidad, de umbral, Test_points , AD_method Seasonality_threshold ], )

Obtenga más información sobre las convenciones de sintaxis.

Parámetros

Nombre Type Obligatorio Descripción
Serie dynamic ✔️ Matriz de valores numéricos, normalmente la salida resultante de los operadores make-series o make_list .
Umbral real Umbral de anomalías. El valor predeterminado es 1,5, k, para detectar anomalías leves o más fuertes.
Estacionalidad int Controla el análisis estacional. Los valores posibles son:

- -1: detecta automáticamente la estacionalidad mediante series_periods_detect. Este es el valor predeterminado.
- Período de tiempo entero: entero positivo que especifica el período esperado en el número de intervalos. Por ejemplo, si la serie está en 1h contenedores, un período semanal es de 168 contenedores.
- 0: no hay estacionalidad, así que omita la extracción de este componente.
Tendencia string Controla el análisis de tendencias. Los valores posibles son:

- avg: defina el componente de tendencia como average(x). Este es el valor predeterminado.
- linefit: extraiga el componente de tendencia mediante la regresión lineal.
- none: no hay tendencia, así que omita la extracción de este componente.
Test_points int Entero positivo que especifica el número de puntos al final de la serie que se va a excluir del proceso de aprendizaje o regresión. Este parámetro debe establecerse con fines de previsión. El valor predeterminado es 0.
AD_method string Controla el método de detección de anomalías en la serie temporal residual, que contiene uno de los siguientes valores:

- ctukey: prueba de barrera de Tukey con intervalo de percentil 10-90 personalizado. Este es el valor predeterminado.
- tukey: prueba de barrera de Tukey con rango de percentil estándar 25-75.

Para obtener más información sobre las series temporales residuales, consulte series_outliers.
Seasonality_threshold real Umbral de puntuación de estacionalidad cuando estacionalidad se establece en detección automática. El umbral de puntuación predeterminado es 0,6.

Para obtener más información, consulte series_periods_detect.

Devoluciones

La función devuelve las siguientes series respectivas:

  • ad_flag: una serie ternaria que contiene (+1, -1, 0) marcando hacia arriba/abajo/sin anomalías respectivamente
  • ad_score: puntuación de anomalías
  • baseline: valor previsto de la serie, según la descomposición.

El algoritmo

Esta función sigue estos pasos:

  1. Llama a series_decompose() con los parámetros respectivos, para crear la serie de líneas base y residuales.
  2. Calcula ad_score serie aplicando series_outliers() con el método de detección de anomalías elegido en la serie residual.
  3. Calcula la serie ad_flag aplicando el umbral en el ad_score para marcar una anomalía o hacia arriba o hacia abajo, respectivamente.

Ejemplos

Detección de anomalías en estacionalidad semanal

En el ejemplo siguiente, genere una serie con estacionalidad semanal y agregue algunos valores atípicos. series_decompose_anomalies detecta automáticamente la estacionalidad y genera una línea base que captura el patrón repetitivo. Los valores atípicos que agregó se pueden detectar claramente en el componente ad_score.

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 10.0, 15.0) - (((t%24)/10)*((t%24)/10)) // generate a series with weekly seasonality
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y)
| render timechart  

Estacionalidad semanal que muestra los valores atípicos y de línea base.

Detección de anomalías en estacionalidad semanal con tendencia

En este ejemplo, agregue una tendencia a la serie del ejemplo anterior. En primer lugar, ejecute series_decompose_anomalies con los parámetros predeterminados en los que el valor predeterminado de tendencia avg solo toma el promedio y no calcula la tendencia. La línea base generada no contiene la tendencia y es menos exacta, en comparación con el ejemplo anterior. Por lo tanto, algunos de los valores atípicos que insertó en los datos no se detectan debido a la varianza más alta.

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and ongoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y)
| extend series_decompose_anomalies_y_ad_flag = 
series_multiply(10, series_decompose_anomalies_y_ad_flag) // multiply by 10 for visualization purposes
| render timechart

Valores atípicos semanales de estacionalidad con tendencia.

A continuación, ejecute el mismo ejemplo, pero dado que espera una tendencia en la serie, especifique linefit en el parámetro trend. Puede ver que la línea base está mucho más cerca de la serie de entrada. Se detectan todos los valores atípicos insertados y también algunos falsos positivos. Consulte el ejemplo siguiente sobre cómo ajustar el umbral.

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and ongoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y, 1.5, -1, 'linefit')
| extend series_decompose_anomalies_y_ad_flag = 
series_multiply(10, series_decompose_anomalies_y_ad_flag) // multiply by 10 for visualization purposes
| render timechart  

Anomalías estacionales semanales con tendencia de ajuste de línea.

Ajuste del umbral de detección de anomalías

Se detectaron algunos puntos ruidosos como anomalías en el ejemplo anterior. Ahora aumente el umbral de detección de anomalías de un valor predeterminado de 1,5 a 2,5. Use este intervalo interpercentil, de modo que solo se detecten anomalías más fuertes. Ahora, solo se detectarán los valores atípicos que insertó en los datos.

let ts=range t from 1 to 24*7*5 step 1 
| extend Timestamp = datetime(2018-03-01 05:00) + 1h * t 
| extend y = 2*rand() + iff((t/24)%7>=5, 5.0, 15.0) - (((t%24)/10)*((t%24)/10)) + t/72.0 // generate a series with weekly seasonality and onlgoing trend
| extend y=iff(t==150 or t==200 or t==780, y-8.0, y) // add some dip outliers
| extend y=iff(t==300 or t==400 or t==600, y+8.0, y) // add some spike outliers
| summarize Timestamp=make_list(Timestamp, 10000),y=make_list(y, 10000);
ts 
| extend series_decompose_anomalies(y, 2.5, -1, 'linefit')
| extend series_decompose_anomalies_y_ad_flag = 
series_multiply(10, series_decompose_anomalies_y_ad_flag) // multiply by 10 for visualization purposes
| render timechart  

Anomalías semanales de series con un umbral de anomalías mayor.