фон приложения
При тестировании данных они обычно проверяются несколько раз, а затем среднее значение принимается за окончательное эталонное значение.
Например, временные данные каждого запуска тестовой программы получаются следующими группами:
67.9109, 135.1102, 134.9953, 85.9153, 73.8646, 69.5817, 123.0897, 93.6666, 113.9593, 86.8969
111.9058, 126.425, 87.7191, 95.9987, 125.3884, 117.6314, 111.8465, 96.1856, 62.4525, 102.2092
107.4349, 91.2075, 105.0072, 98.953, 97.4755, 121.862, 42.1561, 97.66, 100.4861, 96.5518
Однако некоторые из этих значений могут быть слишком большими из-за некоторых дополнительных влияющих факторов, которые, если их включить в среднее значение, увеличат среднее значение. Мы хотим выявить и отсеять такие явно аномальные данные.
Практический пример:
Например, следующие периодические интервальные данные:
pero: 3176
pero: 3018
pero: 3039
pero: 2785
pero: 2133
pero: 2394
pero: 2178
pero: 2809
pero: 3357
pero: 3466
pero: 716781
pero: 975873
pero: 2681
pero: 2880
pero: 2160
pero: 3890
pero: 3177
pero: 3792
Интуитивно исходя из данных, период времени обычно составляет около 3 секунд с ошибкой менее 30%, но иногда период очень длинный, достигая ошибки более чем в 300 раз.Если рассчитывается среднее значение, эта ненормальная ошибка окажет серьезное влияние. Можно оптимизировать, чтобы взять медиану. Однако взятие медианы подходит только для случаев, когда период относительно фиксирован (здесь флуктуация меньше 30%), а период изменения очень велик (например, разница между десятками и сотнями раз) неподходящий.
Цели и идеи обнаружения аномалий
Во-первых, что такое выброс и каково наше определение выброса?
Например, в третьем наборе массивов выше, является ли 42.1561 исключением?
Определение аномалии — это фактически данные, которые сильно отличаются от большинства.
"Большинство" выражается в процентах, которые вы можете определить самостоятельно. Например, если я определяю более 80%, это представляет собой 10 вышеуказанных данных. Если определенные данные находятся в том же диапазоне, что и другие данные более 80%, это считается нормальным. Если он не входит в диапазон, это исключение.
Но как определяется этот диапазон (разница)? Его можно определить по-разному, например, как среднее, квартиль или стандартное отклонение.
Проще всего использовать среднее значение, например, установив:
Отклонения (в 1,2 раза выше среднего) учитывались как аномалии.
Однако этот метод усреднения является «простым и грубым» и может быть неточным. Поскольку некоторые выбросы серьезно увеличивают или уменьшают среднее значение, среднее значение больше не может представлять большинство. Те, кто разбирается в математике, будут думать, использовать дисперсию для выражения.
Обозначение дисперсии, например:
-
68% находятся в пределах 1 стандартного отклонения от среднего
-
95% находятся в пределах 2 стандартных отклонений от среднего
-
99,7% находятся в пределах 3 стандартных отклонений от среднего
Следовательно, в этом примере можно считать, что данные, выходящие за пределы диапазона 2 стандартных отклонений, являются аномальными данными.
Однако у этого метода есть и большая проблема. В качестве примера возьмем следующие наборы данных:
O67.91, 135.11, 134.99, 85.91, 73.86, 69.58, 123.09, 93.67, 113.96, 86.90,
标准差/平均值=0.253, 标准差:24.922, 平均值:98.499
111.90, 126.42, O87.71, 95.99, 125.38, 117.63, 111.84, 96.18, O62.45, 102.20,
标准差/平均值=0.177, 标准差:18.410, 平均值:103.776
107.43, 91.20, 85.00, 98.95, 97.47, 111.86, 82.15, 97.66, 100.48, 86.55,
标准差/平均值=0.096, 标准差:9.169, 平均值:95.879
107.43, 91.20, 105.00, 98.95, 97.47, 121.86, O42.15, 97.66, 100.48, 96.55
标准差/平均值=0.204, 标准差:19.588, 平均值:95.879
Глядя на последний набор данных, минимальное значение составляет 42,15, а максимальное значение — 121,86, разница почти в 3 раза.
Объяснение: бессмысленно смотреть на абсолютное значение стандартного отклонения, потому что значения дисперсии также отличаются из-за разных диапазонов размеров данных. Однако мы можем посмотреть на коэффициент дисперсии (стандартное отклонение/среднее), это значение не увеличивается по мере увеличения данных, оно изменяется только в зависимости от того, насколько данные колеблются.
Определение: доля дисперсии P = стандартное отклонение/среднее значение
Дисперсия (стандартное отклонение) отражает диапазон колебаний данных.Для данных нормально колебаться, и дисперсия велика или мала, что не означает, что данные должны иметь выбросы.
Но я пытаюсь исследовать и доказать две проблемы:
-
Можно ли сказать, что отношение дисперсии (стандартное отклонение/среднее значение) выше, что означает, что данные являются аномальными или нерегулярными?
-
Можно ли сказать, что отношение дисперсии (стандартное отклонение/среднее) меньше на сколько, это означает, что флуктуация данных невелика, а выбросы можно игнорировать?
Второй вопрос, который я доказал экспериментально: если стандартное отклонение / среднее значение
Если SD/Mean
Как крайний пример:
Например, {10, 10, 10, ..., 10, 20}, (сто 10 смешаны с одним 20), коэффициент дисперсии = 0,099, среднее значение: 10,10, хотя в это время есть 1 аномальные данные, но среднее Влияние значения составляет всего одну тысячную и им можно пренебречь.
Первая проблема, коэффициент дисперсии большой, есть два случая:
Во-первых, существует небольшое количество аномальных данных, и чем больше значение коэффициента дисперсии, тем больше влияние аномальных данных на результаты;
Например, {10, 10, 10, ..., 10, 60}, сто 10 смешаны с одним 60, P = 0,474.
{10, 10, 10, ..., 10, 2100}, сто 10 смешано с 2100, P=6,73.
Второй случай заключается в том, что аномальных данных нет, но сами данные сильно колеблются.
Например {2, 4, 6, 7, 8, 9, 12, 36, 10, 11} P = 0,856
{ 2, 14, 6, 77, 18, 99, 12, 36, 20, 990 } P=2.27
Однако это можно объяснить: если коэффициент дисперсии велик, может ли это указывать на то, что данные аномальны или нерегулярны?
Чтобы судить по большой дисперсии, необходимо различать две упомянутые выше ситуации: если есть аномальные данные, найти аномальные данные, если данные не аномальные, но данные сильно колеблются, то какая часть флуктуации нерегулярный?
Возьмем P=стандартное отклонение/среднее значение > 0,1, чтобы посмотреть, сможем ли мы найти выбросы. Сначала посмотрите на набор данных:
137.24, 123.0, 75.06, 86.57, 135.74, 105.12, 120.31, 102.77, 135.24, 124.57,
标准差/平均值=0.178, 标准差:20.413, 平均值:114.562
超过(50.0%)的数据落在 1 个标准差以内(94~135)
超过(100.0%)的数据落在 2 个标准差以内(74~155)
(超过80%后则停止计算)
В этих данных только 50% данных попадают в стандартное отклонение 1. Честно говоря, флуктуация немного велика, но стандартное отклонение также велико, в результате чего 100% данных попадают в стандартное отклонение 2. В данном случае мы не нашли аномальных данных, но 75,06 очень близко к аномальным данным.
Улучшите алгоритм, при оценке процента нормальных данных стандартное отклонение учитывает только 1В случае 2 раз больше 2 раз указывает на большие колебания, а кратность от 12 раза увеличить размер шага на 0,1, чтобы сбалансировать, избежать скачка с 50% до 100%, а результаты пересчета после улучшения следующие:
标准差/平均值=0.178, 标准差:20.413, 平均值:114.562
超过(50.0%)的数据落在 1.0 个标准差以内
超过(70.0%)的数据落在 1.1 个标准差以内
超过(80.0%)的数据落在 1.2 个标准差以内
超过(80.0%)的数据落在 1.3 个标准差以内
超过(90.0%)的数据落在 1.4 个标准差以内
异常数据:75.06
(超过80%后则停止计算)
После улучшения более 80% данных оказались в пределах 1,4 стандартных отклонений, а также были обнаружены аномальные данные. Это показывает, что этот алгоритм неплох.
Вот два других набора данных:
第一组:2, 14, 6, 77, 18, 99, 12, 36, 20, 90
标准差/平均值=0.936, 标准差:34.989, 平均值:37.400
超过(60.0%)的数据落在 1.0 个标准差以内
超过(70.0%)的数据落在 1.1 个标准差以内
超过(80.0%)的数据落在 1.2 个标准差以内
超过(80.0%)的数据落在 1.3 个标准差以内
超过(80.0%)的数据落在 1.4 个标准差以内
超过(80.0%)的数据落在 1.5 个标准差以内
超过(90.0%)的数据落在 1.6 个标准差以内
异常数据:99.0
第二组:
{ 10, 10, 10, ……, 10, 114 } (共100个)
标准差/平均值=0.937, 标准差:10.348, 平均值:11.040
超过(99.0%)的数据落在 1.0 个标准差以内
异常数据:114.0
Первый набор данных имеет большие флуктуации, видимые невооруженным глазом.Согласно приведенному выше алгоритму, найдено только одно аномальное значение. Но на самом деле это не имеет смысла, потому что волатильность настолько велика, что трудно сказать, кто является исключением.
Второй набор данных имеет небольшие колебания, видимые невооруженным глазом, но (стандартное отклонение/среднее значение) почти такое же, как и у первого набора данных, равное 0,936.
Самая большая проблема с этим алгоритмом заключается в том, что нет способа различить два типа данных выше. Попробуем продолжить совершенствовать алгоритм.
Основная идея:
Удалите аномальные данные и пересчитайте. Однако это не может быть исключено бесконечно.Удаляется не более 20% данных.После каждого исключения данных значение коэффициента дисперсии должно сильно падать до 0,2, данные сильно колеблются, и на стороне приложения не рекомендуется принимать их.
Краткое описание алгоритма обнаружения аномалий стандартной дисперсии
После моей оптимизации и улучшения алгоритма эффект очень хороший. В принципе, учитывая произвольный набор данных, можно сделать точные выводы.
Выводы включают следующее:
1. Общие колебания данных очень серьезны, и нет никаких оснований для аномального обнаружения. При этом алгоритм укажет, какие данные являются серьезной аномалией среди серьезных.
2. Общие данные сильно колеблются, а результаты обнаружения аномалий приведены только для справки. В то же время алгоритм укажет, какие данные серьезно ненормальны.
3. Общее колебание данных небольшое, а небольшое количество данных является ненормальным Алгоритм указывает, какие данные являются специфическими.
При этом данный алгоритм имеет несколько параметров, которые можно настраивать:
Параметр 1: Стандарт процента аномальных данных в общем объеме данных (например, 80 % данных подходят, а остальные 20 % являются аномальными данными)
Параметр 2: когда данные сильно колеблются, общее количество аномальных данных, которое разрешено удалить, как доля от общего объема данных (например, 20% означает, что можно удалить не более 20% аномальных данных. Если эти аномальные данные удаляются, данные становятся нормальными Если флуктуация меньше, это означает, что исключение правильное Напротив, это означает, что после устранения аномальных данных флуктуация данных все еще не улучшается, а данные не имеют основания для аномального обнаружения)
Параметр 3: после того, как максимально допустимые аномальные данные были устранены, полученное значение отношения дисперсии P, когда P больше, чем на сколько, считается, что набор данных очень изменчив и не имеет основания для обнаружения аномалий (по умолчанию параметр равен 0,2, который устанавливается в соответствии с опытом, если бизнес-сторона действительно хочет обнаружить некоторые наборы данных с очень большими колебаниями данных, вы можете увеличить это значение).
Некоторые результаты, обнаруженные с помощью этого алгоритма, приведены ниже:
(10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
10, 10, 10, 114)
剔除异常数据: 114
标准差/平均值=0.000, 标准差:0.000, 平均值:10.000
数据正常
(2, 14, 6, 77, 18, 99, 12, 36, 20, 90)
剔除异常数据: 99,90,77
标准差/平均值=0.973, 标准差:22.502, 平均值:23.125
异常数据共3个, 占比多于0.8
P=0.973(标准差/平均值) > 0.2,重度异常!
(60.4638, 132.486, 95.5226, 135.8269, 109.8373, 95.1654, 139.3757,
104.2131, 112.349, 123.3675)
剔除异常数据: 60.4638,139.3757,135.8269
标准差/平均值=0.129, 标准差:14.648, 平均值:113.596
异常数据共3个, 占比多于0.8
P=0.129(标准差/平均值) < 0.2,轻度异常!
(91.54, 97.91, 101.8, 89.5, 110.34, 90.91, 87.01, 105.05, 87.67, 113.84,
112.92, 86.07, 98.52, 107.37, 110.58, 105.75, 81.46, 84.47, 110.41, 109.73, 104.07, 107.25, 98.59, 99.8,
85.76, 105.08, 117.04, 102.4, 112.12, 89.65, 88.15, 92.66, 109.96, 105.23, 83.54, 80.43, 93.44, 80.3,
103.29, 116.02, 110.57, 103.73, 113.14, 112.29, 114.23, 104.02, 87.52, 119.57, 109.34, 101.02, 87.36,
103.93, 109.32, 80.23, 94.12, 113.87, 113.13, 103.64, 103.85, 90.66, 84.35, 86.45, 116.43, 93.18,
116.23, 96.55, 113.98, 93.8, 106.16, 110.82, 109.84, 110.99, 97.76, 89.8, 111.65, 112.9, 109.1, 105.65,
93.59, 86.16, 100.73, 95.3, 93.46, 97.05, 102.36, 90.01, 94.93, 84.51, 85.91, 90.4, 103.35, 97.15,
119.26, 81.38, 98.16, 90.73, 140.14, 100.51, 101.52, 100.06)
剔除异常数据: 81.46 84.47 117.04 83.54 80.43 80.3 116.02 119.57 80.23 84.35 116.43 116.23 84.51 119.26 81.38 140.14
标准差/平均值=0.087, 标准差:8.781, 平均值:100.716
数据正常
Настройка алгоритма: Параметр 1 = 80%, Параметр 2 = 20%, Параметр 3 = 0,2
Резюме: Эффект от этого алгоритма очень и очень хороший, единственный недостаток в том, что алгоритм сложный и каждый раз требует дисперсии, что не подходит для сценариев с большими данными.
(Вы можете найти меня, если вам нужен исходный код Java алгоритма)
Алгоритм обнаружения квартильных аномалий (блочная диаграмма)
Для сравнения возьмем приведенные выше данные в качестве примера, например, эти две группы:
(2, 14, 6, 77, 18, 99, 12, 36, 20, 90)
异常数据: 99,90,77
标准差/平均值=0.973, 标准差:22.502, 平均值:23.125
异常数据共3个, 占比多于0.8
P=0.973(标准差/平均值) > 0.2,重度异常!
(60.46, 95.16, 95.52, 104.21, 109.83,
112.35, 123.36, 132.48, 135.82, 139.37)
剔除异常数据: 60.46,139.37,135.82
标准差/平均值=0.129, 标准差:14.648, 平均值:113.596
异常数据共3个, 占比多于0.8
P=0.129(标准差/平均值) < 0.2,轻度异常!
Идея определения аномалий в квартилях такова:
Сначала отсортируйте данные от мала до велика, а потом разрежьте на 4 конца:
-
QL: называется нижним квартилем, что означает, что четверть всех наблюдений имеет значение данных меньше него;
-
QU: Это называется верхним квартилем, что означает, что четверть всех наблюдений имеет значение данных, превышающее его;
-
IQR: называется межквартильным размахом и представляет собой разницу между QU верхнего квартиля и QL нижнего квартиля, которая содержит половину всех наблюдений.
Выбросы обычно определяются как значения меньше QL-1,5IQR или больше QU+1,5IQR. (IQR=QU-QL)
Таким образом, этот алгоритм очень прост, он заключается в том, чтобы определить значение данных верхнего и нижнего квартилей, а затем вычислить диапазон нормальных значений.Если диапазон превышен, это ненормально.
В соответствии с данными первой группы тяжелой аномалии, приведенной выше, значения нижнего, среднего и верхнего трех квантилей получают с использованием метода квартильных прямоугольников:
Q1=10.5
Q2=19
Q3=80.25
Нормальный диапазон значений: (-94,125, 184,857)
Итак, вывод - все данные в норме.
Точно так же для второго набора данных его можно рассчитать как:
Q1=95.43
Q3=133.315
Нормальный диапазон значений: (38,6025, 190,14)
Вывод также, что все данные в норме.
Видно, что метод квартилей (блочная диаграмма) слишком ненадежен. Поскольку имеется только 4 квантили, он может обнаруживать аномалии только в данных, которые очень мало колеблются.