Я бы подошел к проблеме по-другому
Проблема: Вы хотите предсказать временной ряд из набора временных рядов.Допустим, у вас есть 3 значения временного ряда TS1, TS2, TS3
каждый из 100 временных шагов, которые вы хотите предсказать, временной ряд y1, y2, y3
.
Мой подход к этой проблеме будет таким, как показано ниже

т. Е. Сгруппируйте временные ряды для каждого временного шага вместе и передайте их в LSTM.Если некоторые временные шаги короче, чем другие, вы можете дополнить их.Точно так же, если у некоторых наборов есть меньше временных рядов, тогда снова добавьте их.
Пример:
import numpy as np
np.random.seed(33)
time = 100
N = 5000
k = 5
magic = np.random.normal(size = k)
x = list()
y = list()
for i in range(N):
dat = np.zeros((k, time))
for i in range(k):
dat[i,:] = np.sin(list(range(time)))*np.random.normal(size =1) + np.random.normal(size = 1)
x.append(dat)
y.append(dat.T @ magic)
Итак, я хочу предсказать временную серию из 100 шагов из набора из 3 шагов.Мы хотим, чтобы модель выучила magic
.
from keras.models import Model
from keras.layers import Input, Conv1D, Dense, Lambda, LSTM
from keras.optimizers import Adam
from keras import backend as K
import matplotlib.pyplot as plt
input = Input(shape=(time, k))
lstm = LSTM(32, return_sequences=True)(input)
output = Dense(1,activation='sigmoid')(lstm)
model = Model(inputs = input, outputs = output)
model.compile(optimizer = Adam(), loss='mean_squared_error')
data_x = np.zeros((N,100,5))
data_y = np.zeros((N,100,1))
for i in range(N):
data_x[i] = x[i].T.reshape(100,5)
data_y[i] = y[i].reshape(100,1)
from sklearn.preprocessing import StandardScaler
ss_x = StandardScaler()
ss_y = StandardScaler()
data_x = ss_x.fit_transform(data_x.reshape(N,-1)).reshape(N,100,5)
data_y = ss_y.fit_transform(data_y.reshape(N,-1)).reshape(N,100,1)
# Lets leave the last one sample for testing rest split into train and validation
model.fit(data_x[:-1],data_y[:-1], batch_size=64, nb_epoch=100, validation_split=.25)
Потери в валу продолжали падать, но я остановил их.Давайте посмотрим, насколько хорош наш прогноз
y_hat = model.predict(data_x[-1].reshape(-1,100,5))
plt.plot(data_y[-1], label='y')
plt.plot(y_hat.reshape(100), label='y_hat')
plt.legend(loc='upper left')

Результаты многообещающие.Запуск его для большего количества эпох, а также настройка гиперпараметров должны еще больше приблизить нас к magic
.Можно также попробовать сложенный LSTM и двунаправленный LSTM.
Мне кажется, что RNN лучше подходят для данных временного ряда, чем CNN
Формат данных: допустим, временные шаги = 3 Временной ряд 1 =[1,2,3]
Временной ряд 2 = [4,5,6]
Временной ряд 3 = [7,8,9]
Временной ряд 3 = [10,11,12]
Y =[100,200,300]
Для партии размером 1
[[1,4,7,10],[2,5,8,11],[3,6,9,12]] -> LSTM -> [100,200,300]