现实与预测之间的延迟差距

Delay gap between reality and prediction

使用机器学习(作为库,我已经尝试过 Tensorflow 和 Tflearn(我知道这只是 Tensorflow 的包装))我正在尝试预测下周某个区域的拥堵情况(请参阅我之前的如果您想了解更多背景故事,请提问)。我的训练集由 400K 标记的条目组成(日期是每分钟的拥塞值)。

我的问题是我现在在预测和现实之间存在时间差距。

如果我不得不用现实和预测画一个图表,你会看到我的预测,同时与现实具有相同的形状。她在现实面前increase/decrease。它开始让我觉得也许我的训练有问题。看来我的预测并没有在我训练结束的时候开始。

我的两个数据集 (training/testing) 都在 2 个不同的文件中。首先我训练我的训练集(为了方便起见,假设它在第 100 分钟结束,我的测试集从第 101 分钟开始),一旦我的模型保存我做了我的预测,它通常应该开始预测 101 或者我在某个地方错了?因为它似乎在我的训练停止后开始预测方式(例如,如果我保留我的示例,它将开始预测值 107)。

目前,一个糟糕的解决方法是从训练集中删除尽可能多的延迟值(以这个例子为例,它将是 7)并且它起作用了,不再有延迟但我不明白为什么我有这个问题或如何解决它以便以后不会发生。

根据在不同网站上找到的一些建议,我的训练数据集似乎有差距(在这种情况下缺少时间戳)可能是个问题,看到确实有一些(总共大约占整体的 7% 到 9%)数据集丢失了)我使用 Pandas 来添加丢失的时间戳(我还给了他们最后知道的时间戳的拥塞值)虽然我认为它可能有一点帮助(差距更小) 它没有解决问题。

我尝试了多步预测、多变量预测、LSTM、GRU、MLP、Tensorflow、Tflearn,但它没有任何改变,让我认为它可能来自我的训练。 这是我的模型训练。

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 个神经元,batch_size 的 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% 并且没有差距。

由于实际上我们不知道这些值,所以我不得不更改它。 我首先尝试使用训练集,但在 post 上得到了问题的解释:

为什么会这样?这个问题有解释吗?

找到了。 "def inverse_difference(history, yhat, interval=1):" 函数有问题。事实上,它使我的结果看起来像我最后几行训练。这就是为什么我有差距,因为我的数据中有一个模式(峰值总是或多或少在同一时刻出现)我以为他在做预测,而他只是从训练中返回我的价值。