Введение
Прогнозирование временных рядов — это важная задача машинного обучения, которая заключается в предсказании будущих значений на основе прошлых наблюдений. Одним из эффективных подходов для прогнозирования временных рядов является использование нейросетей. В этой статье мы рассмотрим, как обучать нейросети для прогнозирования временных рядов с помощью библиотеки PyTorch.
Подготовка данных
Для обучения нейросети нам понадобятся временные ряды в виде последовательностей числовых значений. Допустим, у нас есть данные о ценах акций компании за последние несколько лет. Мы разделим эти данные на обучающую и тестовую выборки. В обучающей выборке будут данные за все годы, кроме последнего. Тестовая выборка — это данные за последний год, ее мы будем использовать для проверки качества обученной модели.
pythonCopy codeimport numpy as np
import torch
# генерируем искусственный ряд
data = np.sin(np.arange(1000)) + np.random.randn(1000)*0.2
train_data = torch.from_numpy(data[:800])
test_data = torch.from_numpy(data[800:])
Построение модели
Для прогнозирования временных рядов удобно использовать рекуррентные нейронные сети, например LSTM. Создадим простую модель с одним скрытым слоем LSTM:
pythonCopy codeimport torch.nn as nn
class LSTMModel(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size):
super(LSTMModel, self).__init__()
self.lstm = nn.LSTM(input_size, hidden_size, num_layers)
self.linear = nn.Linear(hidden_size, output_size)
def forward(self, x):
lstm_out, _ = self.lstm(x)
pred = self.linear(lstm_out[-1].view(-1))
return pred
model = LSTMModel(1, 10, 1, 1)
Модель принимает на вход последовательность значений (x) и возвращает предсказание для следующего временного шага.
Обучение модели
Обучим модель методом авторегрессии — для предсказания очередного значения ряда мы будем подавать на вход предыдущие значения.
pythonCopy codeimport torch.optim as optim
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=1e-2)
seq_length = 20
X = train_data[:-1].view(-1, seq_length, 1)
y = train_data[1:].view(-1, 1)
for epoch in range(100):
optimizer.zero_grad()
output = model(X)
loss = criterion(output, y)
loss.backward()
optimizer.step()
Мы разбиваем обучающую выборку на последовательности длины 20, предсказываем следующее значение и сравниваем его с реальным с помощью функции потерь MSE.
Тестирование модели
Проверим, как модель справляется с тестовыми данными:
pythonCopy codewith torch.no_grad():
model.eval()
X = test_data[:-1].view(-1, seq_length, 1)
preds = []
for i in range(len(test_data)-seq_length):
x = X[i].view(-1, 1, seq_length)
pred = model(x)
preds.append(pred.item())
true_values = test_data[seq_length:].numpy()
pred_values = np.array(preds)
import matplotlib.pyplot as plt
plt.plot(true_values, label=’true’)
plt.plot(pred_values, label=’pred’)
plt.legend()
plt.show()
Мы последовательно предсказываем значения на тестовой выборке и сравниваем с реальными значениями.
Вопросы и ответы
Вопрос: Какие типы нейронных сетей подходят для прогнозирования временных рядов?
Ответ: Помимо LSTM, хорошо зарекомендовали себя сети типа GRU, а также свёрточные и рекуррентные свёрточные сети. Выбор конкретной архитектуры зависит от данных и задачи.
Вопрос: Как готовить данные для обучения?
Ответ: Обычно данные нормализуют для масштабирования значений. Также важно разбить данные на тренировочную и тестовую выборки. Иногда применяют дополнительные преобразования данных.
Вопрос: Как оценить качество обученной модели?
Ответ: Для оценки используют различные метрики, например среднеквадратичную ошибку, среднее абсолютное отклонение, коэффициент детерминации. Выбор метрики зависит от решаемой задачи.