我几乎在accepted answer here中找到了我需要的东西。但是存在内存问题,因为提供的测试df只有11行。
我要预测的是使用 LSTM预测回归模型中的时间序列数据提前10天(不是分类器!)。我的数据框 X
大约有 1500行和2000个功能,属于shape (1500, 2000)
,而真值 {{1 }}只是1个功能的 1500行(可以y
)。
由于LSTM需要3D 向量作为输入,所以我真的正在努力改变数据的形状。
同样,按照第一段中的示例,在填充值时(尤其是在range any value between -1 and 1
处,它因MemoryError而崩溃。
我的测试(阅读预测)是一个{strong> df.cumulative_input_vectors.tolist()
的数据框。
由于敏感数据,我实际上无法共享值/示例。我该如何帮助您?
因此,要使LSTM能够从1500行的shape (10, 2000)
中学习,如何我应该重塑我的y
1500行和2000个功能? 也,我应该如何重塑我的x
的10行和2000个功能?
由于我正在学习LSTM,所以他们将首先接受以下简单的LSTM模型:
forecast
我尝试过的方法,但是当预报错误时:
model = Sequential()
model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(train_X, train_y , epochs=50, batch_size=2, verbose=1)
答案 0 :(得分:0)
一段时间后,我设法正确理解了尺寸。 Keras期望使用.shape
(totalRows,序列,totalColumns)的3d数组。 sequences
是我最困惑的地方。
那是因为在重塑df df.reshape(len(df), 1, len(df.columns))
时意味着 keras 将学习1行矩阵,这给了我不好的结果,因为我不知道最好缩放数据对我来说 MinMaxScaler(-1,1)
效果最好,但可能是(0,1)
。
让我明白的是,这是首先使用多于1行(或几天,因为我的数据集是时间序列)的顺序。表示代替输入1行特征X会产生y的值,我使用类似 5行特征X导致y的值1 < / strong>。如:
# after scaling the df, resulted in "scaled_dataset"
sequences = 5
result = []
# for loop will walk for each of the 1500 rows
for i in range(0,len(scaled_dataset)):
# every group must have the same length, so if current loop position i + number
# of sequences is higher than df length, breaks
if i+sequences <= len(scaled_dataset):
# this will add into the list as [[R1a,R1b...R1t],[R2a,R2b...R2t],...[R5a,R5b...R5t]]
result.append(scaled_dataset[i:i+sequences].values)
# Converting to array + keras takes float32 better than 64
train_x = np.array(result).astype('float32')
# making the y into same length as X
train_y = np.array(y.tail(train_x.shape[0]).values)
train_x.shape, train_y.shape
'>>>(1495,5,2400),(1495,)
用另一种方式写出我问题的喀拉斯形状的心态:
考虑到它是一个时间序列,上面的意思是5天(第0至4行)的数据得出第5行的y值。
然后,减去最后一天的第一天+第二天-仍然是5天-(第1至5行)数据,得出第6行的y值。
然后,减去最后一天之后的第二天+第二天-仍然是5天-(第2到6行)数据,得出第7行的y值。
对于keras / LSTM的初学者来说,这非常令人困惑,但是我希望我能为那些可能会来到这里的人详细介绍一下。