Прогнозирование ежедневного баланса с использованием LSTM и ARIMA

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

У меня есть история ежедневных транзакций человека с 1.01.2022 по 24.06.2024 в csv файле. Данные разделены на обучающую (с 1.01.2022 по 25.05.2024) и тестовую (оставшиеся). Данные представлены следующим образом:

Дата Сумма дебета Сумма кредита Баланс
1/1/2022 1831 270 -1561
1/2/2022 2635 1047 -1588
1/3/2022 564 188 -376
1/4/2022 2325 1958 -367
1/5/2022 544 2122 1578
1/6/2022 2134 1839 -295
1/7/2022 2096 1624 -472
1/8/2022 3022 809 -2213
1/9/2022 1047 1075 28
1/10/2022 1242 1805 563
1/11/2022 2765 2537 -228
1/12/2022 2383 2041 -342
1/13/2022 3835 2181 -1654
…. …. ….. ….

Я использовал модель LSTM с несколькими слоями, включая слои LSTM и Dense, и модель обучена на приведенных выше данных. После обучения предсказания модели сопоставляются с фактическими значениями для визуализации производительности. Модель ARIMA используется для вычисления ошибки предсказаний LSTM. Эти оценки ошибок затем используются для корректировки предсказаний LSTM, что приводит к конечному, исправленному выходу. Я использую следующий код модели LSTM:

def LSTM(train, n: int, number_nodes, learning_rate, epochs, batch_size):
middle_data, target_data = apply_transform(train, n)

# Определяем модель
model = tf.keras.Sequential([
    tf.keras.layers.Input(shape=(n, 1)),  
    tf.keras.layers.LSTM(number_nodes),
    tf.keras.layers.Dense(units=number_nodes, activation="relu"),
    tf.keras.layers.Dense(units=number_nodes, activation="relu"),
    tf.keras.layers.Dense(1)
])

# Компилируем модель
model.compile(
    loss="mse",
    optimizer=tf.keras.optimizers.Adam(learning_rate),
    metrics=["mean_absolute_error"]
)

# Печатаем размеры и сводку модели
print(f"формат middle_data: {middle_data.shape}")
print(f"формат target_data: {target_data.shape}")
print(f"входная форма LSTM: {model.input_shape}")

# Обучаем модель
history = model.fit(
    middle_data, target_data,
    epochs=epochs,
    batch_size=batch_size,
    verbose=0
)

# Предсказываем и извлекаем результаты
full_predictions = model.predict(middle_data).flatten()

return model, history, full_predictions

Входные данные:

train: Серия pandas или массив numpy, содержащий данные временного ряда для обучения.

n=10: Целое число, определяющее количество лаговых точек данных, используемых в качестве входных данных для модели LSTM.

number_nodes=50: Количество нейронов в каждом слое LSTM и Dense нейронной сети.

learning_rate=0.001: Скорость обучения для оптимизатора во время обучения.

epochs=100: Количество эпох для обучения модели.

batch_size=32: Количество образцов на одно обновление градиента во время обучения.

def Parameter_calculation(data):
  finding = auto_arima(data,trace = True)
  plot_acf(data,lags = lag)
  address = Output_address + "ACF" +".jpg"
  plt.savefig(address)
  plot_pacf(data,lags = lag)
  address = Output_address + "PACF" +".jpg"
  plt.savefig(address)
  ord = finding.order
  return ord

def ARIMA_Model(train,len_test,ord):
  model = ARIMA(train, order = ord)
  model = model.fit()
  predictions = model.predict(start = len(train),end = len(train) + len_test ,type="levels")
  full_predictions = model.predict(start = 0,end = len(train)-1,type="levels")
  return model,predictions,full_predictions

Тем не менее, окончательное предсказание по-прежнему не очень хорошее. Есть большие отклонения между фактическими и предсказанными значениями. Для более подробной информации, проверьте этот выходной файл : вывод

Также некоторые из визуализаций:

Данные временного ряда

Обучающие и тестовые данные

Предсказания LSTM против фактических значений для обучающих данных

Предсказания LSTM против фактических значений

Ошибки предсказаний с течением времени

Метрики точности модели ARIMA

Окончательное предсказание с коррекцией ошибки

Где процесс пошел не так? Почему предсказанные результаты далеки от ожидаемых?

Этот вопрос касается рыночных прогнозов, но ответ может быть полезен и в вашем случае.

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

Прогнозирование суточного баланса с использованием моделей LSTM и ARIMA

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

Исходные данные

Вы обладаете данными о транзакциях с 1 января 2022 года по 24 июня 2024 года, которые разделены на обучающую и тестовую выборки. Данные включают даты, суммы дебета, кредита и, соответственно, баланс. Это временной ряд, который можно использовать для анализа и прогнозирования.

Обзор моделей

  1. LSTM (Long Short-Term Memory):

    • LSTM является методом глубокого обучения, подходящим для работы с временными рядами благодаря своей способности запоминать долгосрочные зависимости.
    • Вы используете многослойную архитектуру, включающую слои LSTM и Dense.
    • В вашем коде реализована функция подготовки данных, что обеспечивает использование задержек в 10 периодов в качестве входных данных для LSTM.
    def LSTM(train, n: int, number_nodes, learning_rate, epochs, batch_size): 
        middle_data, target_data = apply_transform(train, n) 
        model = tf.keras.Sequential([ 
            tf.keras.layers.Input(shape=(n, 1)),  
            tf.keras.layers.LSTM(number_nodes), 
            tf.keras.layers.Dense(units=number_nodes, activation="relu"), 
            tf.keras.layers.Dense(units=number_nodes, activation="relu"), 
            tf.keras.layers.Dense(1) 
        ]) 
        model.compile(loss="mse", optimizer=tf.keras.optimizers.Adam(learning_rate), metrics=["mean_absolute_error"]) 
        model.fit(middle_data, target_data, epochs=epochs, batch_size=batch_size, verbose=0) 
  2. ARIMA (Autoregressive Integrated Moving Average):

    • ARIMA — это классическая статистическая модель, подходящая для анализа временных рядов, основанная на идентификации автокорреляций и использовании сглаживания для корректировки трендов.
    • Вы применяете ARIMA для оценки ошибок предсказаний LSTM и корректировки финальных прогнозов.
    def ARIMA_Model(train, len_test, ord): 
        model = ARIMA(train, order=ord) 
        model = model.fit() 
        predictions = model.predict(start=len(train), end=len(train) + len_test, type="levels") 
        return model, predictions 

Причины низкой точности предсказаний

Несмотря на использование сложных моделей, ваши предсказания могут не совпадать с фактическими значениями по нескольким причинам:

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

  2. Выбор параметров: Параметры для LSTM, такие как количество узлов и количество эпох, могут быть подобраны не оптимально. Возможно, стоит провести оптимизацию гиперпараметров.

  3. Качество данных: На исходный ряд могут влиять выбросы или ошибки. Аномальные значения в дебетах или кредитах могут сильно исказить результат. Проверьте данные на наличие аномалий, пропусков и несоответствий.

  4. Неправильная структура модели: Возможно, архитектура LSTM не подходит для ваших данных. Применение более сложных архитектур, таких как две последовательные LSTM, может улучшить результат.

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

  6. Неправильная коррекция ошибок: Использование моделей ARIMA для коррекции выходов LSTM может также оказаться неэффективным, особенно если ошибка не является стационарной.

Рекомендации по улучшению

  1. Сбор больше данных: Расширение функциональности набора данных с новыми аспектами, такими как категории транзакций или применение специальных меток.

  2. Анализ оставшихся ошибок: Определите закономерности в ошибках предсказания — это может указать на область улучшения.

  3. Оптимизация параметров: Используйте методы оптимизации, такие как Grid Search или Random Search, для поиска наилучших гиперпараметров для LSTM.

  4. Использование дополнительных методов: Попробуйте другие алгоритмы машинного обучения для сопоставления результатов с LSTM, например, модели общего регрессора или дополненные методы Learn-Transfer Learning.

  5. Улучшение обработки данных: Подумайте о методу предобработки данных, чтобы уменьшить воздействие выбросов.

Заключение

Сочетание моделей LSTM и ARIMA требует тщательной настройки и анализа данных. Определение причин низкой производительности предсказаний и применение стратегий по их улучшению может значительно увеличить точность прогнозов. Уделите внимание исследованию и настройке моделей, и вы сможете улучшить своё прогнозирование баланса на основе доступных данных.

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

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