Compartilhar via


series_decompose_anomalies()

Aplica-se a: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

A detecção de anomalias é baseada na decomposição em série. Para obter mais informações, consulte series_decompose().

A função recebe uma expressão contendo uma série (matriz numérica dinâmica) como entrada e extrai pontos anômalos com pontuações.

Sintaxe

series_decompose_anomalies (Série, [ Tendência, de sazonalidade ,do limiar ,Test_points , AD_method, Seasonality_threshold])

Saiba mais sobre as convenções de sintaxe.

Parâmetros

Nome Digitar Obrigatória Descrição
Série dynamic ✔️ Uma matriz de valores numéricos, normalmente a saída resultante de operadores make-series ou make_list .
Limite real O limiar de anomalia. O padrão é 1,5, valor k, para detectar anomalias leves ou mais fortes.
Sazonalidade int Controla a análise sazonal. Os valores possíveis são:

- -1: Detectar automaticamente a sazonalidade usando series_periods_detect. Este é o valor padrão.
- Período de tempo inteiro: Um inteiro positivo que especifica o período esperado em número de compartimentos. Por exemplo, se a série estiver em compartimentos, um período semanal será de 1h 168 compartimentos.
- 0: Sem sazonalidade, então pule a extração deste componente.
Tendência string Controla a análise de tendências. Os valores possíveis são:

- avg: Defina o componente de tendência como average(x). Esse é o padrão.
- linefit: Extraia o componente de tendência usando regressão linear.
- none: Sem tendência, então pule a extração deste componente.
Test_points int Um número inteiro positivo que especifica o número de pontos no final da série a serem excluídos do processo de aprendizado ou regressão. Este parâmetro deve ser definido para fins de previsão. O valor padrão é 0.
AD_method string Controla o método de detecção de anomalias na série temporal residual, contendo um dos seguintes valores:

- ctukey: Teste de cerca de Tukey com faixa de percentil 10 a 90 personalizada. Esse é o padrão.
- tukey: Teste de cerca de Tukey com faixa padrão de percentil 25 a 75.

Para obter mais informações sobre séries temporais residuais, consulte series_outliers.
Seasonality_threshold real O limite para pontuação de sazonalidade quando Sazonalidade é definido como detecção automática. O limite de pontuação padrão é 0,6.

Para obter mais informações, consulte series_periods_detect.

Devoluções

A função retorna as seguintes séries respectivas:

  • ad_flag: Uma série ternária contendo (+1, -1, 0) marcação para cima/para baixo/sem anomalia, respectivamente
  • ad_score: Pontuação de anomalia
  • baseline: O valor previsto da série, de acordo com a decomposição

O algoritmo

Esta função segue estas etapas:

  1. Chama series_decompose() com os respectivos parâmetros, para criar a série de linha de base e resíduos.
  2. Calcula ad_score série aplicando series_outliers() com o método de detecção de anomalias escolhido na série de resíduos.
  3. Calcula a série ad_flag aplicando o limite no ad_score para marcar para cima/para baixo/sem anomalia, respectivamente.

Exemplos

Detectar anomalias na sazonalidade semanal

No exemplo a seguir, gere uma série com sazonalidade semanal e adicione alguns valores discrepantes a ela. series_decompose_anomalies Detecta automaticamente a sazonalidade e gera uma linha de base que captura o padrão repetitivo. Os valores discrepantes adicionados podem ser claramente identificados no 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  

Sazonalidade semanal mostrando linha de base e valores discrepantes.

Detecte anomalias na sazonalidade semanal com tendência

Neste exemplo, adicione uma tendência à série do exemplo anterior. Primeiro, execute series_decompose_anomalies com os parâmetros padrão nos quais o valor padrão da tendência avg usa apenas a média e não calcula a tendência. A linha de base gerada não contém a tendência e é menos exata em comparação com o exemplo anterior. Consequentemente, alguns dos valores discrepantes inseridos nos dados não são detectados devido à maior variação.

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

Outliers de sazonalidade semanal com tendência.

Em seguida, execute o mesmo exemplo, mas como você está esperando uma tendência na série, especifique linefit no parâmetro de tendência. Você pode ver que a linha de base está muito mais próxima da série de entrada. Todos os outliers inseridos são detectados e também alguns falsos positivos. Veja o próximo exemplo sobre como ajustar o limite.

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  

Anomalias de sazonalidade semanais com tendência de linefit.

Ajuste o limite de detecção de anomalias

Alguns pontos ruidosos foram detectados como anomalias no exemplo anterior. Agora aumente o limite de detecção de anomalias de um padrão de 1,5 para 2,5. Use esse intervalo interpercentil, para que apenas anomalias mais fortes sejam detectadas. Agora, apenas os outliers que você inseriu nos dados serão detectados.

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  

Anomalias de séries semanais com maior limiar de anomalias.