Прогнозирование временных рядов сезонных данных с использованием LSTM Кераса - PullRequest
0 голосов
/ 09 июля 2019

Попытка предсказать профиль потребления горячей воды домохозяйством с помощью LSTM с библиотекой Python Keras.Посмотрел несколько уроков и прошел курс Удеми, но не нашел того, который слишком помог (рекомендации приветствуются).Так как это всего лишь однократная проблема, я не очень хочу читать тонны книг об этом, поэтому я надеялся, что смогу рассчитывать на некоторую помощь со стороны экспертов по SO.Задача:

Ввод представляет собой профиль потребления длительностью ~ 1,5 года с разрешением в 1 минуту.Я поместил этот профиль в CSV и назвал его "tags.csv".Второй CSV, называемый «features.csv» содержит, как следует из названия, наиболее важные функции: минуты дня, час дня, день недели.Идея заключается в том, что, как правило, потребление происходит в период с 6 до 8 утра и с 18 до 20 вечера в будние дни и немного позже в выходные дни.Другие влияющие факторы, такие как дни отпуска, месяц года и т. Д., Не учитывались.Выходными данными должен быть профиль потребления на следующей неделе, то есть 10080 строк.

Сначала я импортирую соответствующие модели и загружаю файлы CSV.

import pandas as pd
import plotter
from sklearn.model_selection import train_test_split
from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dense

features = pd.read_csv('features.csv')
labels = pd.read_csv('labels.csv')

Затем я делю это на обучениеи наборы для тестирования:

x_train, x_test, y_train, y_test = train_test_split(features,labels,test_size=0.2)

Теперь я определяю свою модель.

model = Sequential()

Теперь я добавляю слои (я до сих пор не знаю, как решить, сколько слоев мне нужно взять и насколько они должны быть большими, но что я могу узнать с помощью метода try and error.):

model.add(LSTM(24,activation='relu',input_shape=(1,3)))
model.add(Dense(1))

Компилируем модель следующим образом:

model.compile(loss='mse', optimizer="adam")

Наконец, подгонка модели:

model.fit(x_train,y_train,epochs=60,verbose=2)

Выполнение последней строки приводит к ошибке:

Traceback (most recent call last):
  File "/home/bruno/Desktop/Python Projects/lstm_dhw_data2/lstm.py", line 24, in <module>
    model.fit(x_train,y_train,epochs=60,verbose=2)
  File "/usr/local/lib/python3.6/dist-packages/keras/engine/training.py", line 952, in fit
    batch_size=batch_size)
  File "/usr/local/lib/python3.6/dist-packages/keras/engine/training.py", line 751, in _standardize_user_data
    exception_prefix='input')
  File "/usr/local/lib/python3.6/dist-packages/keras/engine/training_utils.py", line 128, in standardize_input_data
    'with shape ' + str(data_shape))
ValueError: Error when checking input: expected lstm_1_input to have 3 dimensions, but got array with shape (838860, 3)

Так что я даже не дохожу до ...

results=model.predict(x_test)

print(results)

Если кто-то может указать на то, что я сделал неправильно, укажите мне подходящий (понятный новичку) учебник или точкуменя к аналогичному проекту, который я могу переработать - я был бы очень признателен:)

Я добавил проект в свой GitHub

Редактировать: я также делаюполучить множество предупреждений об устаревании, даже если

pip install --upgrade tensorflow

вернет, что все обновлено ...

1 Ответ

1 голос
/ 09 июля 2019

Единственное, что вы пропустили, это то, что во временных рядах вам нужна последовательность в качестве входа для вашей модели. Таким образом, ваш ввод должен иметь следующую форму [batch_size, lenght_sequence, n_features]. В настоящее время мы можем считать, что ваш набор данных состоит из одной большой последовательности. Таким образом, вы должны изменить свой набор данных, чтобы иметь более 1 последовательности, чтобы соответствовать модели. Например, используя TimeseriesGenerator от keras ( документ здесь , вы можете создать из своих наборов данных длину 10 (или любой другой параметр, который лучше всего соответствует вашим данным) следующим образом:

from keras.preprocessing.sequence import TimeseriesGenerator

sequence_length = 10

data_gen = TimeseriesGenerator(x_train, y_train,
                               length=sequence_length,
                               batch_size=16)

model = Sequential()
model.add(LSTM(24,activation='relu',input_shape=(sequence_length, 3)))
model.add(Dense(1))
model.compile(loss='mse', optimizer="adam")
model.fit_generator(data_gen)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...