У меня есть простая однофакторная проблема прогнозирования временных рядов, где мой ввод 10, 20, 30, 40, 50, 60, 70, 80, 90
. Я хочу, чтобы модель предсказала следующие 3 значения. то есть вывод должен быть 100, 110, 120
.
Я использовал стекированный LSTM для этого. Мой код выглядит следующим образом.
from numpy import array
from keras.models import Sequential
from keras.layers import LSTM, Dense
def split_sequence(sequence, n_steps_in, n_steps_out):
X, y = list(), list()
for i in range(len(sequence)):
# find the end of this pattern
end_ix = i + n_steps_in
out_end_ix = end_ix + n_steps_out
# check if we are beyond the sequence
if out_end_ix > len(sequence):
break
# gather input and output parts of the pattern
seq_x, seq_y = sequence[i:end_ix], sequence[end_ix:out_end_ix]
X.append(seq_x)
y.append(seq_y)
return array(X), array(y)
raw_seq = [10, 20, 30, 40, 50, 60, 70, 80, 90]
# choose a number of time steps
n_steps_in, n_steps_out = 5, 3
# split into samples
X, y = split_sequence(raw_seq, n_steps_in, n_steps_out)
# reshape from [samples, timesteps] into [samples, timesteps, features]
n_features = 1
X = X.reshape((X.shape[0], X.shape[1], n_features))
model = Sequential()
model.add(LSTM(100, activation='relu', return_sequences=True, input_shape=(n_steps_in, n_features)))
model.add(LSTM(100, activation='relu'))
model.add(Dense(n_steps_out))
model.compile(optimizer='adam', loss='mse')
model.fit(X, y, epochs=50, verbose=0)
# demonstrate prediction
x_input = array([50, 60, 70, 80, 90])
x_input = x_input.reshape((1, n_steps_in, n_features))
yhat = model.predict(x_input, verbose=0)
print(yhat)
Поскольку я использую очень простой пример, я ожидал, что модель будет точно предсказывать. Однако вывод, который я получил, был ужасен ([[135.52011 151.59491 175.79674]]
).
Мне интересно, есть ли более эффективный способ сделать это в LSTM?
Я с удовольствием предоставлю более подробную информацию, если необходимо.