使用机器学习(作为库,我尝试过 Tensorflow 和 Tflearn(我知道这只是 Tensorflow 的包装)),我试图预测下周某个区域的拥堵情况(请参阅我之前的问题,如果你想要更多的背景故事)。我的训练集由 400K 个标记条目组成(日期是每分钟的拥塞值)。
我的问题是我现在的预测和现实之间存在时间差距。
如果我必须根据现实和预测绘制一个图表,您会看到我的预测,虽然提前与现实具有相同的形状。她在现实面前增加/减少。这让我开始觉得也许我的训练有问题。看来我的预测并没有在我的训练结束时开始。
我的两个数据集(训练/测试)都位于两个不同的文件中。首先,我在我的训练集上进行训练(为了方便起见,我们假设它在第 100 分钟结束,我的测试集在第 101 分钟开始),一旦我的模型保存,我就会进行预测,它通常应该开始预测 101 或者我在某个地方错了?因为它似乎在我的训练停止后开始预测(例如,如果我保留我的示例,它将开始预测值 107)。
目前,一个糟糕的修复方法是从训练集中删除尽可能多的延迟值(以这个例子为例,它将是 7)并且它有效,不再有延迟,但我不明白为什么我遇到此问题或如何解决它,以免以后发生这种情况。
根据在不同网站上找到的一些建议,我的训练数据集中似乎存在间隙(在本例中缺少时间戳)可能是一个问题,因为确实有一些(总共大约整个数据集的 7 到 9% 是丢失)我已经使用 Pandas 添加了丢失的时间戳(我还给了它们最后一个知道时间戳的拥塞值),虽然我确实认为它可能有一点帮助(间隙较小)但它还没有修复问题所在。
我尝试了多步预测、多元预测、LSTM、GRU、MLP、Tensorflow、Tflearn,但它没有改变任何东西,让我认为它可能来 self 的训练。 这是我的模型训练。
def fit_lstm(train, batch_size, nb_epoch, neurons):
X, y = train[:, 0:-1], train[:, -1]
X = X.reshape(X.shape[0], 1, X.shape[1])
print X.shape
print y.shape
model = Sequential()
model.add(LSTM(neurons, batch_input_shape=(None, X.shape[1], X.shape[2]), stateful=False))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
for i in range(nb_epoch):
model.fit(X, y, epochs=1, batch_size=batch_size, verbose=0, shuffle=False)
model.reset_states()
return model
这 2 个形状是:
(80485, 1, 1)
(80485,)
(在此示例中,我仅使用 80K 数据作为速度训练)。
作为参数,我使用 1 个神经元、64 个批量大小和 5 个纪元。 我的数据集由 2 个文件组成。首先是包含 2 列的训练文件:
timestamp | values
第二个具有相同的形状,但是测试集(分开以避免对我的预测产生任何影响),该文件仅在每次预测完成后使用,并比较现实和预测。测试集从训练集停止的地方开始。
您知道这个问题的原因是什么吗?
编辑: 在我的代码中我有这个功能:
# invert differencing
yhat = inverse_difference(raw_values, yhat, len(test_scaled)+1-i)
# invert differenced value
def inverse_difference(history, yhat, interval=1):
return yhat + history[-interval]
它应该反转差异(从缩放值变为真实值)。 当像粘贴的示例(使用测试集)一样使用它时,我得到了完美,准确度高于 95%,并且没有差距。
由于实际上我们不知道这些值,所以我必须更改它。 我首先尝试使用训练集,但在这篇文章中解释了问题:
为什么会发生这种情况?这个问题有解释吗?
最佳答案
找到了。这是“def inverse_difference(history, yhat,interval=1):”函数的问题。事实上,这让我的结果看起来就像是我最后的训练。这就是为什么我有差距,因为我的数据中有一个模式(峰值总是或多或少在同一时刻)我认为他正在做预测,而他只是从训练中返回值。
关于python - 现实与预测之间的延迟差距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45974521/