В современном мире числовые ряды встречаются в экономике‚ финансах‚ метеорологии‚ здравоохранении и даже в социальных сетях. Умение прогнозировать будущие значения позволяет принимать обоснованные решения‚ оптимизировать процессы и выявлять скрытые закономерности.
Числовой ряд – это упорядоченная последовательность чисел‚ измеренных во времени. Как правило‚ каждый элемент rt представляет собой измерение в момент t. Задача предсказания – построить модель‚ которая после обучения на исторических данных сможет дать оценку будущих значений rt+1‚ rt+2‚ ….
Типы числовых рядов
- Стационарные ряды – статистические свойства (среднее‚ дисперсия‚ автокорреляция) не меняются во времени.
- Нестационарные ряды – присутствуют тренд‚ сезонность‚ изменение дисперсии.
- Сезонные ряды – периодические колебания с фиксированным периодом.
- Периодические ряды – повторяются с нефиксированным периодом.
Подготовка данных
- Проверка и заполнение пропусков –
df.interpolateилиdf.fillna(method='ffill'). - Выявление и удаление выбросов – визуализация (box‑plot) и статистические методы.
- Логарифмирование и/или дифференцирование – стабилизируют дисперсию и делают ряд стационарным.
- Скейлинг –
StandardScalerилиMinMaxScalerдля моделей‚ чувствительных к масштабу. - Перевод в формат
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)
- Импорт данных:
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
- Проверка стационарности – тест Дики-Фуллера.
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‚ применяем дифференцирование.
- Разделение на train/test:
train = df.iloc[:-12]
test = df.iloc[-12:]
- Модель 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)
- Прогнозирование:
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) можно быстро перейти от идеи к работающему решению.
Надеемся‚ что данная статья поможет вам осознанно подойти к задаче предсказания числовых рядов и выбрать подходящую методику для вашего проекта.