Прогнозирование числовых рядов

Откройте секреты прогнозирования числовых рядов: от финансов до метеорологии. Узнайте, как модели превращают данные в решения и скрытые закономерности.

В современном мире числовые ряды встречаются в экономике‚ финансах‚ метеорологии‚ здравоохранении и даже в социальных сетях. Умение прогнозировать будущие значения позволяет принимать обоснованные решения‚ оптимизировать процессы и выявлять скрытые закономерности.

Числовой ряд – это упорядоченная последовательность чисел‚ измеренных во времени. Как правило‚ каждый элемент rt представляет собой измерение в момент t. Задача предсказания – построить модель‚ которая после обучения на исторических данных сможет дать оценку будущих значений rt+1‚ rt+2‚ ….

Типы числовых рядов

  • Стационарные ряды – статистические свойства (среднее‚ дисперсия‚ автокорреляция) не меняются во времени.
  • Нестационарные ряды – присутствуют тренд‚ сезонность‚ изменение дисперсии.
  • Сезонные ряды – периодические колебания с фиксированным периодом.
  • Периодические ряды – повторяются с нефиксированным периодом.

Подготовка данных

  1. Проверка и заполнение пропусков – df.interpolate или df.fillna(method='ffill').
  2. Выявление и удаление выбросов – визуализация (box‑plot) и статистические методы.
  3. Логарифмирование и/или дифференцирование – стабилизируют дисперсию и делают ряд стационарным.
  4. Скейлинг – StandardScaler или MinMaxScaler для моделей‚ чувствительных к масштабу.
  5. Перевод в формат TimeSeries – индекс pd.DatetimeIndex для корректной работы с временными метками.

Модели для предсказания

Статистические модели

  • ARIMA (AutoRegressive Integrated Moving Average) – классический подход для стационарных и несостояных рядов после дифференцирования. Параметры p‚ d‚ q выбираются по ACF и PACF графикам.
  • SARIMA – расширение ARIMA‚ учитывающее сезонность.
  • Prophet (fbprophet) – библиотека от Facebook‚ удобна для быстрых прогнозов с сезонными компонентами.

Машинное обучение

  • Random Forest‚ Gradient Boosting (XGBoost‚ LightGBM) – работают с признаками‚ созданными из временной задержки (lag features).
  • Метод кросс‑валидации 1‚2‚…‚n (по времени) позволяет оценить модель на различных горизонтах.
  • Метод скользящего окна – фиксированное окно скользит по времени‚ обеспечивая обновление модели.

Нейросети

  • RNN‚ LSTM‚ GRU – рекуррентные сети‚ хорошо работающие с последовательными данными.
  • Transformer‑подобные модели – например‚ Informer‚ Autoformer‚ способны учитывать длинные зависимости.
  • Пример кода с использованием Keras (LSTM):
import numpy as np
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM‚ Dense

data = df['value'].values
data = data.reshape(-1‚1)

def create_dataset(dataset‚ look_back=1):
 X‚ Y = []‚ []
 for i in range(len(dataset)-look_back):
 X.append(dataset[i:(i+look_back)‚ 0])
 Y.append(dataset[i+look_back‚ 0])
 return np.array(X)‚ np.array(Y)

look_back = 12
X‚ y = create_dataset(data‚ look_back)
X = X.reshape(X.shape[0]‚ X.shape[1]‚ 1)

model = Sequential
model.add(LSTM(50‚ input_shape=(look_back‚1)))
model.add(Dense(1))
model.compile(loss='mean_squared_error'‚ optimizer='adam')
model.fit(X‚ y‚ epochs=100‚ batch_size=32‚ verbose=0)

Специализированные модели

  • Informer – специализированный трансформер для длинных временных рядов с быстрым обучением.
  • Autoformer – уменьшает количество параметров‚ сохраняя точность.

Оценка качества модели

  • MAE (Mean Absolute Error) – средняя абсолютная ошибка;
  • RMSE (Root Mean Squared Error) – корень из среднеквадратичной ошибки.
  • MAPE (Mean Absolute Percentage Error) – процентная ошибка.
  • SMAPE – симметричная MAPE‚ полезна для нулевых наблюдений.

Для кросс‑валидации с временными рядами обычно используют expanding window (расширяющее окно) или rolling window (скользящее окно). Функция TimeSeriesSplit из sklearn.model_selection позволяет реализовать эти подходы.

Пошаговый пример: прогнозирование пассажиров авиакомпании (Monthly Airline Passengers)

  1. Импорт данных:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

df = pd.read_csv('https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv')
df['Month'] = pd.to_datetime(df['Month'])
df.set_index('Month'‚ inplace=True)
df.head
  1. Проверка стационарности – тест Дики-Фуллера.
from statsmodels.tsa.stattools import adfuller
adf_result = adfuller(df['Passengers'])
print('ADF Statistic: %f' % adf_result[0])
print('p-value: %f' % adf_result[1])

Если p-value > 0.05‚ применяем дифференцирование.

  1. Разделение на train/test:
train = df.iloc[:-12]
test = df.iloc[-12:]
  1. Модель ARIMA:
import pmdarima as pm

model = pm.auto_arima(train‚ seasonal=True‚ m=12‚
 trace=True‚ error_action='ignore'‚
 suppress_warnings=True)
print(model.summary)
  1. Прогнозирование:
forecast = model.predict(n_periods=12)
forecast = pd.Series(forecast‚ index=test.index)
plt.plot(train['Passengers']‚ label='train')
plt.plot(test['Passengers']‚ label='actual')
plt.plot(forecast‚ label='forecast')
plt.legend
plt.show

Советы по работе с временными рядами

  • Всегда проводите графический анализ – откройте временной ряд‚ посмотрите на тренд и сезонность.
  • Проверяйте статистическую значимость изменений – тесты на стационарность‚ автокорреляцию.
  • Для сложных зависимостей используйте нейросети – LSTM‚ GRU‚ Transformer.
  • Не забывайте о пробном обучении – подберите гиперпараметры с помощью GridSearchCV или Optuna.
  • Проводите пост‑прогнозный анализ – сравните ошибку на тестовых данных с бизнес‑целями.

Прогнозирование числовых рядов – многопрофильная задача‚ требующая сочетания статистики‚ машинного обучения и глубокого обучения. Ключ к успеху — тщательная подготовка данных‚ правильный выбор модели и строгая оценка качества. С применением современных библиотек Python (pandas‚ statsmodels‚ scikit‑learn‚ TensorFlow‚ Prophet) можно быстро перейти от идеи к работающему решению.

Надеемся‚ что данная статья поможет вам осознанно подойти к задаче предсказания числовых рядов и выбрать подходящую методику для вашего проекта.