Как сформировать большой DataFrame для кэша Python LSTM? - PullRequest
0 голосов
/ 24 января 2019

Я почти нашел то, что мне нужно, в принятом ответе здесь .Но имелись проблемы с памятью, потому что предоставленный тест df был всего 11 строк.

Я пытаюсь предсказать использование LSTM для прогнозирования на 10 дней вперед из Временного ряда данные в модели регрессии (не классификатор!).Мой dataframe X имеет около 1500 строк и 2000 объектов , имея shape (1500, 2000), в то время как значения истинности y равны 1500 строк из 1 функции (которая может range any value between -1 and 1).

Поскольку LSTM требуется вектор 3D в качестве входа , я действительно борюсь за то, какдля изменения формы данных .

Опять же, следуя примеру из первого абзаца, происходит сбой для MemoryError при заполнении значений, более конкретно при df.cumulative_input_vectors.tolist().

My test (читать прогноз) - это фрейм данных shape (10, 2000).

Из-за конфиденциальных данных я не могу поделиться значениями / пример .Как я могу помочь вам помочь мне в этом?

Итак, , чтобы LSTM мог учиться из 1500 строк y, , как , как мне изменить мои x из 1500 строк и 2000 функций ? Также , как как мне изменить мою forecast из 10 строк и 2000 объектов ?

Они сначала пройдут, потому что яЯ изучаю LSTM - простую модель LSTM:

model = Sequential()
model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(train_X, train_y , epochs=50, batch_size=2, verbose=1)

, что я пробовал, но когда прогнозируемый получил ошибку:

# A function to make a 3d data of what I understood needed done:
def preprocess_data(stock, seq_len):
    amount_of_features = len(stock.columns)
    data = stock.values

    sequence_length = seq_len #+ 1
    result = []
    for index in range(len(data) - sequence_length):
        result.append(data[index : index + sequence_length])

    X_train = np.array(result)  

    X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], amount_of_features))

    return X_train

# creating the train as:
# X == the DF of 1500 rows and 2000 features
window = 10
train_X = preprocess_data(X[::-1], window)

1 Ответ

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

Через некоторое время мне удалось правильно понять, какие размеры где. Керас ожидает трехмерный массив .shape (totalRows, sequence, totalColumns) . sequences один был самым запутанным для меня.

Это потому, что при изменении формы df df.reshape(len(df), 1, len(df.columns)) значение keras выучило бы матрицу из 1 строки, что дало мне плохие результаты, потому что я не знал , лучше масштабировать данные для меня MinMaxScaler(-1,1) работал лучше всего , но может быть (0,1).

Что заставило меня понять , который должен был сначала использовать последовательность из более чем 1 строки (или дней, поскольку мой набор данных был временным рядом) . Это означает, что вместо подачи 1 строки объектов X приводит к 1 значению y , Я использовал что-то вроде 5 строк объектов X приводит к 1 значению y, как в:

# after scaling the df, resulted in "scaled_dataset"
sequences = 5
result = []
# for loop will walk for each of the 1500 rows
for i in range(0,len(scaled_dataset)):
    # every group must have the same length, so if current loop position i + number 
    # of sequences is higher than df length, breaks
    if i+sequences <= len(scaled_dataset):
        # this will add into the list as [[R1a,R1b...R1t],[R2a,R2b...R2t],...[R5a,R5b...R5t]]
        result.append(scaled_dataset[i:i+sequences].values)
# Converting to array + keras takes float32 better than 64
train_x = np.array(result).astype('float32')
# making the y into same length as X
train_y = np.array(y.tail(train_x.shape[0]).values)

train_x.shape, train_y.shape

'>>> (1495, 5, 2400), (1495,)

Написано по-другому менталитет о формах керас для моей задачи:

Учитывая, что это временной ряд, вышеприведенное означает, что 5 дней (строки 0–4) данных приводят к значению y строки 5.

Тогда, если не считать первый день + следующий день после последнего - все еще 5 дней - (строки 1–5) данных, то получится значение y строки 6.

Тогда, если не считать второй день + следующий день после последнего - все еще 5 дней - (строки 2–6) данных, то получим значение y строки 7.

Это довольно запутанно для начинающих keras / LSTM, но я надеюсь, что смогу рассказать об этом людям, которые могут приземлиться здесь.

...