LSTM 对数值数据给出相同的预测

Posted

技术标签:

【中文标题】LSTM 对数值数据给出相同的预测【英文标题】:LSTM giving same prediction for numerical data 【发布时间】:2019-02-21 02:57:09 【问题描述】:

我创建了一个用于盘中股票预测的 LSTM 模型。我取了形状为 (290, 4) 的训练数据。我做了所有的预处理,比如规范化数据,取差,窗口大小为 4。

这是我输入数据的示例。

X = array([[0, 0, 0, 0],
   [array([ 0.19]), 0, 0, 0],
   [array([-0.35]), array([ 0.19]), 0, 0],
   ..., 
   [array([ 0.11]), array([-0.02]), array([-0.13]), array([-0.09])],
   [array([-0.02]), array([ 0.11]), array([-0.02]), array([-0.13])],
   [array([ 0.07]), array([-0.02]), array([ 0.11]), array([-0.02])]], dtype=object)

y = array([[array([ 0.19])],
   [array([-0.35])],
   [array([-0.025])],
   .....,
   [array([-0.02])],
   [array([ 0.07])],
   [array([-0.04])]], dtype=object)

注意:我给出以及预测差异值。所以输入值在范围(-0.5,0.5)之间

这是我的 Keras LSTM 模型:

dim_in = 4
dim_out = 1

model.add(LSTM(input_shape=(1, dim_in),
                return_sequences=True, 
                units=6))
model.add(Dropout(0.2))

model.add(LSTM(batch_input_shape=(1, features.shape[1],features.shape[2]),return_sequences=False,units=6))
model.add(Dropout(0.3))

model.add(Dense(activation='linear', units=dim_out))
model.compile(loss = 'mse', optimizer = 'rmsprop')


for i in range(300):
#print("Completed :",i+1,"/",300, "Steps")
    model.fit(X, y, epochs=1, batch_size=1, verbose=2, shuffle=False)
    model.reset_states()

我正在输入 shape=(1,4) 的最后一个序列值并预测输出。 这是我的预测: base_value = df.iloc[290]['Close'] prediction = [] orig_pred = [] input_data = np.copy(test[0,:]) input_data = input_data.reshape(len(input_data),1) for i in range(100): inp = input_data[i:,:] inp = inp.reshape(1,1,inp.shape[0]) y = model.predict(inp) orig_pred.append(y[0][0]) input_data = np.insert(input_data,[i+4],y[0][0], axis=0) base_value = base_value + y prediction_apple.append(base_value[0][0]) sqrt(mean_squared_error(test_output, orig_pred))

RMSE = 0.10592485833344527

这是预测可视化与股票价格预测的区别。

fig:1 -> 这是 LSTM 预测

fig:2 -> 这是股票预测

我不确定为什么它在 10 次迭代后预测相同的输出值。可能是梯度消失问题,或者我输入的输入数据较少(大约 290 个)或模型架构中的问题。我不知道。

请帮助如何获得合理的结果。

谢谢!!!

【问题讨论】:

尝试更改激活 仍然得到相同的输出。 你为什么要这样做model.fit(X, y, epochs=1, batch_size=1, verbose=2, shuffle=False)?。 model_p 是什么?你为什么不使用model?尝试使用多个 epoch 运行并仅拟合模型一次。不需要那个 for 循环(for i in range(300) @Kalsi 为编写 model_p 致歉,我已对其进行了编辑。我使用了 300 个 epoch,仍然得到相同的输出。 问题解决了吗? (我也有类似的):***.com/questions/56804431/… 【参考方案1】:

因为您的回归器通过复制您作为输入特征提供的特征来确保成本函数的最小化。例如,如果您在时间 t 的 BTC 收盘价为 6340 美元,它将在 t+1 或接近它的某个值上成交。确保您没有对回归器给出预测标签可能是什么的直接数字直觉,尤其是在处理时间序列数据时。

【讨论】:

【参考方案2】:

我不使用 Keras,但是查看您的代码和绘图,您的网络的复杂性似乎不足以容纳数据。尝试使用更多单元扩大网络,并尝试更大的窗口大小。

【讨论】:

以上是关于LSTM 对数值数据给出相同的预测的主要内容,如果未能解决你的问题,请参考以下文章

数值预测案例 LSTM 时间序列气温数据预测,附TensorFlow完整代码

为啥用于预测的 Keras LSTM 批量大小必须与拟合批量大小相同?

LSTM 模型不会预测高于某个值的值(始终不是相同的值)

时间序列预测之:LSTM方法容易出现的问题

LSTM - 对部分序列进行预测

TensorFlow LSTM 预测相同的值