Какие методы обнаружения аномалий во временных рядах вы знаете?

Ответ

При работе с временными рядами выбор метода обнаружения аномалий зависит от природы данных (тренд, сезонность, шум). Вот основные подходы, которые я использовал:

1. Статистические методы (пороговые)

  • Z-score (стандартизованная оценка): Помечает точки, отклоняющиеся более чем на N стандартных отклонений от среднего. Эффективен для стационарных рядов.
    from scipy import stats
    z_scores = np.abs(stats.zscore(series))
    anomalies = z_scores > 3
  • Межквартильный размах (IQR): Устойчив к выбросам. Аномалии — точки за пределами [Q1 - 1.5IQR, Q3 + 1.5IQR].

2. Методы на основе скользящего окна Сравнение текущего значения со статистиками (среднее, медиана) в окне и порогом, основанным на стандартном отклонении.

window_size = 24  # например, сутки для почасовых данных
rolling_mean = series.rolling(window=window_size).mean()
rolling_std = series.rolling(window=window_size).std()
threshold = rolling_mean + 3 * rolling_std
anomalies = series > threshold

3. Методы машинного обучения

  • Isolation Forest: Изолирует аномалии за счет случайного разделения данных, требуя меньше разделений.
    from sklearn.ensemble import IsolationForest
    model = IsolationForest(contamination=0.01, random_state=42)
    preds = model.fit_predict(series.values.reshape(-1, 1))
    anomalies = preds == -1
  • One-Class SVM: Строит границу, охватывающую "нормальные" данные.

4. Прогнозные модели (глубокое обучение)

  • LSTM/GRU сети: Обучаем модель предсказывать следующее значение. Высокая ошибка предсказания (MSE) указывает на аномалию.
  • Автоэнкодеры: Обучаем сеть восстанавливать исходный ряд. Высокая ошибка реконструкции сигнализирует об аномалии.

5. Специализированные библиотеки

  • Facebook Prophet: Модель прогнозирования со встроенным обнаружением выбросов.
  • PyOD: Обширная библиотека для обнаружения аномалий, включающая десятки алгоритмов.

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

Ответ 18+ 🔞

Ну ты представляешь, сидишь такой с временными рядами, а там такие выбросы, что глаза на лоб лезут. Вот реально, какого хуя с ними делать? А оказывается, методов — овердохуища, но каждый под свою ситуацию.

1. Статистика, классика жанра

  • Z-score (это типа стандартизованная оценка): Берёшь, от среднего отнимаешь, на стандартное отклонение делишь. Если модуль этого дела больше трёх — поздравляю, ты нашёл аномалию. Работает, если ряд стабильный, без скачков.
    from scipy import stats
    z_scores = np.abs(stats.zscore(series))
    anomalies = z_scores > 3
  • Межквартильный размах (IQR): Для тех, кто не доверяет среднему, потому что один урод всё портит. Берёшь коробочку между квартилями, растягиваешь её в полтора раза, и всё, что за пределами — на выход. Устойчиво, как танк.

2. Скользящее окно — когда контекст важен Тут идея простая: сравниваешь текущую точку не со всей историей, а с тем, что было рядом. Считаешь среднее и разброс в окне (например, за последние сутки), и если текущее значение вылетает за порог (типа среднее + три сигмы) — всё, пиши пропало, аномалия.

window_size = 24  # например, сутки для почасовых данных
rolling_mean = series.rolling(window=window_size).mean()
rolling_std = series.rolling(window=window_size).std()
threshold = rolling_mean + 3 * rolling_std
anomalies = series > threshold

3. Машинное обучение — для сложных случаев

  • Isolation Forest (Лес изоляции): Гениальная, ёпта, штука. Алгоритм пытается изолировать каждую точку в дереве решений. Нормальные точки образуют толпу, их изолировать сложно. А вот выбросы — они как одиночки, их быстро отделяют. Чем меньше разделений потребовалось — тем более точка аномальная.
    from sklearn.ensemble import IsolationForest
    model = IsolationForest(contamination=0.01, random_state=42)
    preds = model.fit_predict(series.values.reshape(-1, 1))
    anomalies = preds == -1
  • One-Class SVM: Строит такую хитрожопую границу вокруг нормальных данных, как воздушный шар. Всё, что снаружи — подозрительное.

4. Глубокое обучение — когда хочется пафоса и точности

  • LSTM/GRU сети: Обучаешь нейронку предсказывать следующее значение на основе предыдущих. Если она ошиблась так, что аж глаза на лоб полезли (огромная MSE) — скорее всего, в данных что-то пошло не так.
  • Автоэнкодеры: Заставляешь сеть сжимать ряд, а потом восстанавливать. Если на восстановлении она лажает конкретно — значит, исходные данные были странными, не такими, как все.

5. Готовые библиотеки — для ленивых и умных

  • Facebook Prophet: Модель для прогнозов, которая заодно может и выбросы посмотреть. Удобно, если у теря сезонность и тренды.
  • PyOD: Это просто сборная солянка, ебать копать. Там десятки алгоритмов на любой вкус и цвет, от классики до новейших штук.

А теперь главный нюанс, без которого нихуя не получится: Если в твоём ряду есть тренд (значения ползут вверх) или сезонность (каждое лето пик, каждую зиму спад), то применять простую статистику — это самоубийство. Она будет кричать "аномалия!" на каждом нормальном сезонном пике. Поэтому сначала надо этот тренд и сезонность убрать (детрендировать и десезонировать), а уже потом искать уродов. Иначе волнение ебать, а толку — ноль.