如何使LSTM捕获每周的季节性?

时间:2019-07-02 16:00:09

标签: python keras deep-learning time-series lstm

我是深度学习领域的初学者,我需要LSTM的帮助。

我分析的数据由每个时间步长为1个月的许多http错误组成。我选择每10分钟的时间考虑数据(以便为训练提供更多数据)。

数据头:

data.head

数据显示了季节性趋势,在周末结束时发生的错误非常少,在工作日(例如,当人们连接到服务器时)发生的错误数量很大。

我的目标是预测第二天的错误数量。我创建了一个新列,其中的数据每天偏移一次以进行预测(考虑到我们有10分钟的时间步长,因此偏移6 * 24)。 因此,我试图预测6 * 24个时间步长。

我的模型如下:

model = Sequential()
model.add(LSTM(1008, return_sequences = True, input_shape=(train_X.shape[1], train_X.shape[2]))) 
model.add(Dropout(0.2))
model.add(LSTM(144, return_sequences = True, input_shape=(train_X.shape[1], train_X.shape[2]))) 
model.add(Dropout(0.2))
model.add(LSTM(7, return_sequences = True, input_shape=(train_X.shape[1], train_X.shape[2]))) 
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')

我了解到,为了训练模型,数据必须具有以下形状:[样本,时间步长,特征]。它由几个子时间序列组成。 因此,我首先尝试以下形状:[60,6 * 24,1],所以有60个样本,每个样本代表一天。

我还尝试了多个图层和隐藏单元,但我的问题始终是相同的:该模型无法捕获数据的每周季节性,似乎预测已发生变化,或者它可能基于前一个天。

这是我用于预测的地块:

actual_vs_prediction

测试数据由训练数据一个月后的12天组成。

我认为,如果我向模型指定子时间序列是几周,它将解决此问题。因此,我还尝试收集更多数据并考虑输入的以下形状:[21,6 * 24 * 7,1],所以有21个样本,每个样本代表一周(10分钟* 6 * 24 * 7) 。它没有用,我的情节与上一个非常相似。

我希望我的解释清楚,即使不愿要求提供更多细节。

谢谢

PS:如果唯一的方法是在收集数据时考虑1小时或一天的时间步长,请告诉我。我没有研究此选项,因为培训实例很少。

1 个答案:

答案 0 :(得分:0)

如果您知道星期几是一个重要功能,请暂时放弃LSTM的详细信息,然后可能要在输入数据中包括星期几(或布尔值is_weekday)。

您尝试过吗?