使用机器学习(作为库,我尝试过Tensorflow和Tflearn(我知道这只是Tensorflow的一个包装))我试图预测下周某个地区的拥堵情况(参见我之前的问题,如果你想要更多的背景故事)。我的训练集由400K标记的条目组成(日期为每分钟的拥塞值)。
我的问题是我现在在预测和现实之间存在时间差距。
如果我必须绘制一张带有现实和预测的图表,你会看到我的预测,同时具有与现实相同的形状。她在现实之前增加/减少。它开始让我觉得我的训练可能有问题。看来,当我的训练结束时,我的预测没有开始。
我的两个数据集(培训/测试)都在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个神经元,64个batch_size和5个纪元。 我的数据集由2个文件组成。首先是包含2列的培训文件:
时间戳|值
第二个具有相同的形状,但是是测试集(分开以避免它对我的预测有任何影响),文件仅在每次预测时使用一次并比较现实和预测。测试装置从训练装置停止的地方开始。
你知道这个问题可能是什么原因吗?
编辑: 在我的代码中我有这个功能:
# 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%并且没有间隙。
因为实际上我们不会知道我必须改变它们的这些值。 我首先尝试使用训练集但是在这篇文章中解释了问题:
为什么会这样?这个问题有解释吗?
答案 0 :(得分:0)
找到它。这是“def inverse_difference(history,yhat,interval = 1):”函数的问题。事实上,它使我的结果看起来像我最后的训练线。这就是为什么我有一个差距,因为我的数据中存在一种模式(峰值总是或多或少地在同一时刻)我认为他正在进行预测,而他只是从培训中回馈价值。