У меня есть ежедневные данные с июля 2017 года по декабрь 2018 года, которые носят нестационарный характер, и я пытаюсь составить прогнозы на следующие шесть месяцев, т.е.;с января 2019 года по июль 2019 года. Я пытался использовать SARIMAX & LSTM, но получаю точные прогнозы.Это первый раз, когда я использую LSTM, поэтому я попробовал и RELU, и Sigmoid в качестве функций активации, но прогнозы не изменяются
SARIMA
SARIMAX
LSTM
Ниже приведены данные за месяц:
values
X_Date
2017-07-01 15006.17
2017-07-02 15125.35
2017-07-03 13553.20
2017-07-04 14090.07
2017-07-05 14341.84
2017-07-06 15037.23
2017-07-07 15588.56
2017-07-08 16592.55
2017-07-09 16851.91
2017-07-10 15630.53
2017-07-11 15501.26
2017-07-12 15852.34
2017-07-13 15020.60
2017-07-14 17115.26
2017-07-15 17668.73
2017-07-16 17604.95
2017-07-17 16686.89
2017-07-18 16523.80
2017-07-19 17642.11
2017-07-20 17803.65
2017-07-21 18756.53
2017-07-22 19220.46
2017-07-23 18876.94
2017-07-24 18103.97
2017-07-25 18034.74
2017-07-26 16650.10
2017-07-27 17247.02
2017-07-28 17620.62
2017-07-29 18210.39
2017-07-30 17015.64
scaler = MinMaxScaler()
train = daily_data.iloc[:365]
test = daily_data.iloc[365:]
scaler.fit(train)
scaled_train = scaler.transform(train)
scaled_test = scaler.transform(test)
from keras.preprocessing.sequence import TimeseriesGenerator
scaled_train
# define generator
n_input = 7
n_features = 1
generator = TimeseriesGenerator(scaled_train, scaled_train,
length=n_input, batch_size=1)
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
# define model
model = Sequential()
model.add(LSTM(200, activation='sigmoid', input_shape=(n_input,
n_features)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
model.summary()
# fit model
model.fit_generator(generator,epochs=25)
model.history.history.keys()
loss_per_epoch = model.history.history['loss']
plt.plot(range(len(loss_per_epoch)),loss_per_epoch)
first_eval_batch = scaled_train[-7:]
first_eval_batch = first_eval_batch.reshape((1,n_input,n_features))
model.predict(first_eval_batch)
test_predictions = []
first_eval_batch = scaled_train[-n_input:]
current_batch = first_eval_batch.reshape((1, n_input, n_features))
np.append(current_batch[:,1:,:],[[[99]]],axis=1)
test_predictions = []
first_eval_batch = scaled_train[-n_input:]
current_batch = first_eval_batch.reshape((1, n_input, n_features))
for i in range(len(test)):
# get prediction 1 time stamp ahead ([0] is for grabbing just the
number instead of [array])
current_pred = model.predict(current_batch)[0]
# store prediction
test_predictions.append(current_pred)
# update batch to now include prediction and drop first value
current_batch = np.append(current_batch[:,1:,:],
[[current_pred]],axis=1)
Прогнозы - плоская линия.