Низкая производительность LSTM с данными Keras по временным рядам

#python #tensorflow #keras #time-series #lstm

Вопрос:

Я пытаюсь построить сеть, которая будет предсказывать логическую цель.

Данные, предоставляемые в сеть, содержат как категориальные, так и числовые записи, но все они были должным образом обработаны. Данные, с которыми я работаю, — это данные временных рядов с 84 полями и 310033 строками данных. Все данные были масштабированы, чтобы оставаться в диапазоне от 0 до 1. Любая строка представляет собой секунду в данных.

Я создал базу данных, данные, с формой (310033, 60, 500), а целевой вектор имеет форму (1000, 1). Размер временного шага был определен равным 60, поскольку это максимально возможные полные 60 минутных часов с учетом объема доступных данных.

Затем я разделяю данные (X_train, X_test, y_train, y_test).

Можно ли дать такую матрицу модели lstm и ожидать хорошего прогноза (если отношения существуют)? Потому что у меня очень плохая производительность. Из того, что я видел, люди дают только 1D или 2D данные, и после этого они изменяют свои данные, чтобы ввести 3D-данные в слой lstm. Именно это я и сделал здесь.

Ниже приведен код преобразования из 2D в 3D:

 X_train, X_test, y_train, y_test = train_test_split(scaled, target, train_size=.7, shuffle = False) 

# Generate Lag time Steps 3D framework for LSTM - Currently in 2D Framework
# As required for LSTM networks, we must reshape the input data into N_samples x TimeSteps x Variables
hours = len(X_train)/3600
hours = math.floor(hours) #Find Most full 60-min-hours available in subset of data 
temp =[]
# Pull hours into the three dimensional field
for hr in range(hours, len(X_train)   hours):
    temp.append(scaled[hr - hours:hr, 0:scaled.shape[1]])
X_train = np.array(temp) #Export Train Features in (70% x Hours x Variables)

hours = len(X_test)/3600
hours = math.floor(hours) #Find Most full 60-min-hours available in subset of data 
temp =[]
# Pull hours into the three dimensional field
for hr in range(hours, len(X_test)   hours):
    temp.append(scaled[hr - hours:hr, 0:scaled.shape[1]])
X_test = np.array(temp) #Export Test Features in (30% x Hours x Variables)
 

Ниже приведена структура модели:

     model = Sequential()

    #Layer 1 - returns a sequence of vectors
    model.add(LSTM(128, return_sequences=True, 
                   input_shape=(X_train.shape[1], X_train.shape[2]))) 
    model.add(Dropout(0.15)) #15% drop out layer
    #model.add(BatchNormalization())

    #Layer 2
    model.add(LSTM(256, return_sequences=False))
    model.add(Dropout(0.15)) #15% drop out layer
    #model.add(BatchNormalization())

    #Layer 3 - return a single vector
    model.add(Dense(32))

    #Output of 2 because we have 2 classes
    model.add(Dense(2, activation= 'sigmoid'))

    # Define optimiser
    opt = tf.keras.optimizers.Adam(learning_rate=1e-5, decay=1e-6)

    # Compile model
    model.compile(loss='sparse_categorical_crossentropy', # Mean Square Error Loss = 'mse'; Mean Absolute Error = 'mae'; sparse_categorical_crossentropy
                  optimizer=opt, 
                  metrics=['accuracy'])
history = model.fit(X_train, y_train, epochs=epoch, batch_size=batch, validation_data=(X_test, y_test), verbose=3, shuffle=False)
 

Я экспериментировал со многими различными фреймворками для LSTM. Однослойный, многослойный, двойной слой LSTM с 2 усеченными плотными слоями (LSTM -> LSTM ->> Плотный(32) ->>> Плотный(2)), пакетная нормализация и т. Д…

Существует ли предлагаемая структура для такого типа данных временных рядов для повышения производительности? Я получал лучшие результаты, когда данные имели только один шаг по времени = 1.

Комментарии:

1. sigmoid это неправильно, вам нужно softmax в последнем слое.

2. @Fragtera — Спасибо за ваш вклад, я попробую это сделать. Причина, по которой я это сделал sigmoid , состоит в том, чтобы сжать мой вывод между 0 и 1 аналогично входу. Я следил за этим мыслительным процессом, потому sigmoid что он эквивалентен 2-элементу softmax .

3. Точно, вам нужен либо 1 нейрон, активированный сигмовидной, либо 2 нейрона с softmax.