使用Keras(Python)中的神经网络进行样本外预测

4

我正在使用窗口方法进行时间序列预测,但我很难理解如何进行样本外的预测。 以下是代码:

def windowed_dataset(series, window_size, batch_size, shuffle_buffer):
  dataset = tf.data.Dataset.from_tensor_slices(series)
  dataset = dataset.window(window_size + 1, shift=1, drop_remainder=True)
  dataset = dataset.flat_map(lambda window: window.batch(window_size + 1))
  dataset = dataset.shuffle(shuffle_buffer).map(lambda window: (window[:-1], window[-1]))
  dataset = dataset.batch(batch_size).prefetch(1)
  return dataset

dataset = windowed_dataset(x_train, window_size, batch_size, shuffle_buffer_size)

windowed_dataset函数将单变量时间序列series拆分成矩阵。想象一下,我们有一个如下的数据集:

dataset = tf.data.Dataset.range(10)
for val in dataset:
   print(val.numpy())
0
1
2
3
4
5
6
7
8
9

windowed_dataset 函数将 series 转换为窗口,左侧包含 x 个特征,右侧包含 y 个标签

[2 3 4 5] [6]
[4 5 6 7] [8]
[3 4 5 6] [7]
[1 2 3 4] [5]
[5 6 7 8] [9]
[0 1 2 3] [4]

在下一步中,我们按照以下方式在训练数据集上实现神经网络模型:
model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(10, input_shape=[window_size], activation="relu"),
    tf.keras.layers.Dense(10, activation="relu"), 
    tf.keras.layers.Dense(1)
])

model.compile(loss="mse", optimizer=tf.keras.optimizers.SGD(lr=1e-6, momentum=0.9))
model.fit(dataset,epochs=100,verbose=0)

到目前为止,我对代码感到满意。但是,我很难理解下面展示的样本外预测:

forecast = []
for time in range(len(series) - window_size):  
  forecast.append(model.predict(series[time:time + window_size][np.newaxis]))
forecast = forecast[split_time-window_size:]

请问为什么我们在这里使用循环语句 time in range(len(series) - window_size)?而不直接在验证集上使用 model.predict(dataset_validation) 和训练集上使用 model.predict(dataset)
我不理解为什么需要使用 for 循环,因为这不是滚动预测,我们也没有重新训练模型。请问有人能解释一下吗?
虽然我理解数据科学社区以这种方式构建 dataset 的原因,但我个人认为,将 Xy 拆分并按照以下方式进行 model.fit 更加清晰,model.fit(X,y,epochs=100,verbose=0),并且按照以下方式进行预测 model.predict(X)
1个回答

3

for循环按顺序返回预测值,而如果调用model.predict(dataset_validation),则会以随机顺序返回预测值(假设您已经打乱了数据集)。

至于使用数据集的目的-它可以帮助代码组织。如果您不想使用数据集,则没有必要使用它。


1
非常感谢您的答案。我现在明白了。当我读到“model.predict(dataset_validation)”没有任何伤害的时候,我感到放心(当然,假设数据集没有洗牌)。我个人反对洗牌练习(我知道它会破坏序列偏差),因为保留时间序列信息非常重要。例如,在计量经济学中他们不提倡这样做。 - bravopapa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接