Вопрос или проблема
У меня есть набор данных, в котором есть несколько записей для одних и тех же временных меток, и я хочу использовать LSTM для прогнозирования следующей временной метки, основываясь на предыдущих 5 временных шагах. Из https://machinelearningmastery.com/multivariate-time-series-forecasting-lstms-keras/ я понял, как работать с многофакторными временными рядами, и в блоге он изменил форму временного ряда таким образом, чтобы мы могли прогнозировать следующий шаг на основе предыдущих временных шагов. Но в моем случае есть несколько записей для одного и того же временного шага, и когда я делаю изменение формы, это создает неправильные отношения, так как предполагается, что время является последовательным, но на самом деле это один и тот же временной шаг. В этом сценарии как мне следует структурировать мои данные для обучения?
Данные представляют собой набор данных COVID с заголовком ниже:
Точная_Дата_Эпизода, Возрастная_Группа, Пол_Клиента, Информация_О_Приобретении_Случая, Город_Отчета_PHU, Связанный_Спалах, Результат1
2020-03-30, 70 лет, МУЖ. , OB, Стратфорд, Да, Фатально
У меня такая же проблема, но с другими данными, вы нашли решение?
Ответ или решение
Решение проблемы с использованием LSTM для прогнозирования с учетом нескольких записей на один временной штамп
При работе с временными рядами и использованием рекуррентных нейронных сетей, таких как LSTM (Long Short-Term Memory), важно корректно структурировать входные данные. В вашем случае, когда наблюдаются несколько записей для одного временного штампа, обычные методы подготовки данных могут привести к неправильному восприятию модели зависимости временных рядов, поскольку они предполагают хронологическую последовательность.
1. Понимание структуры данных
Ваш набор данных включает в себя несколько важнейших полей:
- Accurate_Episode_Date: Временной штамп
- Age_Group: Возрастная группа
- Client_Gender: Пол клиента
- Case_AcquisitionInfo: Информация о получении случая
- Reporting_PHU_City: Город отчета
- Outbreak_Related: Отношение к вспышке
- Outcome1: Исход
Наличие нескольких записей на один и тот же временной штамп может обосновать использование агрегированных функций, поскольку они представляют собой многомерные данные, которые вы хотите использовать для прогнозирования.
2. Агрегация данных
Если у вас есть несколько записей для одного временного штампа, вам необходимо рассмотреть возможность агрегирования данных. Агрегация может осуществляться через:
- Среднее: Например, средний возраст группы клиентов.
- Сумму: Суммирование случаев, относящихся к одной категории.
- Моду или медиану: Для нахождения наиболее частых или центральных значений.
Используйте группировки по временным отметкам, чтобы консолидировать данные. Например:
import pandas as pd
# Чтение данных
data = pd.read_csv('your_data.csv')
# Пример агрегации: получение среднего возраста по дате для каждой категории
aggregated_data = data.groupby(['Accurate_Episode_Date']).agg({
'Age_Group': 'mean', # Здесь требуется преобразование к числовому значению
'Client_Gender': pd.Series.mode,
'Case_AcquisitionInfo': 'count', # Количество случаев
# Добавьте необходимые меры для других полей
}).reset_index()
3. Формирование выборки для LSTM
После выполнения агрегации данных вы можете перейти к формированию входных данных для LSTM. Вам нужно создать последовательности (наборы) временных рядов, используя функцию TimeseriesGenerator
. Пример:
import numpy as np
from keras.preprocessing.sequence import TimeseriesGenerator
# Предположим, что 'aggregated_data' содержат нужные столбцы
# Преобразование данных для LSTM
data_values = aggregated_data['Target'].values # 'Target' - переменная, которую вы хотите прогнозировать
data_values = data_values.reshape(-1, 1)
# Создание генератора временных рядов
n_input = 5 # 5 предыдущих временных этапов
generator = TimeseriesGenerator(data_values, data_values, length=n_input, batch_size=1)
4. Обучение модели LSTM
Следующим шагом будет создание и обучение модели LSTM. Вот пример простейшей архитектуры:
from keras.models import Sequential
from keras.layers import LSTM, Dense
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(n_input, 1)))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
# Обучение модели
model.fit(generator, epochs=50)
Заключение
Корректная агрегация и подготовка данных являются критически важными для эффективного использования LSTM. Внимание к нюансам структуры данных может существенно повлиять на результаты прогнозирования. Подходите к процессу осознанно, рассматривая данные в контексте их временной взаимосвязи. Если вам потребуется более подробная информация или практика, не стесняйтесь задавать дополнительные вопросы.