series_decompose_anomalies()

Обнаружение аномалий основано на декомпозиции рядов. Дополнительные сведения см. в разделе series_decompose().

Функция принимает выражение, содержащее ряд (динамический числовой массив) в качестве входных данных, и извлекает аномальные точки с оценками.

Синтаксис

series_decompose_anomalies (Серии, [ Пороговое значение,Сезонность,Тенденция,, Test_points, AD_methodSeasonality_threshold ])

Дополнительные сведения о соглашениях о синтаксисе.

Параметры

Имя Тип Обязательно Описание
Series dynamic ✔️ Массив числовых значений, как правило, результирующий результат операторов make-series или make_list .
Пороговое значение. real Порог аномалии. Значение по умолчанию — 1,5, k для обнаружения слабых или более сильных аномалий.
Сезонность int Управляет сезонным анализом. Вы можете выбрать

- -1: автоматическое определение сезонности с помощью series_periods_detect. Это значение по умолчанию.
— Целочисленный период времени: положительное целое число, указывающее ожидаемый период в количестве ячеек. Например, если ряд находится в 1h ячейках, еженедельный период равен 168 ячейкам.
- 0: нет сезонности, поэтому пропустите извлечение этого компонента.
Тренд string Управляет анализом тенденций. Вы можете выбрать

- avg: определите компонент тренда как average(x). Это значение по умолчанию.
- linefit: извлечение компонента тренда с помощью линейной регрессии.
- none: нет тренда, поэтому пропустите извлечение этого компонента.
Test_points int Положительное целое число, указывающее количество точек в конце ряда, исключаемых из процесса обучения или регрессии. Этот параметр следует задать для целей прогнозирования. Значение по умолчанию — 0.
AD_method string Управляет методом обнаружения аномалий в остаточных временных рядах, содержащих одно из следующих значений:

- ctukey: тест ограждения Tukey с пользовательским диапазоном 10-90-го процентиля. Это значение по умолчанию.
- tukey: тест ограждения Туки со стандартным диапазоном 25-75-го процентиля.

Дополнительные сведения о остаточных временных рядах см . в разделе series_outliers.
Seasonality_threshold real Пороговое значение для оценки сезонности, если для параметра Сезонность задано автоматическое определение. Порог оценки по умолчанию — 0,6.

Дополнительные сведения см. в разделе series_periods_detect.

Возвращаемое значение

Функция возвращает следующий соответствующий ряд:

  • ad_flag: тернарный ряд, содержащий (+1, -1, 0), помечающий вверх/вниз/без аномалий соответственно.
  • ad_score: оценка аномалий
  • baseline: прогнозируемое значение ряда в соответствии с декомпозицией.

Алгоритм

Эта функция выполняет следующие действия:

  1. Вызывает series_decompose() с соответствующими параметрами, чтобы создать ряд базовых показателей и остатков.
  2. Вычисляет ad_score ряды, применяя series_outliers() с выбранным методом обнаружения аномалий к ряду остатков.
  3. Вычисляет ряд ad_flag, применяя пороговое значение к ad_score, чтобы пометить аномалию вверх,вниз/без аномалий соответственно.

Примеры

Обнаружение аномалий в еженедельной сезонности

В следующем примере создайте ряд с еженедельной сезонностью, а затем добавьте в него некоторые выбросы. series_decompose_anomalies автоматически определяет сезонность и создает базовый план, который фиксирует повторяющийся шаблон. Добавленные выбросы можно четко обнаружить в компоненте 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  

Еженедельная сезонность, показывающая базовые показатели и выбросы.

Обнаружение аномалий в еженедельной сезонности с помощью тренда

В этом примере добавьте тенденцию в ряд из предыдущего примера. Сначала выполните команду series_decompose_anomalies с параметрами по умолчанию, в которых значение тренда avg по умолчанию принимает только среднее значение и не вычисляет тенденцию. Созданный базовый план не содержит тенденцию и является менее точным по сравнению с предыдущим примером. Следовательно, некоторые выбросы, вставленные в данные, не обнаруживаются из-за более высокой дисперсии.

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

Еженедельная сезонность выбросов с тенденцией.

Затем выполните тот же пример, но так как вы ожидаете тренд в ряде, укажите linefit в параметре trend. Вы можете видеть, что базовый план гораздо ближе к входным рядам. Обнаруживаются все вставленные выбросы, а также некоторые ложные срабатывания. См. следующий пример настройки порогового значения.

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  

Еженедельные аномалии сезонности с тенденцией линейного соответствия.

Настройка порога обнаружения аномалий

Несколько шумных точек были обнаружены как аномалии в предыдущем примере. Теперь увеличьте порог обнаружения аномалий с 1,5 по умолчанию до 2,5. Используйте этот межперецентильный диапазон, чтобы обнаруживаться только более сильные аномалии. Теперь будут обнаружены только выбросы, вставленные в данные.

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  

Аномалии еженедельных рядов с более высоким пороговым значением аномалий.