Python 使用keras和x27对季节数据进行时间序列预测;LSTM

Python 使用keras和x27对季节数据进行时间序列预测;LSTM,python,keras,time-series,lstm,Python,Keras,Time Series,Lstm,试图通过Python的Keras库使用LSTM预测家庭的热水消耗情况。观看了一些教程并对我的课程做了一个小测试,但没有发现一个帮助太大的(建议非常感谢)。因为这只是一个一次性的问题,我真的不想读一本关于这方面的书,这就是为什么我希望我能得到专家们的一些帮助。任务: 输入为~1,5年的消耗曲线,分辨率为1分钟。我将此配置文件放入csv,并将其命名为“labels.csv”。 第二个csv名为“features.csv”,正如其名称所示,它包含最重要的功能:一天中的分钟、一天中的小时、一周中的一天。

试图通过Python的Keras库使用LSTM预测家庭的热水消耗情况。观看了一些教程并对我的课程做了一个小测试,但没有发现一个帮助太大的(建议非常感谢)。因为这只是一个一次性的问题,我真的不想读一本关于这方面的书,这就是为什么我希望我能得到专家们的一些帮助。任务:

输入为~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.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)
如果有人能指出我做错了什么,给我指一个合适的(新手可以理解的)教程,或者给我指一个类似的项目,我可以循环使用——我会非常感激:)

我将该项目添加到我的

编辑:我也收到了很多反对的警告,尽管


返回所有内容都是最新的…

唯一遗漏的是,在时间序列中,您需要一个序列作为模型的输入。因此,您的输入应具有以下形状
[批次大小、长度顺序、n特征]
。目前我们可以认为您的数据集是由一个大的序列组成的。因此,您应该重新调整数据集,使其具有多个序列以适合模型。例如,使用keras的
TimeseriesGenerator
(您可以从数据集创建长度为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)

我编辑了我的答案,以显示你的模型应该有什么样的输入。谢谢你的努力!一个大序列有什么问题?如果我把它分割成可以更好管理的部分,我想,考虑到上下文,一周(或10080个值)这是有意义的最小值,因为这是典型的季节大小。如果我设置它,我会得到以下错误消息:ValueError:无法将大小为10080的序列复制到维度为3的array axis。我发现了一个类似的项目,并能够通过将我的数据集输入其中获得有希望的结果:
results=model.predict(x_test)

print(results)
pip install --upgrade tensorflow
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)