LSTM в Python генерирует плоские прогнозы - PullRequest
0 голосов
/ 07 мая 2019

enter image description hereenter image description here У меня есть ежедневные данные с июля 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)

Прогнозы - плоская линия.

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Несколько проблем:

  1. Ежедневные данные за 18 месяцев, вероятно, несущественны для нейронной сети, чтобы построить точный прогноз будущего.
  2. Ваша модель имеет только 1Слой LSTM, добавьте второй, чтобы извлечь выгоду из его «памяти»:
from keras.layers import Dropout

# define model
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(n_input,n_features), return_sequences=True))
model.add(Dropout(.4))
model.add(LSTM(100, activation='relu', return_sequences=False))
model.add(Dropout(.4))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')

Если вы предоставите свои данные, я могу более внимательно посмотреть.Вы пытались поэкспериментировать с переменной n_input?Это может повлиять на вашу модель.

0 голосов
/ 07 мая 2019

У меня была похожая проблема.Попробуйте установить «relu» в качестве функции активации в первом слое. Здесь - ссылка на отличный блог.Он содержит много очень полезных деталей, особенно если вы начинаете с машинного обучения.

Вот влияние количества эпох на результат с моей старой моделью. 5000 эпох 25 эпох Я также немного беспокоюсь о количестве тренировочных данных, которые у вас есть.Я обучил свою модель на 18 000 записей, чтобы прогнозировать следующие 24 часа, но моя модель анализирует довольно сложную систему.Я не знаю, что описывают ваши данные, но вы должны подумать о количестве возможных зависимостей в вашей системе и о том, насколько хорошо ваши данные обучения могут подготовить вашу модель для них.Я новичок в машинном обучении, но я узнал, что большая часть подготовки моделей - это метод проб и ошибок.Особенно в начале.Блог в начале моего ответа мне очень помог, я рекомендую вам прочитать его.

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

Здесь это пост о переоснащении и переоснащении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...