Ответ
При работе с временными рядами выбор метода обнаружения аномалий зависит от природы данных (тренд, сезонность, шум). Вот основные подходы, которые я использовал:
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: Это просто сборная солянка, ебать копать. Там десятки алгоритмов на любой вкус и цвет, от классики до новейших штук.
А теперь главный нюанс, без которого нихуя не получится: Если в твоём ряду есть тренд (значения ползут вверх) или сезонность (каждое лето пик, каждую зиму спад), то применять простую статистику — это самоубийство. Она будет кричать "аномалия!" на каждом нормальном сезонном пике. Поэтому сначала надо этот тренд и сезонность убрать (детрендировать и десезонировать), а уже потом искать уродов. Иначе волнение ебать, а толку — ноль.