Вопрос или проблема
Я создал LSTM для прогнозирования акций, и он прогнозирует только на 1 день, но я хочу прогнозировать диапазон.
def make_new_model(self):
# простой начальный модель
# строит модель lstm
########################
neural_network = keras.Sequential()
neural_network.add(layers.LSTM(units = 50, return_sequences = True, input_shape = (self.days_to_train_on, 5)))
neural_network.add(layers.LSTM(units = 50))
neural_network.add(layers.Dense(units = 1))
neural_network.compile(optimizer="adam", loss="mean_squared_error")
neural_network.summary()
return neural_network
Моя входная форма (2500, 10, 5). Я хочу, чтобы выводом было (2500, 1, 14)
Например: взять 5 столбцов данных за последние 10 дней (всего 2500 таких образцов)
и вывести предсказание для 1 столбца на следующие 14 дней (сплющенный 1d массив из 14 значений) x (2500 таких предсказаний)
Какие параметры или формы ввода должны иметь мои входные данные / модель, чтобы достичь этой цели?
Сейчас кажется, что модель прогнозирует 2500 x 1 x 1. Как я могу сделать так, чтобы она прогнозировала 14 значений?
Ответ или решение
Ваш вопрос касается настройки модели LSTM для предсказания акций с использованием временных рядов. Давайте рассмотрим, почему ваша модель предсказывает только один день и как изменить архитектуру, чтобы она могла прогнозировать на более длительный период, например, на 14 дней.
Понимание проблемы
На данный момент ваша модель настроена на вывод одной величины. Это объясняется тем, что последняя плотная (Dense) слой модели имеет только один выходной нейрон (units = 1
), в результате чего модель возвращает прогноз одного значения для каждой входной последовательности данных.
Причины, по которым модель предсказывает только один день
- Форма выходных данных: Чтобы ваша модель предсказывала 14 дней, выходной слой должен иметь 14 нейронов, каждый из которых будет представлять собой предсказание для одного дня.
- Архитектура LSTM: Модель должна быть спроектирована так, чтобы учитывать выходные последовательности. На данный момент ваша модель настроена на возвращение только одного значения.
Рекомендации по изменению архитектуры
Чтобы изменить вашу модель так, чтобы она возвращала 14 значений, вам нужно сделать несколько модификаций:
-
Настройка последнего слоя:
Измените количество единиц в последнем плотном слое с 1 на 14:neural_network.add(layers.Dense(units=14))
-
Параметры возвращаемых последовательностей:
Если вы хотите, чтобы ваша LSTM возвращала последовательности, а не одно значение, вам нужно будет настроить параметрыreturn_sequences
. Так как вам нужно предсказание на 14 дней, целесообразно добавить еще один уровень LSTM:neural_network.add(layers.LSTM(units=50, return_sequences=True))
-
Формирование входных данных:
Вам необходимо убедиться, что выходные данные вашего датасета имеют формат (партия, 14, 1), где 14 — это количество дней, которое вы собираетесь предсказать. Это можно сделать с помощью переключения формы данных после извлечения последовательностей:y_train = y_train.reshape((2500, 14)) # предполагая, что y_train содержит ваши данные
Итоговая модель
Вот как ваш финальный код для модели может выглядеть:
def make_new_model(self):
neural_network = keras.Sequential()
neural_network.add(layers.LSTM(units=50, return_sequences=True, input_shape=(self.days_to_train_on, 5)))
neural_network.add(layers.LSTM(units=50, return_sequences=True))
neural_network.add(layers.LSTM(units=50)) # добавлен для обработки временной последовательности
neural_network.add(layers.Dense(units=14)) # изменено на 14 для предсказания на 14 дней
neural_network.compile(optimizer="adam", loss="mean_squared_error")
neural_network.summary()
return neural_network
Заключение
С помощью вышеуказанных изменений ваша модель будет способна возвращать предсказания по 14 дням, вместо 1. Помните, что также важно правильно подготовить свои данные для обучения, чтобы соответствовать новым параметрам входных и выходных данных. Убедитесь, что ваши функции потерь и оптимизаторы соответствуют вашим целям прогнозирования, чтобы достичь наилучших результатов в предсказаниях.