Прогнозировать временные ряды с движущимся окном - PullRequest
0 голосов
/ 16 мая 2019

У меня есть набор данных, который выглядит следующим образом:

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, и объединить с одношаговыми предсказаниями?

И, кроме того, вот графики для всего набора тестов и одношаговых прогнозов:

Entire test_Y

One step predictions, with moving_window

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...