我刚刚从kaggle post中测试了此模型,该模型假设可以从给定的最后一批库存中提前1天进行预测。如您所见,在调整了几个参数之后,我获得了令人惊讶的好结果。
均方误差为5.193。所以总体而言,它看起来很好地预测了未来的股票吧?当我仔细观察结果时,结果真是太恐怖了。
如您所见,该模型正在预测给定库存的最后价值,即我们当前的最后库存。
所以我将预测调整了一步。
因此,您现在可以清楚地看到该模型正在预测倒退或最后一个股票奖励,而不是将来的股票预测。
# So for each element of training set, we have 30 previous training set elements
X_train = []
y_train = []
previous = 30
for i in range(previous,len(training_set_scaled)):
X_train.append(training_set_scaled[i-previous:i,0])
y_train.append(training_set_scaled[i,0])
X_train, y_train = np.array(X_train), np.array(y_train)
print(X_train[-1],y_train[-1])
# The GRU architecture
regressorGRU = Sequential()
# First GRU layer with Dropout regularisation
regressorGRU.add(GRU(units=50, return_sequences=True, input_shape=(X_train.shape[1],1)))
regressorGRU.add(Dropout(0.2))
# Second GRU layer
regressorGRU.add(GRU(units=50, return_sequences=True))
regressorGRU.add(Dropout(0.2))
# Third GRU layer
regressorGRU.add(GRU(units=50, return_sequences=True))
regressorGRU.add(Dropout(0.2))
# Fourth GRU layer
regressorGRU.add(GRU(units=50))
regressorGRU.add(Dropout(0.2))
# The output layer
regressorGRU.add(Dense(units=1))
# Compiling the RNN
regressorGRU.compile(optimizer='adam',loss='mean_squared_error')
# Fitting to the training set
regressorGRU.fit(X_train,y_train,epochs=50,batch_size=32)
here是我的完整代码,您也可以在google colab
处运行此代码。
所以我的问题是背后的原因是什么?我在做什么错什么建议?
答案 0 :(得分:2)
实际上这是回归的一个众所周知的问题。由于回归器的任务是使错误最小化,因此可以通过从输入到回归器的要素中选择最接近的值来确保任务的安全。尤其是在时间序列问题中。
1)永远不要给出您希望模型预测的未处理的结束值,尤其是在时间序列回归问题中。更笼统地说,永远不要提供给回归器一些直接数字直觉的功能,以告知标签可能是什么。
2)如果不确定模型是否像您的案例一样复制,请确保将原始测试集和预测一起绘制以直观地分析情况。此外,如果可以的话,请根据实时数据对模型进行仿真,以观察模型预测的性能是否相同。
3)我建议您应用二进制分类而不是回归。
近一年来我一直在努力进行财务信号预测,请随时提出更多要求。
玩得开心。
答案 1 :(得分:0)
在我看来,这是因为您的损失函数是均方误差。最小化此错误的最佳方法是使用先前的值作为当前步骤的估计值(尤其是步骤附近时)。
如果您尝试预测样本之间的差异,您将开始清楚地看到模型的局限性。
我目前在尝试使用时间序列进行预测时遇到类似的问题。我还没有找到解决方案,但正像其他人指出的那样,正在提取特征。