使用带有Python的Keras库的LSTM尝试预测家庭的热水消耗情况。观看了一些教程并参加了Udemy课程,但没有找到对您有太大帮助的课程(建议多加推荐)。由于这只是一次问题,所以我真的不想阅读有关这方面的书籍,这就是为什么我希望我可以依靠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
返回所有内容都是最新的...
答案 0 :(得分:1)
唯一遗漏的是,在时间序列中,您需要为模型输入序列。因此,您的输入应具有以下形状[batch_size, lenght_sequence, n_features]
。目前,我们可以认为您的数据集由一个大序列组成。因此,您应该调整数据集的形状,使其具有不止1个序列以适合模型。例如,使用来自keras(doc here的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)