假设我在 Tensorflow 中创建一个顺序输入 LSTM,如下所示:
def Sequential_Input_LSTM(df, input_sequence):
df_np = df.to_numpy()
X = []
y = []
for i in range(len(df_np) - input_sequence):
row = [a for a in df_np[i:i + input_sequence]]
X.append(row)
label = df_np[i + input_sequence]
y.append(label)
return np.array(X), np.array(y)
X, y = Sequential_Input_LSTM(df_data , 10) # pandas DataFrame df_data contains our data
在此示例中,我将数据切片为
X
(输入向量)和 y
(标签),例如前 10 个值(序列长度)用作 X,第 11 个值是第一个 y。然后,包含 10 个值的窗口向右移动一步(进一步移动一个时间步),我们再次为 X
取 10 个值,并将第二行之后的值作为下一个 y
,依此类推。
然后假设我将
X
的一部分作为我的 X_test
,并使用 LSTM model
进行时间序列预测,如 predictions = model.predict(X_test)
。
当我实际尝试此操作并绘制
predict(X_test)
的结果时,它看起来像 y
数组,并且预测结果是同步的,无需进一步调整。我预计在将预测数组与标签一起绘制时,我必须手动将预测数组向右移动 10 个时间步长,因为我无法解释预测的前 10 个时间戳来自哪里。
鉴于模型尚未收到 10 个输入序列值,
X_test
的前 10 个时间步长的预测来自哪里? Tensorflow 是否使用 X_test
中的最后时间步来创建前 10 个值的预测,或者开始时的预测只是纯粹的猜测?
如果我猜对了,问题是
X_test
的前 10 个时间步使用 X
(或更精确地说,X_train
)的最后 10 个时间步进行预测。如果X_test
足够大,这并没有太大区别,但理论上是从训练集到测试集的数据泄漏。
我用一个小例子来演示(如果我错了请纠正我):
df_data = [0, 1, 2, .., 15] # len 16
window_size = 3
X = [[0,1,2], [1,2,3], [2,3,4], ..., [12,13,14]] # len 13
y = [3, 4, 5, .., 15] # len 13
# split the data 10-3 for train-test
X_train = [[0,1,2], [1,2,3], [2,3,4], ..., [9,10,11]]
y_train = [3, 4, 5, .., 12]
X_test = [[10,11,12], [11,12,13], [12,13,14]]
y_test = [13, 14, 15]
此示例中的问题是 10 和 11 都用于
X_train
和 X_test
的序列中。所以你必须首先将 df_data
分成训练/测试(不打乱),然后分别进行排序。这样,您将在训练和测试中丢失 y
的前 n 个值。