【问题标题】:Time-Series prediction of seasonal data using keras' LSTM使用 keras 的 LSTM 对季节性数据进行时间序列预测
【发布时间】:2019-11-18 23:47:07
【问题描述】:

尝试使用 LSTM 和 Python 的 Keras 库来预测家庭的热水消耗情况。看了一些教程并做了一个 Udemy 课程,没有找到一个帮助太大的课程(建议赞赏)。由于这只是一个 1-time 问题,我真的不想阅读有关这方面的书籍,这就是为什么我希望我可以依靠 SO 专家的一些帮助。任务:

输入是约 1.5 年的消费概况,分辨率为 1 分钟。我将此配置文件放入 csv 并将其命名为“labels.csv”。 第二个 csv,称为“features.csv”,顾名思义,包含最重要的特征:一天中的分钟、一天中的小时、一周中的一天。这个想法是,通常在工作日的早上 6 点至晚上 8 点和下午 6 点至晚上 8 点之间发生消费,周末稍晚一些。其他影响因素如假期、一年中的月份等被忽略。输出应该是下周的消费概况,即 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()

现在我添加层(我仍然不知道如何决定我应该采取多少层以及它们应该有多大,但我可以通过尝试和错误找到。):

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

返回一切都是最新的......

【问题讨论】:

标签: python keras time-series lstm


【解决方案1】:

您唯一错过的是,在时间序列中,您需要一个序列作为模型的输入。所以你的输入应该有以下形状[batch_size, lenght_sequence, n_features]。目前我们可以认为你的数据集是由一个大序列组成的。因此,您应该重塑您的数据集,使其拥有超过 1 个序列来拟合模型。例如,使用来自 keras 的 TimeseriesGeneratordoc here 您可以从长度为 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)

【讨论】:

  • 我编辑了答案以显示您的模型应该具有的 input_shape
  • 感谢您的努力! “一个大序列”有什么问题?如果我把它分成可以更好地管理的部分,我认为,考虑到上下文,一周(或 10080 个值)将是有意义的最小值,因为这是典型的赛季规模。如果我设置它,我会收到以下错误消息:ValueError: cannot copy sequence with size 10080 to array axis with dimension 3.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 2016-07-26
  • 2018-09-04
  • 2021-11-09
  • 1970-01-01
相关资源
最近更新 更多