Ответ
При работе с временными рядами выбор метода обнаружения аномалий зависит от природы данных (тренд, сезонность, шум). Вот основные подходы, которые я использовал:
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: Обширная библиотека для обнаружения аномалий, включающая десятки алгоритмов.
Ключевой нюанс: Для рядов с трендом или сезонностью необходимо сначала их устранить (детрендирование, десезонализация), иначе простые статистические методы будут давать ложные срабатывания.