series_decompose_anomalies()
Область применения: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Обнаружение аномалий основано на декомпозиции ряда. Дополнительные сведения см. в разделе series_decompose().
Функция принимает выражение, содержащее ряд (динамический числовый массив) в качестве входных данных, и извлекает аномальные точки с оценками.
Синтаксис
series_decompose_anomalies (
Серия [ пороговая ,
,
тенденция сезонности,
Test_points,
AD_method Seasonality_threshold ],
,
)
Дополнительные сведения о соглашениях синтаксиса.
Параметры
Имя (название) | Type | Обязательно | Описание |
---|---|---|---|
Серия | dynamic |
✔️ | Массив числовых значений, как правило, результирующий результат операторов make-series или make_list . |
Threshold | 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 : Тест забора Tukey с стандартным 25-м-75-м процентилем диапазона.Дополнительные сведения о остатках временных рядов см. в series_outliers. |
|
Seasonality_threshold | real |
Пороговое значение для оценки сезонности, если для параметра "Сезонность " задано значение autodetect. Порог оценки по умолчанию — 0,6. Дополнительные сведения см. в series_periods_detect. |
Возвраты
Функция возвращает следующую соответствующую серию:
ad_flag
: тернарный ряд, содержащий (+1, -1, 0) маркировку вверх/вниз/без аномалий соответственноad_score
: Оценка аномалийbaseline
: прогнозируемое значение ряда в соответствии с декомпозицией
Алгоритм
Эта функция выполняет следующие действия.
- Вызывает series_decompose() с соответствующими параметрами, чтобы создать базовый и остаточный ряд.
- Вычисляет ad_score ряд, применяя series_outliers() с выбранным методом обнаружения аномалий в ряде остаточных элементов.
- Вычисляет ряд 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
в параметре тренда. Вы можете увидеть, что базовый план гораздо ближе к входной серии. Обнаруживаются все вставленные выбросы, а также некоторые ложные срабатывания. См. следующий пример настройки порогового значения.
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