series_decompose_anomalies()
Se aplica a: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft 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 respectivamentead_score
: puntuación de anomalíasbaseline
: valor previsto de la serie, según la descomposición.
El algoritmo
Esta función sigue estos pasos:
- Llama a series_decompose() con los parámetros respectivos, para crear la serie de líneas base y residuales.
- Calcula ad_score serie aplicando series_outliers() con el método de detección de anomalías elegido en la serie residual.
- 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
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
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
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