Как разделить тренировочные данные и тестовые данные для LSTM для прогнозирования временных рядов в Tensorflow - PullRequest
0 голосов
/ 28 февраля 2019

Недавно я изучил LSTM для прогнозирования временных рядов из https://github.com/Hvass-Labs/TensorFlow-Tutorials/blob/master/23_Time-Series-Prediction.ipynb

. В своем уроке он говорит: Вместо того, чтобы обучать Рекуррентную Нейронную Сеть на полных последовательностях почти 300 тыс. Наблюдений, мы будем использовать следующеефункция для создания партии более коротких подпоследовательностей, выбранных случайным образом из обучающих данных.

def batch_generator(batch_size, sequence_length):
"""
Generator function for creating random batches of training-data.
"""

# Infinite loop.
while True:
    # Allocate a new array for the batch of input-signals.
    x_shape = (batch_size, sequence_length, num_x_signals)
    x_batch = np.zeros(shape=x_shape, dtype=np.float16)

    # Allocate a new array for the batch of output-signals.
    y_shape = (batch_size, sequence_length, num_y_signals)
    y_batch = np.zeros(shape=y_shape, dtype=np.float16)

    # Fill the batch with random sequences of data.
    for i in range(batch_size):
        # Get a random start-index.
        # This points somewhere into the training-data.
        idx = np.random.randint(num_train - sequence_length)

        # Copy the sequences of data starting at this index.
        x_batch[i] = x_train_scaled[idx:idx+sequence_length]
        y_batch[i] = y_train_scaled[idx:idx+sequence_length]

    yield (x_batch, y_batch)

Он пытается создать несколько выборок бактов для обучения.

Мой вопрос заключается в том, может лисначала мы произвольно переносим значения x_train_scaled и y_train_scaled, а затем начинаем выборку нескольких партий, используя следующую команду batch_generator?

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

В учебном пособии автор выбрал фрагмент непрерывных образцов, например

x_batch[i] = x_train_scaled[idx:idx+sequence_length]
y_batch[i] = y_train_scaled[idx:idx+sequence_length]

Можем ли мы выбрать x_batch и y_batchне непрерывныйНапример, x_batch[0] выбран в 10:00am, а x_batch[1] выбран в 9:00am в тот же день?

В итоге: следующие два вопроса

(1) можем ли мы сначала произвольно перенести значения x_train_scaled и y_train_scaled, а затем начать выборку нескольких партий, используя следующую команду batch_generator?

(2) когда мы обучаем LSTM, нужно ли учитывать влияние временного порядка?какие параметры мы узнаем для LSTM.

Спасибо

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

(1) Мы не можем.Представьте, что вы пытаетесь предсказать погоду на завтра.Вам нужна последовательность значений температуры за последние 10 часов или случайные значения температуры за последние 5 лет?

Ваш набор данных представляет собой длинную последовательность значений с интервалом в 1 час.Ваш LSTM берет последовательность образцов , которая хронологически связана .Например, sequence_length = 10 может принимать данные с 2018-03-01 с 09:00:00 до 2018-03-01 19:00:00.Если вы перетасуете набор данных перед генерацией пакетов, состоящих из этих последовательностей, вы обучите свой LSTM прогнозированию на основе последовательности случайных выборок из всего набора данных.


(2) Да, нам нужнорассмотреть временное упорядочение для временных рядов.Вы можете найти способы проверить свой временной ряд LSTM в python здесь: https://machinelearningmastery.com/backtest-machine-learning-models-time-series-forecasting/

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

0 голосов
/ 08 марта 2019

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

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

В конце, вопрос заключается в следующем: «временной ряд» в том виде, как он есть , действительно является временным рядом (т.е. записи действительнозависит от соседа) или есть какое-то преобразование, которое может сломать эту зависимость, но сохранить структуру проблемы?И, на этот вопрос, есть только один способ получить ответ: изучить набор данных.

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

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