Прогнозирование временных рядов (Time Series Forecasting) — это процесс предсказания будущих значений на основе исторических данных, упорядоченных во времени. В Python есть множество библиотек и методов для выполнения прогнозирования временных рядов, начиная от простых статистических моделей и заканчивая сложными моделями машинного обучения.
Основные библиотеки Python для прогнозирования временных рядов:
Statsmodels: Предоставляет классические статистические модели, такие как ARIMA, Exponential Smoothing и другие. Хорошо подходит для понимания основных принципов прогнозирования временных рядов и для моделей, которые не требуют большого объема данных. Scikit-learn: Предоставляет инструменты для общего машинного обучения, которые можно адаптировать для прогнозирования временных рядов. В частности, можно использовать регрессионные модели, такие как Random Forest или Gradient Boosting, для прогнозирования временных рядов, преобразовав данные в формат, пригодный для supervised learning. Prophet (от Facebook): Разработана специально для прогнозирования бизнес-временных рядов. Хорошо справляется с сезонностью и праздниками. Автоматически обрабатывает многие общие проблемы временных рядов. PyTorch и TensorFlow: Фреймворки для глубокого обучения, которые можно использовать для создания более сложных моделей, таких как рекуррентные нейронные сети (RNNs) и LSTM. Подходят для больших объемов данных и сложных закономерностей. Tslearn: Библиотека, предоставляющая инструменты для машинного обучения временных рядов, такие как динамическое выравнивание времени (DTW) и различные методы кластеризации и классификации временных рядов. Sktime: Унифицированный toolbox для анализа и прогнозирования временных рядов. sktime имеет совместимый со scikit-learn интерфейс, предоставляя алгоритмы машинного обучения для решения задач классификации, регрессии, кластеризации и прогнозирования временных рядов.
Основные шаги в прогнозировании временных рядов:
Сбор и подготовка данных:
Соберите исторические данные временного ряда. Очистите данные от пропущенных значений, выбросов и других аномалий. Убедитесь, что данные имеют правильный формат (например, временная метка должна быть в формате даты/времени). Преобразуйте данные, если это необходимо (например, примените логарифмическое преобразование для стабилизации дисперсии).
Визуализация данных:
Визуализируйте временной ряд, чтобы понять его структуру, тренды, сезонность и цикличность. Используйте графики автокорреляции (ACF) и частичной автокорреляции (PACF) для определения порядка моделей ARIMA.
Разделение данных на обучающую и тестовую выборки:
Разделите данные на две части: обучающую выборку (для обучения модели) и тестовую выборку (для оценки ее производительности). Важно, чтобы тестовая выборка представляла собой “будущее”, т. е. содержала данные, следующие за обучающей выборкой.
Выбор модели:
Выберите модель, которая наилучшим образом соответствует вашим данным и задаче. Некоторые распространенные модели:
Наивная модель (Naive Forecast): Просто использует последнее наблюдаемое значение в качестве прогноза на будущее. Хорошо подходит в качестве базовой линии для сравнения с более сложными моделями. Скользящее среднее (Moving Average): Использует среднее значение последних N наблюдений в качестве прогноза. Сглаживает шум, но не учитывает тренды и сезонность. Экспоненциальное сглаживание (Exponential Smoothing): Присваивает веса прошлым наблюдениям, причем более новым наблюдениям присваиваются более высокие веса. Существуют различные варианты, такие как простое экспоненциальное сглаживание (SES), двойное экспоненциальное сглаживание (DES) и тройное экспоненциальное сглаживание (TES) (также известное как Holt-Winters). ARIMA (Autoregressive Integrated Moving Average): Статистическая модель, которая учитывает автокорреляцию, интегрирование и скользящее среднее. Требует определения параметров (p, d, q). SARIMA (Seasonal ARIMA): Расширение ARIMA для данных с сезонностью. Требует определения параметров (p, d, q) и (P, D, Q, s), где s — период сезонности. Prophet: Модель, разработанная Facebook специально для бизнес-временных рядов. Хорошо справляется с сезонностью, праздниками и пропущенными значениями. Регрессионные модели (Linear Regression, Random Forest, Gradient Boosting): Могут быть использованы для прогнозирования временных рядов, преобразовав данные в формат, пригодный для supervised learning (например, создав лагированные переменные). Рекуррентные нейронные сети (RNNs) и LSTM: Подходят для сложных временных рядов с долгосрочными зависимостями. Требуют большого объема данных и вычислительных ресурсов.
Обучение модели:
Обучите выбранную модель на обучающей выборке. Настройте параметры модели для достижения наилучшей производительности.
Оценка модели:
Оцените производительность обученной модели на тестовой выборке. Используйте метрики, такие как Mean Absolute Error (MAE), Mean Squared Error (MSE), Root Mean Squared Error (RMSE) и Mean Absolute Percentage Error (MAPE), для оценки точности прогнозов.
Прогнозирование:
Используйте обученную модель для прогнозирования будущих значений временного ряда. Оцените неопределенность прогнозов, если это возможно (например, с помощью доверительных интервалов).
Примеры Кода:
1. ARIMA С Statsmodels
Import pandas as pd
From statsmodels. tsa. arima. model import ARIMA
From sklearn. metrics import mean_squared_error
# Загрузка данных (замените ‘your_data. csv’ на свой файл)
Data = pd. read_csv(‘your_data. csv’, index_col=’Date’, parse_dates=True)
Data. index. freq = ‘D’ #Установите частоту (D — день, M — месяц, Y — год)
# Разделение на обучающую и тестовую выборки
Train_data = data[:-30]
Test_data = data[-30:]
# Обучение модели ARIMA (замените (5,1,0) на оптимальные параметры)
Model = ARIMA(train_data[‘Value’], order=(5,1,0))
Model_fit = model. fit()
# Прогнозирование на тестовой выборке
Predictions = model_fit. forecast(steps=len(test_data))
# Оценка Производительности
Rmse = mean_squared_error(test_data[‘Value’], predictions, squared=False)
Print(f"RMSE: {rmse}")
# Визуализация результатов
Import matplotlib. pyplot as plt
Plt. plot(test_data[‘Value’], label=’Actual’)
Plt. plot(predictions, label=’Predicted’)
Plt. legend()
Plt. show()
2. Prophet
Import pandas as pd
From prophet import Prophet
From sklearn. metrics import mean_squared_error
# Загрузка данных (должны быть столбцы ‘ds’ (datetime) и ‘y’ (значение))
Data = pd. read_csv(‘your_data. csv’, parse_dates=[‘ds’])
# Разделение на обучающую и тестовую выборки
Train_data = data[:-30]
Test_data = data[-30:]
# Инициализация и обучение модели Prophet
Model = Prophet()
Model. fit(train_data)
# Создание будущих дат для прогнозирования
Future = model. make_future_dataframe(periods=len(test_data))
# Прогнозирование
Forecast = model. predict(future)
# Оценка Производительности
Predictions = forecast[‘yhat’][-len(test_data):]
Rmse = mean_squared_error(test_data[‘y’], predictions, squared=False)
Print(f"RMSE: {rmse}")
# Визуализация результатов
Fig = model. plot(forecast)
Plt. show()
3. Регрессия с Scikit-learn (с лагированными переменными)
Import pandas as pd
From sklearn. linear_model import LinearRegression
From sklearn. model_selection import train_test_split
From sklearn. metrics import mean_squared_error
# Загрузка Данных
Data = pd. read_csv(‘your_data. csv’, index_col=’Date’, parse_dates=True)
# Создание лагированных переменных
Lags = 3 # Количество лагов
For i in range(1, lags + 1):
data[f’Lag_{i}’] = data[‘Value’].shift(i)
# Удаление строк с пропущенными значениями (из-за лагов)
Data = data. dropna()
# Разделение на признаки и целевую переменную
X = data[[f’Lag_{i}’ for i in range(1, lags + 1)]]
Y = data[‘Value’]
# Разделение на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)
# Обучение модели линейной регрессии
Model = LinearRegression()
Model. fit(X_train, y_train)
# Прогнозирование
Predictions = model. predict(X_test)
# Оценка Производительности
Rmse = mean_squared_error(y_test, predictions, squared=False)
Print(f"RMSE: {rmse}")
# Визуализация результатов
Import matplotlib. pyplot as plt
Plt. plot(y_test. values, label=’Actual’)
Plt. plot(predictions, label=’Predicted’)
Plt. legend()
Plt. show()
Ключевые моменты:
Стационарность: Многие модели временных рядов (особенно ARIMA) требуют, чтобы временной ряд был стационарным (то есть его статистические свойства, такие как среднее и дисперсия, не менялись со временем). Если временной ряд не стационарный, его необходимо стабилизировать с помощью преобразований, таких как дифференцирование. Выбор параметров: Выбор оптимальных параметров для моделей, таких как ARIMA, может быть сложным. Используйте графики ACF и PACF, а также автоматические методы, такие как auto_arima из библиотеки pmdarima, для определения оптимальных параметров. Оценка производительности: Тщательно оценивайте производительность вашей модели на тестовой выборке, чтобы убедиться, что она хорошо обобщается на новые данные. Используйте несколько метрик для оценки различных аспектов производительности модели. Доменные знания: Учитывайте доменные знания при выборе модели и интерпретации результатов. Знание о предметной области может помочь вам выбрать наиболее подходящую модель и правильно интерпретировать прогнозы.
Прогнозирование временных рядов — это итеративный процесс. Экспериментируйте с различными моделями, параметрами и методами подготовки данных, чтобы найти наилучшее решение для вашей конкретной задачи. Помните о важности визуализации данных, оценки производительности и использования доменных знаний.