Я работаю с большим количеством временных рядов. Эти временные ряды в основном представляют собой измерения сети, проводимые каждые 10 минут, и некоторые из них являются периодическими (т. Е. Пропускная способность), а некоторые другие - нет (т. Е. Объем трафика маршрутизации).
Я хотел бы, чтобы простой алгоритм для онлайн "обнаружения выбросов". По сути, я хочу сохранить в памяти (или на диске) полные исторические данные для каждого временного ряда, и я хочу обнаружить любой выброс в реальном сценарии (каждый раз, когда захватывается новый образец). Каков наилучший способ достижения этих результатов?
В настоящее время я использую скользящее среднее, чтобы убрать шум, но что дальше? Простые вещи, такие как стандартное отклонение, безумие, ... для всего набора данных не работают хорошо (я не могу предположить, что временные ряды являются стационарными), и я хотел бы что-то более "точное", в идеале черный ящик, такой как:
double outlier_detection (double * vector, double value);
где вектор - это массив значений типа double, содержащий исторические данные, а возвращаемое значение - это показатель аномалии для новой выборки «значение».
Ответы:
Вот простая функция R, которая найдет выбросы временных рядов (и при желании отобразит их на графике). Он будет обрабатывать сезонные и несезонные временные ряды. Основная идея состоит в том, чтобы найти надежные оценки трендовых и сезонных компонентов и вычесть их. Тогда найдите выбросы в остатках. Тест на остаточные выбросы такой же, как и для стандартного коробчатого графика - точки, превышающие 1,5 IQR выше или ниже верхнего и нижнего квартилей, предполагаются выбросами. Количество IQR выше / ниже этих пороговых значений возвращается как «балл» выброса. Таким образом, оценка может быть любым положительным числом, и будет равным нулю для не-выбросов.
Я понимаю, что вы не реализуете это в R, но я часто нахожу функцию R хорошим местом для начала. Тогда задача состоит в том, чтобы перевести это на любой требуемый язык.
источник
У хорошего решения будет несколько компонентов, в том числе:
Используйте устойчивое, подвижное окно, гладкое, чтобы удалить нестационарность.
Повторно выразите исходные данные так, чтобы остатки по отношению к сглаживанию были приблизительно симметрично распределены. Учитывая характер ваших данных, вполне вероятно, что их квадратные корни или логарифмы дадут симметричные остатки.
Примените методы контрольной диаграммы или, по крайней мере, мышление контрольной диаграммы к остаткам.
Что касается последнего, то анализ контрольной диаграммы показывает, что «обычные» пороги, такие как 2 SD или 1,5-кратное IQR за пределами квартилей, работают плохо, потому что они запускают слишком много ложных неконтролируемых сигналов. Люди обычно используют 3 SD в контрольной диаграмме, поэтому 2,5 (или даже 3) раза IQR вне квартилей будет хорошей отправной точкой.
Я более или менее обрисовал природу решения Роба Хиндмана, добавив к нему два основных момента: потенциальную необходимость повторного выражения данных и мудрость быть более консервативным в том, чтобы сигнализировать о выбросах. Я не уверен, что Лесс хорош для онлайн-детектора, потому что он плохо работает на конечных точках. Вместо этого вы могли бы использовать что-то столь же простое, как движущийся медианный фильтр (как в устойчивом сглаживании Тьюки). Если выбросы не входят в всплески, вы можете использовать узкое окно (возможно, 5 точек данных, которые будут разбиты только при всплеске из 3 или более выбросов в группе из 5).
После того как вы выполнили анализ, чтобы определить правильное повторное выражение данных, маловероятно, что вам нужно будет изменить повторное выражение. Поэтому вашему онлайн-детектору действительно нужно ссылаться только на самые последние значения (последнее окно), потому что он вообще не будет использовать более ранние данные. Если у вас действительно длинные временные ряды, вы можете пойти дальше, чтобы проанализировать автокорреляцию и сезонность (например, повторяющиеся ежедневные или еженедельные колебания), чтобы улучшить процедуру.
источник
(Этот ответ ответил на дублирующий (теперь закрытый) вопрос в разделе «Обнаружение выдающихся событий» , в котором некоторые данные представлены в графической форме.)
Обнаружение выбросов зависит от характера данных и того, что вы готовы предположить о них. Методы общего назначения опираются на надежную статистику. Суть этого подхода состоит в том, чтобы характеризовать большую часть данных таким образом, чтобы на них не влияли какие-либо выбросы, а затем указывать на любые отдельные значения, которые не вписываются в эту характеристику.
Поскольку это временной ряд, он добавляет усложнение необходимости (повторного) обнаружения выбросов на постоянной основе. Если это будет сделано по мере развертывания серии, то нам разрешено использовать только старые данные для обнаружения, а не будущие данные! Более того, в качестве защиты от множества повторных тестов мы хотели бы использовать метод с очень низким уровнем ложных срабатываний.
Эти соображения предполагают проведение простого и надежного теста выброса скользящего окна над данными . Существует много возможностей, но одна простая, легко понимаемая и легко реализуемая основывается на запущенном MAD: медиана абсолютного отклонения от медианы. Это очень надежная мера вариации в данных, сродни стандартному отклонению. Внешний пик будет на несколько MAD или больше, чем медиана.
Предстоит еще кое-что настроить : насколько сильно отклонение от объема данных следует считать отдаленным и как далеко назад следует смотреть во времени? Давайте оставим их в качестве параметров для экспериментов. Вотx=(1,2,…,n) n=1150 y
R
реализация, примененная к данным (с для эмуляции данных) с соответствующими значениями :п = 1150 гПрименительно к набору данных, подобному красной кривой, показанной в вопросе, он дает такой результат:
Данные показаны красным, 30-дневное окно средних пороговых значений + 5 * MAD серым цветом, а выбросы - просто значения данных над серой кривой - черным.
(Порог можно рассчитать только начиная с конца начального окна. Для всех данных в этом начальном окне используется первый порог: именно поэтому серая кривая является плоской между x = 0 и x = 30.)
Эффекты изменения параметров следующие : (а) увеличение значения
window
приведет к сглаживанию серой кривой и (б) увеличениеthreshold
приведет к повышению серой кривой. Зная это, можно взять начальный сегмент данных и быстро определить значения параметров, которые лучше всего отделяют отдаленные пики от остальной части данных. Примените эти значения параметров для проверки остальных данных. Если график показывает, что метод со временем ухудшается, это означает, что характер данных меняется, и параметры могут нуждаться в перенастройке.Обратите внимание, как мало этот метод предполагает для данных: они не должны быть нормально распределены; им не нужно показывать какую-либо периодичность; они даже не должны быть неотрицательными. Все это предполагает, что данные ведут себя схожим образом с течением времени и что внешние пики заметно выше, чем остальные данные.
Если кто-то захочет поэкспериментировать (или сравнить какое-либо другое решение с предложенным здесь), вот код, который я использовал для получения данных, подобных тем, которые показаны в вопросе.
источник
Если вас беспокоит допущения, связанные с каким-либо конкретным подходом, один из подходов состоит в том, чтобы обучить несколько учеников различным сигналам, а затем использовать методы ансамбля и агрегировать «голоса» ваших учеников, чтобы сделать классификацию выбросов.
Кстати, это может стоить прочтения или скимминга, поскольку в нем упоминается несколько подходов к проблеме.
источник
Я предполагаю, что сложная модель временных рядов не будет работать для вас из-за времени, которое требуется для обнаружения выбросов с использованием этой методологии. Поэтому вот обходной путь:
Сначала установите базовые «нормальные» схемы трафика за год на основе ручного анализа исторических данных, который учитывает время дня, будний день или выходные, месяц года и т. Д.
Используйте эту базовую линию вместе с некоторым простым механизмом (например, скользящей средней, предложенной Карлосом) для обнаружения выбросов.
Вы также можете просмотреть литературу по статистическому контролю процесса для некоторых идей.
источник
Сезонно скорректируйте данные так, чтобы обычный день выглядел ближе к плоскости. Вы можете взять сегодняшнюю выборку в 17:00 и вычесть или разделить среднее значение за предыдущие 30 дней в 17:00. Затем посмотрите прошлые N стандартных отклонений (измеренных с использованием предварительно откорректированных данных) на наличие выбросов. Это можно сделать отдельно для еженедельных и ежедневных «сезонов».
источник
Альтернативой подходу, изложенному Робом Хиндманом, было бы использование прогнозирования Холта-Винтерса . Полосы доверия, полученные по Холт-Уинтерсу, могут быть использованы для обнаружения выбросов. Вот документ, который описывает, как использовать Holt-Winters для «Обнаружения аберрантного поведения во временных рядах для мониторинга сети». Реализация RRDTool может быть найдена здесь .
источник
Спектральный анализ обнаруживает периодичность в стационарных временных рядах. Подход в частотной области, основанный на оценке спектральной плотности, - это подход, который я бы рекомендовал в качестве первого шага.
Если для определенных периодов нерегулярность означает намного более высокий пик, чем обычно для этого периода, то ряды с такими нерегулярностями не будут стационарными, и спектральный анализ не будет уместным. Но, предположив, что вы определили период с нарушениями, вы сможете приблизительно определить, какой будет нормальная высота пика, а затем можете установить порог на некотором уровне выше среднего для обозначения нерегулярных случаев.
источник
Поскольку это данные временных рядов, простой экспоненциальный фильтр http://en.wikipedia.org/wiki/Exponential_smoothing сгладит данные. Это очень хороший фильтр, так как вам не нужно накапливать старые точки данных. Сравните каждое вновь сглаженное значение данных с его несглаженным значением. Как только отклонение превысит определенный заранее заданный порог (в зависимости от того, что, по вашему мнению, является выбросом в ваших данных), ваш выброс может быть легко обнаружен.
В CI будет делать следующее для 16-битной выборки в реальном времени (я думаю, что это можно найти где-то здесь <Объяснение - https://dsp.stackexchange.com/questions/378/what-is-the-best-first-order -iir-приближение к фильтру скользящего среднего >)
источник
Вы можете использовать стандартное отклонение последних N измерений (вы должны выбрать подходящее N). Хорошим показателем аномалии будет количество стандартных отклонений измерения от скользящей средней.
источник
то, что я делаю, это группирую измерения по часам и дням недели и сравниваю стандартные отклонения от них. Тем не менее, не подходит для таких вещей, как каникулы и летняя / зимняя сезонность, но это правильно в большинстве случаев.
Недостатком является то, что вам действительно нужно собрать год или около того данных, чтобы их было достаточно, чтобы stddev начал обретать смысл.
источник
Я предлагаю схему ниже, которая должна быть реализована через день или около того:
Тренировка
Расчет "постороннего":
Для единичного образца, из которого вы хотите узнать его «внешность»:
Это будет ваш показатель выбросов: 100% - это экстремальный выброс.
PS. При расчете расстояния Махаланобиса используйте матрицу корреляции, а не ковариационную матрицу. Это более надежно, если выборочные измерения различаются по единице и количеству.
источник
В случае, когда нужно быстро вычислить выбросы, можно использовать идею Роба Хиндмана и Махито Сугиямы ( https://github.com/BorgwardtLab/sampling-outlier-detection , library (spoutlier), функция qsp) для вычисления выбросы следующим образом:
источник
обнаружение аномалий требует построения уравнения, которое описывает ожидание. Обнаружение вмешательства доступно как в не причинно-следственной, так и в причинно-следственной связи. Если у вас есть ряд предикторов, таких как цена, то все может стать немного сложнее. Другие ответы здесь, по-видимому, не учитывают присваиваемую причину, связанную с указанными пользователем рядами предикторов, такими как цена, и поэтому могут быть ошибочными. Проданное количество может хорошо зависеть от цены, возможно, предыдущих цен и, возможно, количества, проданного в прошлом. Основа для обнаружения аномалий (импульсы, сезонные импульсы, сдвиги уровней и местные временные тренды) находится в https://pdfs.semanticscholar.org/09c4/ba8dd3cc88289caf18d71e8985bdd11ad21c.pdf
источник