#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.