Ответ
В своих проектах я применял следующий стек методов для прогнозирования временных рядов:
1. Классические статистические модели (Statsmodels):
- ARIMA/SARIMA: Для учета авторегрессии, скользящего среднего, нестационарности (через дифференцирование) и сезонности. Использовал
auto_arimaдля автоматического подбора параметров(p,d,q). - ETS (Error, Trend, Seasonal): Экспоненциальное сглаживание, хорошо работающее на рядах с выраженным трендом и сезонностью.
2. Машинное обучение на сконструированных признаках (Feature Engineering):
- Создавал лаги (
lag_1,lag_7,lag_30), скользящие статистики (среднее, стандартное отклонение за окно), календарные признаки (день недели, месяц, праздник). - Обучал на этих признаках модели XGBoost или LightGBM, которые часто превосходят классические методы на сложных рядах.
3. Глубокое обучение (PyTorch/TensorFlow):
- LSTM/GRU: Рекуррентные сети для учета долгосрочных зависимостей. Использовал архитектуры с несколькими слоями и dropout для регуляризации.
- Transformer-based модели (например, TFT - Temporal Fusion Transformer): Для учета как временных зависимостей, так и статических/известных будущих признаков (например, календарь).
Пример подготовки данных для ML-подхода:
import pandas as pd
# Допустим, df имеет колонку 'value' и индекс datetime
df['lag_1'] = df['value'].shift(1)
df['rolling_mean_7'] = df['value'].shift(1).rolling(7).mean()
df['day_of_week'] = df.index.dayofweek
df = df.dropna() # Удаляем строки с NaN после создания лагов
# Теперь X = [lag_1, rolling_mean_7, day_of_week], y = value
# Данные готовы для обучения XGBoostRegressor
Выбор метода зависит от объема данных, наличия сезонности, тренда и требуемой точности прогноза.