Прогнозирование временных рядов — ценный метод анализа и прогнозирования данных, которые меняются во времени. Одним из популярных методов прогнозирования временных рядов является ARIMA (авторегрессионное интегрированное скользящее среднее). В этой статье мы углубимся в концепции, лежащие в основе ARIMA, и рассмотрим, как ее можно использовать для построения точных моделей для анализа временных рядов.
Стационарность и дифференцирование
Прежде чем мы углубимся в ARIMA, важно понять концепции стационарности и разности. Стационарность относится к данным, которые демонстрируют последовательное статистическое распределение во времени. Другими словами, свойства данных не меняются с течением времени. Однако многие наборы данных реального мира нестационарны, то есть они демонстрируют тенденции или сезонность. Для анализа нестационарных данных нам необходимо преобразовать их в стационарную форму.
Дифференциация — это метод, используемый для превращения нестационарных данных в стационарные. Он включает в себя определение разницы между последовательными наблюдениями для устранения тенденции или сезонности. Применяя разность, мы стабилизируем среднее значение временного ряда и устраняем изменения уровня данных. Этот процесс необходим для работы с моделями ARIMA.
Понимание АРИМА
ARIMA сочетает концепции авторегрессионной (AR), интегрированной (I) и скользящей средней (MA) моделей для анализа и прогнозирования данных временных рядов.
Авторегрессия (AR). Модели авторегрессии оглядываются назад во времени и анализируют предыдущие значения в наборе данных. Модель делает предположения об этих запаздывающих значениях для прогнозирования будущего. Например, если у нас есть данные о ежемесячных продажах карандашей, авторегрессионная модель будет рассматривать общие объемы продаж за предыдущие месяцы в качестве предикторов продаж в текущем месяце. Интересующая «развивающаяся переменная» подвергается регрессии по своим собственным запаздывающим значениям.
Интегрированный (I). Интегрированный аспект ARIMA относится к шагам дифференцирования, применяемым к данным, чтобы сделать их стационарными. Интегрируя или различая данные, мы устраняем тенденции и сезонность, тем самым стабилизируя среднее значение временного ряда.
Скользящее среднее (MA):компонент скользящего среднего ARIMA анализирует прошлые и текущие значения запаздывающих переменных для определения выходной переменной. Он рассматривает средневзвешенное значение остатков предыдущих прогнозов, чтобы сделать текущий прогноз.
Комбинируя эти три компонента, модели ARIMA могут фиксировать основные закономерности и зависимости в данных временных рядов, что позволяет нам делать точные прогнозы.
Построение модели ARIMA
Теперь, когда у нас есть понимание ARIMA, давайте рассмотрим, как построить модель ARIMA, используя библиотеку statsmodels
в Python. В следующем упражнении мы будем работать с набором данных, представляющим колебания электрической нагрузки во времени. Вот необходимые шаги:
- Импортируйте необходимые библиотеки для обработки данных и визуализации:
import os import warnings import matplotlib.pyplot as plt import numpy as np import pandas as pd import datetime as dt import math from pandas.plotting import autocorrelation_plot from statsmodels.tsa.statespace.sarimax import SARIMAX from sklearn.preprocessing import MinMaxScaler %matplotlib inline pd.options.display.float_format = '{:,.2f}'.format np.set_printoptions(precision=2) warnings.filterwarnings("ignore")
Загрузите набор данных в фрейм данных Pandas и визуализируйте данные:
energy = pd.read_csv('energy.csv') energy['timestamp'] = pd.to_datetime(energy['timestamp']) energy.set_index('timestamp', inplace=True) plt.figure(figsize=(15, 8)) plt.plot(energy.index, energy['load']) plt.xlabel('Timestamp') plt.ylabel('Load') plt.title('Electrical Load over Time') plt.show()
Разделите данные на наборы для обучения и тестирования:
train_start_dt = '2014-09-01' test_start_dt = '2014-11-01' train = energy.loc[train_start_dt:test_start_dt].copy() test = energy.loc[test_start_dt:].copy()
Масштабируйте данные, чтобы они попадали в определенный диапазон:
scaler = MinMaxScaler() train['load_scaled'] = scaler.fit_transform(train[['load']]) test['load_scaled'] = scaler.transform(test[['load']])
Реализуйте модель ARIMA, используя библиотеку statsmodels
:
model = SARIMAX(train['load_scaled'], order=(1, 1, 1)) model_fit = model.fit(disp=False)
Сопоставьте модель с обучающими данными и сделайте прогнозы
train['predictions'] = model_fit.predict(start=train_start_dt, end=test_start_dt) test['predictions'] = model_fit.predict(start=test_start_dt, end=test.index[-1])
Оцените точность модели, используя тестовые данные:
from sklearn.metrics import mean_absolute_error, mean_squared_error mae = mean_absolute_error(test['load_scaled'], test['predictions']) mse = mean_squared_error(test['load_scaled'], test['predictions']) rmse = np.sqrt(mse) print(f"Mean Absolute Error: {mae:.4f}") print(f"Mean Squared Error: {mse:.4f}") print(f"Root Mean Squared Error: {rmse:.4f}")
Визуализируйте результаты модели ARIMA
plt.figure(figsize=(15, 8)) plt.plot(train.index, train['load'], label='Training Data') plt.plot(test.index, test['load'], label='Actual Data') plt.plot(test.index, scaler.inverse_transform(test['predictions']), label='Predictions') plt.xlabel('Timestamp') plt.ylabel('Load') plt.title('ARIMA Model - Electrical Load Forecast') plt.legend() plt.show()
На приведенном выше графике отображаются обучающие данные, фактические данные и прогнозируемые значения из модели ARIMA. Он обеспечивает визуальное сравнение для оценки производительности модели.
Модели ARIMA могут быть дополнительно оптимизированы путем настройки параметров модели (p, d, q) с использованием таких методов, как поиск по сетке или автоматические методы. Кроме того, другие варианты моделей ARIMA, такие как SARIMA (сезонный ARIMA), могут использоваться для сбора и прогнозирования сезонных закономерностей в данных.
В заключение вывод, ARIMA — это мощный метод прогнозирования временных рядов, который сочетает в себе компоненты авторегрессии, интегрирования и скользящего среднего. Преобразуя нестационарные данные в стационарную форму и используя исторические закономерности, модели ARIMA могут обеспечивать точные прогнозы для широкого диапазона наборов данных временных рядов. Понимая концепции и выполняя шаги, описанные в этой статье, вы сможете эффективно создавать и оценивать модели ARIMA для прогнозирования будущих значений и получения ценных сведений из данных временных рядов.
Приятного чтения!