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

时间:2020-09-12 10:33:54

标签: python-3.x tensorflow keras neural-network forecasting

我正在使用窗口方法进行时间序列预测,但是我正在努力了解如何进行样本外预测。 这是代码:

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 features,右侧为y labels

[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]

下一步,我们在训练dataset上实现神经网络模型,如下所示:

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 loop的需求,因为这不是滚动预测,因此我们不会重新训练模型。有人可以向我解释吗?

虽然我理解了为什么数据科学界以这种方式构造dataset的原因,但我个人发现当我们分开Xy并进行{{1} }如下model.fitmodel.fit(X,y,epochs=100,verbose=0)如下predict

1 个答案:

答案 0 :(得分:2)

for循环按顺序返回预测,而如果调用model.predict(dataset_validation),则将按随机顺序获得预测(假设您对数据集进行随机排列)。

关于使用数据集的观点-它仅可以帮助进行代码组织。如果您不想使用,则永远不需要使用。