У меня есть набор данных, который выглядит следующим образом:
var1(t-1) | var1(t) | var2(t-1) | var2(t) | var3(t-1) | var3(t)
и несколько строк.
Первые 5 столбцов являются входными данными, а последний столбец - выходными.Я могу делать прогнозы шаг за шагом, такие как:
Набор тренировок:
1 | 2 | 3 | 4 | 5 ---> pred 1
1 | 2 | 3 | 4 | 5 ---> pred 2
1 | 2 | 3 | 4 | 5 ---> pred 3
Набор тестов:
1 | 2 | 3 | 4 | 5 ---> pred 4
1 | 2 | 3 | 4 | 5 ---> pred 5
То, что я хочу прогнозировать:
1 | 2 | 3 | 4 | 5 ---> pred 4
1 | 2 | 3 | 4 | pred 4 ---> pred 5
1 | 2 | 3 | 4 | pred 5 ---> pred 6
1 | 2 | 3 | 4 | pred 6 ---> pred 7
и т. Д.
Мой код:
create train and test sets
values = scaled.values
split_point = int(len(values)*.80)
train = values[:split_point, :]
test = values[split_point:, :]
, разделить входы X
и выходы Y
:
train_X, train_Y = train[:, :-1], train[:, -1]
test_X, test_Y = test[:, :-1], test[:, -1]
изменить форму входа вбыть 3D-тензорным:
train_X = train_X.reshape((train_X.shape[0], train_X.shape[1], 1))
test_X = test_X.reshape((test_X.shape[0], test_X.shape[1], 1))
создать и обучить модель
model = Sequential()
model.add(LSTM(10, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dense(1))
model.compile(loss='mae', optimizer='adam')
history = model.fit(train_X, train_Y, nb_epoch=50, batch_size=100,
validation_split = 0.2, verbose=2, shuffle=False)
прогнозировать для всех тестовых значений
preds = model.predict(test_X)
прогнозировать по одному на основе предыдущего прогнозирования:
def moving_window(num_future_pred):
preds_moving = []
moving_test_window = [test_X[0,:].tolist()]
#moving_test_window = np.array(moving_test_window)
for i in range(len(test_Y)):
pred_one_step = model.predict(moving_test_window)
preds_moving.append(pred_one_step[0,0])
pred_one_step = pred_one_step.reshape((1,1,1))
moving_test_window =
np.concatenate((moving_test_window[:,:4,:], pred_one_step), axis= 1)
return preds_moving
preds_moving = moving_window(len(test_Y))
Правильно получается первое предсказание, поскольку он использует test_X[0,:]
в качестве входных данных.Но затем сдвигает окно и вместо ввода [1,2,3,4,pred4]
требуется [2,3,4,5, pred4]
, затем [3,4,5, pred4, pred5]
и т. Д. Как я могу изменить функцию moving_window
, чтобы принимать test_X[i, :4]
в качестве ввода, для i
in range
как 2000, и объединить с одношаговыми предсказаниями?
И, кроме того, вот графики для всего набора тестов и одношаговых прогнозов: