LSTM генерирует прямую линию для предсказаний вне диапазона данных.

Вопрос или проблема

У меня есть такая проблема: Я пытаюсь предсказать ежедневные температуры. У меня есть данные за 30 лет, и я использую эту нейронную сеть:

model = Sequential()
model.add(LSTM(units=128,activation="relu", input_shape=(30, 1), 
return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(units=128, 
activation="relu",return_sequences=True))
model.add(TimeDistributed(Dense(64, activation="relu")))
model.add(Dropout(0.2))
model.add(TimeDistributed(Dense(1)))
model.compile(loss="mean_squared_error", 
optimizer=Adam(learning_rate=lr),metrics=['mse', 'mae', 'mape'])

Я использую скользящие окна, чтобы создать матрицу для подачи в мою LSTM

step=30
batch_size=16
epochs=500

Модель идеально адаптируется к обучающему и тестовому набору данных. Но когда я делаю предсказания для данных за пределами этих наборов, выводится только прямая линия:

def autoregressive_prediction(model, initial_sequence, 
future_steps):
    predictions = []
    input_seq = initial_sequence

    for _ in range(future_steps):
        pred = model.predict(input_seq[np.newaxis, :, :])  
        predictions.append(pred[0, 0])  
        input_seq = np.roll(input_seq, -1, axis=0)  
        input_seq[-1] = pred[0]  

return np.array(predictions)

num_predictions = 500 

future_predictions = predict_future(model_LSTM_optimo, test, step, 
num_predictions)

future_predictions = future_predictions.reshape(-1,1)

if predicted.ndim == 1:
 predicted = predicted.reshape(-1, 1)

full_predictions = np.concatenate((predicted, future_predictions))

extended_index = np.arange(len(predicted) + len(future_predictions))

plt.figure(figsize=(15, 5))
plt.title("Максимальная температура в Ла-Пасе - Вино Тинто (°C)", fontsize=18)
plt.plot(index, df_limpio['Temperatura Máxima'], c="blue")
plt.plot(extended_index, full_predictions, c="orange", alpha=0.75)
plt.legend(['Фактические данные', 'Прогноз'], fontsize=15)
plt.axvline(x=tp, c="r")
plt.grid(True)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.ylim(-0.1, 1.5)
plt.show()

вставьте описание изображения здесь

Я пробовал изменять шаги, эпохи, добавлять слои, данные с обучением с учителем, и изменений было мало:

вставьте описание изображения здесь

Синий график – это реальные данные, желтый – предсказанные. Прямая линия в красном прямоугольнике – прогнозы, сделанные для данных вне набора данных.

Ответ или решение

Когда вы сталкиваетесь с проблемой, когда LSTM (долгосрочная краткосрочная память) генерирует прямую линию для предсказаний данных за пределами тренировочного набора, существует несколько факторов, которые стоит рассмотреть.

1. Обучение модели

Вы отметили, что ваша модель идеально подстраивается под обучающий набор данных. Это может указывать на явление переобучения, когда модель слишком точно запоминает данные, что затрудняет обобщение на новых наблюдениях. Переобучение может происходить, если:

  • Модель имеет слишком много параметров по сравнению с количеством доступных данных.
  • Данные имеют шум, который модель не может обрабатывать.

2. Аппаратное и программное окружение

Подход, который вы используете для генерации предсказаний — это автогрессивное предсказание, где вы каждый раз обновляете входную последовательность, используя последнее предсказание. Однако, если предсказания (особенно ранние) будут неверными, это может сразу же повлиять на все последующие.

3. Структура сети

Ваше определение сети выглядит разумно, однако есть несколько моментов, которые стоит обсудить:

  • Выбор функции активации: Функция активации "relu" может не всегда быть лучшим выбором для LSTM, потому что из-за свойства "затухающего градиента" нейроны могут не аксолироваться с малым значением входа. Попробуйте использовать "tanh", которая обычно более стабильна для рекуррентных сетей.

  • Количество эпох и шагов: Вероятно, количество эпох высоко, и стоит добавить проверку на валидационном наборе данных, чтобы установить, когда модель начинает переобучаться. Если, например, в ходе обучения ошибка на валидационном наборе начинает возрастать, возможно, стоит остановить обучение.

4. Нормализация данных

В процессе обучения и предсказания важно, чтобы данные были на одинаковом масштабе. Убедитесь, что вы используете одинаковую нормализацию (например, MinMaxScaler или StandardScaler) как для обучающего, так и для тестового наборов данных.

5. Предсказания на будущие значения

Ваш код для предсказаний также вызывает некоторые вопросы:

input_seq = initial_sequence

Убедитесь, что initial_sequence точно отражает восточную временную последовательность и правильно отформатирована для LSTM. Неверные входные данные могут привести к неверным предсказаниям.

Кроме того, используйте различные начальные точки и запустите модель несколько раз с разными условиями, чтобы исследовать, как изменяются предсказания.

6. Разнообразие данных

Если ваши данные имеют ограниченный диапазон температур, модель может "заучивать" основные паттерны и создавать предсказания в виде прямой линии, когда новые данные выходят за пределы этого диапазона. Убедитесь, что ваши данные достаточно разнообразны и покрывают все возможные диапазоны значений.

В целом

Рассмотрев вышеизложенные аспекты, вы сможете более детально анализировать, почему LSTM генерирует прямую линию при предсказаниях за пределами известных диапазонов данных. Настройка вашей модели, обновление функции активации, борьба с переобучением и обеспечение адекватного объема данных — ключевые шаги для улучшения ваших результативных предсказаний.

Оцените материал
Добавить комментарий

Капча загружается...