Как обучить нейронную сеть LSTM с несколькими независимыми временными сериями? - PullRequest
1 голос
/ 03 июля 2019

Допустим, у меня есть 3 датчика (Sa, Sb и Sc), которые измеряют дневную температуру воздуха только в январе (например, в юлианские дни с 1 по 31).И предположим, у меня есть полные наборы данных за 3 года, а дни подсчитываются последовательно (от 1 до 365: первый год, от 366 до 730: второй год ...).Итак, мой набор данных выглядит так:

     -------- ------ -------
    | Sensor | Day  | Value |
    |  Sa    |   01 |  7.2  |
    |  Sa    |   02 |  7.0  |
       ...
    |  Sa    |   31 |  5.9  |
    |  Sa    |  366 |  7.4  |
    |  Sa    |  367 |  7.5  |
       ...
    |  Sa    | 1095 |  5.5  |
    |  Sb    |   01 |  6.9  |
    |  Sb    |   02 |  7.1  |
       ...
    |  Sb    | 1095 |  5.6  |
    |  Sc    |   01 |  6.8  |
       ...
    |  Sc    | 1095 |  4.1  |
     -------- ------ -------

Я хочу предсказать значение в момент времени t, заданное от t-4 до t-1 (таким образом, x размер 3, y размер 1).Как мы видим, у нас есть 9 непрерывных временных рядов (от 1 до 31 для Sa, от 366 до 730 для Sa ... от 1 до 31 для Sb ...).Как мне организовать свой тренировочный набор с учетом проблемы с партиями в этом сценарии?

До сих пор я разбивал свои данные на x / y 2D-матрицы с учетом «действительных» последовательностей, это:

  features_set         labels
 | x1  |  x2 |  x3 |   |   y |
 | 7.2 | 7.0 | 6.9 |   | 6.7 |   (sample 1: for Sa days 1 to 3 -> 4)
 | 7.0 | 6.9 | 6.7 |   | 6.8 |   (sample 2: for Sa days 2 to 4 -> 5)
 ...
 | 5.7 | 5.8 | 5.8 |   | 5.9 |   (sample 31: for Sa days 28 to 30 -> 31)
 | 7.4 | 7.5 | 7.4 |   | 7.3 |   (sample 32: for Sa days 366 to 368 -> 369)
 ...
 | 7.0 | 6.9 | 6.7 |   | 6.8 |   (sample 251: for Sc days 1092 to 1094 -> 1095)

Обратите внимание, что выборки с 1 по 31 являются классическими «сдвинутыми последовательностями» первого месяца Sa, но существует «разрыв» во временной последовательности между выборками 31 и 32, поскольку выборка 31 является частью первого годаизмерения и выборка 32 является частью второго года измерений.

Если я обучаю NN с размером партии (N) 32, моя полученная функция минимальных потерь равна 0,5.Когда я уменьшаю размер партии до 8, я получаю потери от 0,1 до 0,05.Когда размер пакета равен 1, я получаю 0,04 (и это, по-видимому, минимум, который можно получить).

model = Sequential()
model.add(LSTM(4, input_shape=(features_set.shape[1], 1)))
model.add(Dense(1))

model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(features_set, labels, epochs=100, batch_size=N)

(в котором features_set является плавающей матрицей 251x3x1, а метки - плавающей матрицей 251x1x1)

Таким образом, выбор больших партий приводит к тому, что образцы как 31 и 32 объединяются?И это причина худшего результата тренировки?Как бороться с этим сценарием, кроме использования размера пакета 1?

1 Ответ

0 голосов
/ 03 июля 2019

Во-первых, я бы нормализовал данные в диапазоне от 0 до 1.

Посмотрите, помогают ли меньшая скорость обучения и большее количество эпох.

У вас есть партии с размером [3,3], так какв 3 датчика и 3 такта.Вы тренируете каждую партию по выходным данным размера [1,1]

Я предполагаю, что когда вы включаете больше партий, ошибка больше, потому что модель учитывает ошибку из 32 выборок вместо 1. Я быоставьте размер партии таким, какой он есть.

Если это поможет, эта модель выглядит примерно так: https://towardsdatascience.com/predicting-stock-price-with-lstm-13af86a74944

...