Форма данных и входной сигнал LSTM для различных временных шагов - PullRequest
0 голосов
/ 08 января 2019

Для моей магистерской диссертации я хочу предсказать цену акции в течение следующего часа, используя модель LSTM. Мои данные X содержат 30 000 строк с 6 измерениями (= 6 объектов), мои данные Y содержат 30 000 строк и только 1 измерение (= целевая переменная). Для моей первой модели LSTM я изменил данные X в (30.000x1x6), данные Y в (30.000x1) и определил входные данные следующим образом: input_nn = Input (shape = (1, 6))

Я не уверен, как изменить форму данных и определить форму ввода для модели, если я хочу увеличить временные шаги. Я все еще хочу предсказать цену акций в следующем часе, но включаю больше предыдущих временных шагов. Нужно ли мне добавлять данные из предыдущих временных шагов в мои данные X во втором измерении?

Можете ли вы объяснить, что именно означает количество единиц LSTM? Должно ли оно быть таким же, как количество временных шагов в моем случае?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Обновление с кодом, который примерно в 5 раз быстрее, чем последний:

x = np.load(nn_input + "/EOAN" + "/EOAN_X" + ".npy")
y = np.load(nn_input + "/EOAN" + "/EOAN_Y" + ".npy")
num_features = x.shape[1]
num_time_steps = 500

for train_index, test_index in tscv.split(x):
# Split into train and test set
print("Fold:", fold_counter, "\n" + "Train Index:", train_index, "Test Index:", test_index)
x_train_raw, y_train, x_test_raw, y_test = x[train_index], y[train_index], x[test_index], y[test_index]

# Scaling the data
scaler = StandardScaler()
scaler.fit(x_train_raw)
x_train_raw = scaler.transform(x_train_raw)
x_test_raw = scaler.transform(x_test_raw)

# Creating Input Data with variable timesteps
x_train = np.zeros((x_train_raw.shape[0] - num_time_steps + 1, num_time_steps, num_features), dtype="float32")
x_test = np.zeros((x_test_raw.shape[0] - num_time_steps + 1, num_time_steps, num_features), dtype="float32")

for row in range(len(x_train)):
    for timestep in range(num_time_steps):
        x_train[row][timestep] = x_train_raw[row + timestep]

for row in range(len(x_test)):
    for timestep in range(num_time_steps):
        x_test[row][timestep] = x_test_raw[row + timestep]

y_train = y_train[num_time_steps - 1:]
y_test = y_test[num_time_steps - 1:]
0 голосов
/ 08 января 2019

Вы на правильном пути, но путаете количество единиц с временными шагами. units - это гиперпараметр, который управляет выходным измерением LSTM. Это размерность выходного вектора LSTM, поэтому если input равен (1,6) и у вас есть 32 единицы, вы получите (32,), так как в LSTM будет проходить одиночный временной шаг и получится вектор размером 32.

Временные шаги относятся к размеру истории, которую вы можете рассмотреть в LSTM. Так что это совсем не то же самое, что юниты. Вместо того, чтобы обрабатывать данные самостоятельно, у Keras есть удобный TimeseriesGenerator , который будет принимать двухмерные данные, подобные вашим, и использовать скользящее окно с размером временного шага для генерации данных временных рядов. Из документации:

from keras.preprocessing.sequence import TimeseriesGenerator
import numpy as np

data = np.array([[i] for i in range(50)])
targets = np.array([[i] for i in range(50)])

data_gen = TimeseriesGenerator(data, targets,
                               length=10, sampling_rate=2,
                               batch_size=2)
assert len(data_gen) == 20

batch_0 = data_gen[0]
x, y = batch_0
assert np.array_equal(x,
                      np.array([[[0], [2], [4], [6], [8]],
                                [[1], [3], [5], [7], [9]]]))
assert np.array_equal(y,
                      np.array([[10], [11]]))

, который вы можете использовать в каталоге model.fit_generator(data_gen,...), что дает вам возможность опробовать различные частоты выборки, временные шаги и т. Д. Вероятно, вам следует изучить эти параметры и то, как они влияют на результат в вашей диссертации.

...