Входное преобразование для Keras LSTM - PullRequest
1 голос
/ 21 апреля 2019

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

    Open    High    Low Close   Volume
Date                    
2014-04-21  197.080002  206.199997  194.000000   
204.380005  5258200
2014-04-22  206.360001  219.330002  205.009995   
218.639999  9804700
2014-04-23  216.330002  216.740005  207.000000   
207.990005  7295600
2014-04-24  210.809998  212.800003  203.199997   
207.860001  5495200
2014-04-25  202.000000  206.699997  197.649994   
199.850006  6996700

Как вы можете видеть, это небольшой снимок движения акций TSLA.

Я понимаю, что с LSTM эти данные должны быть преобразованы в триРазмеры:

  1. Размер партии

  2. Шаг по времени

  3. Характеристики

Моя первоначальная идея заключалась в том, чтобы использовать какой-то пакет среднего размера (чтобы обеспечить лучшее обобщение).Кроме того, чтобы оглянуться на 10 дней истории как Шаг Времени.Возможности: Open, High, Low, Volume, Close.

Здесь я немного застрял.У меня есть два вопроса, а именно:

  1. Каков подход для разбивки данных на новое представление (преобразования)?

  2. Как мывзять это и разделить на наборы поездов, тестов и проверок?У меня возникают проблемы с концептуальным пониманием того, что именно разбивается.Сначала я думал использовать sklearn:

    train_test_split ()

Но, похоже, в этом случае это не сработает.

Очевидно,как только данные были преобразованы, а затем разделены, легко построить модель Keras.Это просто вопрос соответствия. (Данные).

Буду признателен за любые предложения или ресурсы (указывающие в правильном направлении).

Мой текущий код:

from sklearn.model_selection import train_test_split 

# Split the Data into Training and Testing Data
tsla_train, tsla_test = train_test_split(tsla)

tsla_train.shape
tsla_test.shape

from sklearn.preprocessing import MinMaxScaler

# Scale the Data
scaler = MinMaxScaler()

scaler.fit(tsla_train)

tsla_train_scaled = scaler.transform(tsla_train)
tsla_test_scaled = scaler.transform(tsla_test)

# Define the parameters of the model

batch_size = 20

# Set the model to look back on four days of historical data and 
try to predict the fifth
time_steps = 10

from keras.models import Sequential
from keras.layers import LSTM, Dense

lstm_model = Sequential()

В этом посте найдено объяснение здесь .

1 Ответ

0 голосов
/ 21 апреля 2019

Функция train_test_split действительно не даст здесь желаемых результатов. Предполагается, что каждая строка является независимой точкой данных, а это не так, поскольку вы используете один временной ряд.

Наиболее распространенным вариантом будет использование более ранних точек данных для обучения и более поздних точек данных для тестирования (и диапазона точек в середине для проверки, если это применимо), что даст вам такие же результаты, как если бы вы использовали все имеющиеся данные для обучения в последний день в тренировочном наборе и фактически использованные для прогнозов в последующие дни.

После разделения наборов данных идея заключается в том, что в каждой обучающей партии должны быть входы и соответствующие выходы для случайно выбранного набора диапазонов дат, где каждый вход представляет собой выбранное количество дней исторических данных ( то есть days × features, с полной партией, равной batch size × days × features), и выводом являются только данные за следующий день,

Надеюсь, это поможет с интуицией, стоящей за процедурой. В статье, на которую вы ссылаетесь, есть примеры большей части кода, который вам понадобится - он будет довольно плотным, но я бы порекомендовал постараться идти построчно и понимать все, что он делает, возможно, даже просто набирать его дословно.

...