Вопрос или проблема
У меня есть история ежедневных транзакций человека с 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 и ARIMA
Ваша задача по прогнозированию ежедневного баланса на основании исторических данных транзакций представляет собой интересный и сложный проект, сочетающий в себе методы глубокого обучения и классической статистики. Рассмотрим подходы, которые были использованы, и причины, по которым предсказания могут оказаться неудачными, а также предложим рекомендации по улучшению.
Исходные данные
Вы обладаете данными о транзакциях с 1 января 2022 года по 24 июня 2024 года, которые разделены на обучающую и тестовую выборки. Данные включают даты, суммы дебета, кредита и, соответственно, баланс. Это временной ряд, который можно использовать для анализа и прогнозирования.
Обзор моделей
-
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)
-
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
Причины низкой точности предсказаний
Несмотря на использование сложных моделей, ваши предсказания могут не совпадать с фактическими значениями по нескольким причинам:
-
Недостаток данных: Возможно, данные недостаточно разнообразны или имеют черты, которые не учитываются при подготовке и обучении моделей. Например, сезонные эффекты могут не учитываться.
-
Выбор параметров: Параметры для LSTM, такие как количество узлов и количество эпох, могут быть подобраны не оптимально. Возможно, стоит провести оптимизацию гиперпараметров.
-
Качество данных: На исходный ряд могут влиять выбросы или ошибки. Аномальные значения в дебетах или кредитах могут сильно исказить результат. Проверьте данные на наличие аномалий, пропусков и несоответствий.
-
Неправильная структура модели: Возможно, архитектура LSTM не подходит для ваших данных. Применение более сложных архитектур, таких как две последовательные LSTM, может улучшить результат.
-
Переобучение: Модель может быть переобучена на обучающих данных, что делает её менее способной к обобщению на тестовые данные. Регуляризация и уменьшение структуры сети могут помочь.
-
Неправильная коррекция ошибок: Использование моделей ARIMA для коррекции выходов LSTM может также оказаться неэффективным, особенно если ошибка не является стационарной.
Рекомендации по улучшению
-
Сбор больше данных: Расширение функциональности набора данных с новыми аспектами, такими как категории транзакций или применение специальных меток.
-
Анализ оставшихся ошибок: Определите закономерности в ошибках предсказания — это может указать на область улучшения.
-
Оптимизация параметров: Используйте методы оптимизации, такие как Grid Search или Random Search, для поиска наилучших гиперпараметров для LSTM.
-
Использование дополнительных методов: Попробуйте другие алгоритмы машинного обучения для сопоставления результатов с LSTM, например, модели общего регрессора или дополненные методы Learn-Transfer Learning.
-
Улучшение обработки данных: Подумайте о методу предобработки данных, чтобы уменьшить воздействие выбросов.
Заключение
Сочетание моделей LSTM и ARIMA требует тщательной настройки и анализа данных. Определение причин низкой производительности предсказаний и применение стратегий по их улучшению может значительно увеличить точность прогнозов. Уделите внимание исследованию и настройке моделей, и вы сможете улучшить своё прогнозирование баланса на основе доступных данных.