Выход из выборочного прогнозирования с использованием нейронной сети в Keras (Python)

#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) (при условии, конечно, что набор данных не перетасован). Я лично против упражнения по перетасовке (я знаю, что это устраняет смещение последовательности), потому что важно сохранить информацию о временных рядах нетронутой. Например, в эконометрике этому не учат