我创建了一个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
这是预测可视化和股价预测之间的区别。
图:1->这是LSTM预测
图:2->这是库存预测
我不确定为什么10次迭代后它会预测相同的输出值。也许是消失的梯度问题,或者我输入的输入数据较少(大约290)或模型体系结构中的问题。我不确定。
请帮助如何获得合理的结果。
谢谢!!!
答案 0 :(得分:0)
我不与Keras一起工作,但是仔细检查您的代码并进行绘图,看来您网络的复杂性可能不足以容纳数据。尝试使用更多单位扩大网络,并尝试使用更大的窗口大小。
答案 1 :(得分:0)
因为您的回归器通过复制您作为输入要素提供的要素来确保成本函数的最小化。例如,如果您在时间t的BTC收盘价为$ 6340,它将在t + 1或接近它的某个价格成交。确保您没有给回归器一个直接的数字直觉,即预测的标签可能是什么,尤其是在使用时间序列数据时。