在 Keras 中使用神经网络进行样本外预测 (Python)
Out of Sample Forecasting using Neural Network in Keras (Python)
我正在使用 window 方法进行时间序列预测练习,但我很难理解如何进行样本外预测。
这是代码:
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
转换成windows,左边是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
,但我个人认为当我们拆分 X
和 y
并执行 model.fit
如下model.fit(X,y,epochs=100,verbose=0)
和predict
如下model.predict(X)
for 循环按顺序返回预测,而如果您调用 model.predict(dataset_validation),您将获得打乱顺序的预测(假设您打乱了数据集)。
至于使用数据集的意义 - 它可以帮助组织代码。不想用就不用用。
我正在使用 window 方法进行时间序列预测练习,但我很难理解如何进行样本外预测。 这是代码:
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
转换成windows,左边是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
,但我个人认为当我们拆分 X
和 y
并执行 model.fit
如下model.fit(X,y,epochs=100,verbose=0)
和predict
如下model.predict(X)
for 循环按顺序返回预测,而如果您调用 model.predict(dataset_validation),您将获得打乱顺序的预测(假设您打乱了数据集)。
至于使用数据集的意义 - 它可以帮助组织代码。不想用就不用用。