Добавить в корзинуПозвонить
Найти в Дзене

Прогнозирование временных рядов python

Прогнозирование временных рядов (Time Series Forecasting) — это процесс предсказания будущих значений на основе исторических данных, упорядоченных во времени. В Python есть множество библиотек и методов для выполнения прогнозирования временных рядов, начиная от простых статистических моделей и заканчивая сложными моделями машинного обучения. Основные библиотеки Python для прогнозирования временных рядов: Statsmodels: Предоставляет классические статистические модели, такие как ARIMA, Exponential Smoothing и другие. Хорошо подходит для понимания основных принципов прогнозирования временных рядов и для моделей, которые не требуют большого объема данных. Scikit-learn: Предоставляет инструменты для общего машинного обучения, которые можно адаптировать для прогнозирования временных рядов. В частности, можно использовать регрессионные модели, такие как Random Forest или Gradient Boosting, для прогнозирования временных рядов, преобразовав данные в формат, пригодный для supervised learning. Pro

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

Прогнозирование временных рядов — это итеративный процесс. Экспериментируйте с различными моделями, параметрами и методами подготовки данных, чтобы найти наилучшее решение для вашей конкретной задачи. Помните о важности визуализации данных, оценки производительности и использования доменных знаний.