2017-08-31 53 views
1

使用机器学习(作为图书馆我试过Tensorflow和Tflearn(我知道这只是Tensorflow的包装))我试图预测下一周在一个地区的拥挤情况(如果你想要更多的背景知识,请参阅我以前的问题)。我的训练集由400K标记的条目组成(日期为每分钟拥堵值)。现实和预测之间的延迟差距

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

如果我必须绘制一张现实和预测的图表,您会发现我的预测尽管与现实具有相同的形状,但是仍然提前。她在现实之前增加/减少。它开始让我觉得,也许我的训练有问题。看起来,我的训练结束后,我的预测并未开始。

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

现在,一个不好的解决办法是从训练集中删除尽可能多的价值作为我的延迟(以这个例子,它将是7),它的工作,没有更多的延迟,但我不明白为什么我有这个问题或如何解决它,所以它不会在稍后发生。

根据在不同网站上发现的一些建议,看起来好像在我的训练数据集(在这种情况下缺少时间戳)有差距可能是一个问题,看到有一些(总共大约7到9%的整个数据集我已经使用熊猫添加缺少的时间戳(我也给他们最后知道时间戳的拥塞值),而我认为它可能有一点帮助(差距更小),它没有解决了这个问题。

我试过多步预测,多变量预测,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个神经元,64个batch_size和5个纪元。 我的数据集由2个文件组成。首先是2列培训文件:

timestamp |值

第二个具有相同的形状,但在测试组(分开,以避免它在我的预测没有任何影响),该文件只使用一次的预测已经做出,并比较现实和预测。测试集从训练集停止的地方开始。

你有什么可能是这个问题的原因的想法?

编辑: 在我的代码,我有这样的功能:

# 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%且没有间隙。 Using the testing set to inverse the difference

由于实际上我们不知道这些值我不得不改变它。 我试着先使用训练集,但得到了这个职位上解释的问题: Using the training set

为什么会发生这种情况?有没有解释这个问题?

回答

0

找到它。这是“def inverse_difference(history,yhat,interval = 1):”函数的问题。事实上,它使我的结果看起来像我最后的训练线。这就是我之所以存在差距的原因,因为我的数据中存在一种模式(峰值总是大致在同一时刻),我认为他正在做预测,而他只是从训练中回报我的价值。