#python-3.x #tensorflow #keras #neural-network #forecasting
#python-3.x #тензорный поток #keras #нейронная сеть #прогнозирование
Вопрос:
Я выполняю упражнение по прогнозированию временных рядов, используя оконный метод, но я изо всех сил пытаюсь понять, как сделать прогноз из выборки. Вот код:
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
поскольку это не скользящий прогноз, мы не переобучаем модель. Может кто-нибудь, пожалуйста, объяснить мне?
Хотя я понимаю, почему сообщество Data Science структурирует dataset
таким образом, я лично считаю, что это намного понятнее, когда мы разделяем X
и y
и делаем model.fit
следующим образом model.fit(X,y,epochs=100,verbose=0)
и predict
следующим образом model.predict(X)
Ответ №1:
Цикл for возвращает прогнозы по порядку, тогда как если вы вызовете model.predict(dataset_validation), вы получите прогнозы в перемешанном порядке (предполагается, что вы перетасовали набор данных).
Что касается точки использования наборов данных — это может просто помочь с организацией кода. Нет необходимости когда-либо использовать его, если вы этого не хотите.
Комментарии:
1. Большое спасибо за ответ. Теперь это имеет смысл для меня. Я успокоился, когда прочитал, что в этом нет никакого вреда
model.predict(dataset_validation)
(при условии, конечно, что набор данных не перетасован). Я лично против упражнения по перетасовке (я знаю, что это устраняет смещение последовательности), потому что важно сохранить информацию о временных рядах нетронутой. Например, в эконометрике этому не учат