Модель, которую вы представили выше, рассматривает один случай из 26 измерений, чтобы сделать прогноз. Из вашего описания кажется, что вы хотели бы делать прогнозы из последовательности этих измерений. Я не уверен, полностью ли я понял описание, но я предполагаю, что у вас есть последовательность из 46 измерений, каждое с 26 значениями, которые, по вашему мнению, должны быть хорошими предикторами температуры. Если это так, входная форма вашей модели должна быть (46, 26,). 46 здесь называется time_steps, 26 - количество функций.
Для временного ряда вам необходимо выбрать дизайн модели. Есть 2 подхода: рекуррентная сеть или сверточная сеть (или смесь 2-го). Сверточная сеть обычно используется для обнаружения шаблонов во входных данных, которые могут быть расположены где-то в данных. Например, предположим, что вы хотите обнаружить заданную форму на изображении. Сверточные сети являются хорошей отправной точкой. Рекуррентные сети обновляют свое внутреннее состояние после каждого временного шага. Они могут обнаруживать шаблоны, а также сверточную сеть, но вы можете думать о них как о менее зависимых от позиции.
Простой пример сверточного подхода.
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import *
from tensorflow.keras.models import Sequential, Model
average_tmp = 0.0
model = Sequential([
InputLayer(input_shape=(46,26,)),
Conv1D(16, 4),
Conv1D(32, 4),
Conv1D(64, 2),
Conv1D(128, 4),
MaxPooling1D(),
Flatten(),
Dense(256, activation='relu'),
Dense(1, bias_initializer=keras.initializers.Constant(average_tmp)),
])
model.compile('adam', 'mse')
model.summary()
Смешанный подход, заменивший выше слой `` Flatten` 'узлом LSTM. Это, вероятно, будет разумной отправной точкой для начала экспериментов.
(1) Я прочитал, что перекрестная проверка не приспособлена для прогнозирования временных рядов. Поэтому мне интересно, какие существуют другие методы, а какие более приспособлены к временным рядам.
перекрестная проверка - метод, который очень хорошо подходит для этой проблемы. Если вы попробуете приведенную выше примерную модель, я почти гарантирую, что она будет значительно превосходить ваш набор данных. перекрестная проверка может помочь вам определить правильные параметры регуляризации для вашей модели, чтобы избежать переобучения.
Примеры методов регуляризации, которые вы, вероятно, захотите рассмотреть:
- Сохранение весов модели в эпоху с более низким баллом проверки.
- Удаление и / или пакетная нормализация.
- регуляризация ядра.
(2) Во-вторых, я решил нормализовать свои данные, потому что мой набор данных X состоит из различных метрик (градусы, миниметры, г / м3 и т. Д.), А моя переменная для объяснения у находится в градусах.
Хороший звонок. Это позволит избежать тренировочных циклов вашей модели, пытающихся обнаружить смещение при очень высоких значениях при случайной инициализации.
Таким образом, я знаю, что приходится иметь дело с более сложной интерпретацией MSE, потому что ее результат не будет в том же единстве, что и моя переменная y.
Это ортогонально. Входы не должны быть в той же единице, что и у. В DNN мы предполагаем, что мы можем создать комбинацию линейного преобразования весов (плюс нелинейные активации). Это не имеет неявного предположения о единицах.
Но для следующего шага моего исследования мне нужно сохранить результат предсказанного y (сделанного моделью MLP), и мне нужно, чтобы эти значения были в градусах. Итак, я попытался инвертировать нормализацию, но безуспешно, когда я печатаю свои результаты, прогнозируемые значения все еще находятся в нормализованном формате (см. Мой код выше). Кто-нибудь видит мою ошибку?
scaler.inverse_transform(results)
должен сделать свое дело.
Нет смысла инвертировать входы X_ и Y_. И это, вероятно, поможет вам сохранить правильность кода, чтобы не использовать одно и то же имя переменной для масштабаторов X и Y.
Также возможно воздержаться от масштабирования Y. Если вы решите это сделать, я бы посоветовал инициализировать смещение выходного слоя средним значением Ys.