Вопрос или проблема
Я в первый раз создаю модель прогнозирования TFT с использованием PyTorch и испытываю трудности с извлечением предсказанных значений вместе с их соответствующими фактическими значениями из вывода.
В идеале, я бы хотел получить dataframe, индексированный по дате, с колонками: фактическое значение, предсказанное значение и ряд.
Любые советы были бы крайне признательны!
Спасибо!
Вот настройка моей модели:
# Настройка TimeSeriesDataSet для PyTorch Forecasting
train['Date']= train.index
# Преобразование Date в datetime
train['Date'] = pd.to_datetime(train['Date'])
train['time_idx'] = train.groupby('Series')['Date'].rank(method='dense').astype(int)
validation['Date']= validation.index
# Преобразование Date в datetime
validation['Date'] = pd.to_datetime(validation['Date'])
validation['time_idx'] = validation.groupby('Series')['Date'].rank(method='dense').astype(int)
# Преобразование Date в datetime для тестового набора
test['Date']= test.index
test['Date'] = pd.to_datetime(test['Date'])
test['time_idx'] = test.groupby('Series')['Date'].rank(method='dense').astype(int)
train= train.drop(columns=['Date'])
validation= validation.drop(columns=['Date'])
test= test.drop(columns=['Date'])
max_encoder_length = 30 # Количество временных шагов в прошлом
max_prediction_length = 2 # Количество шагов для предсказания
training = TimeSeriesDataSet(
train,
time_idx="time_idx",
target="y",
group_ids=["Series"],
static_categoricals=["Market", "Length", "Grade_Type", "Width", "Height"],
time_varying_known_categoricals=[],
time_varying_known_reals= time_varying+ ['time_idx'],
time_varying_unknown_reals=["y"],
max_encoder_length=max_encoder_length,
max_prediction_length=max_prediction_length,
allow_missing_timesteps=True,
target_normalizer=None,
add_relative_time_idx=True, # Добавить относительный временной индекс
add_encoder_length=True, # Добавить длину кодировщика
)
# Настройка TimeSeriesDataSet для тестового набора (та же структура)
test_data = TimeSeriesDataSet.from_dataset(training, test, predict=True)
validation_data = TimeSeriesDataSet.from_dataset(training, validation, predict=True)
# Создание DataLoader для пакетной обработки
from torch.utils.data import DataLoader
batch_size = 64 # Настроить в соответствии с возможностями вашей системы
train_dataloader = training.to_dataloader(train=True, batch_size=batch_size, num_workers=0)
validation_dataloader = validation_data.to_dataloader(train=False, batch_size=batch_size, num_workers=0)
test_dataloader = test_data.to_dataloader(train=False, batch_size=batch_size, num_workers=0)
train_dataloader
# === 🟢 Шаг 1: Улучшенная модель ===
tft = TemporalFusionTransformer.from_dataset(
training,
learning_rate=1e-3,
hidden_size=64,
attention_head_size=15,
dropout=0.18,
hidden_continuous_size=32,
output_size=1,
loss=MAE(),
log_interval=10,
reduce_on_plateau_patience=2,
)
# === 🟢 Шаг 2: Обратные вызовы ===
early_stop_callback = EarlyStopping(monitor="val_loss", patience=5, mode="min", verbose=True)
lr_monitor = LearningRateMonitor(logging_interval="epoch")
# === 🟢 Шаг 3: Тренер ===
trainer = pl.Trainer(
max_epochs=20,
accelerator="auto",
gradient_clip_val=0.5,
callbacks=[early_stop_callback, lr_monitor],
enable_progress_bar=True,
)
# === 🟢 Шаг 4: Обучение модели ===
trainer.fit(tft, train_dataloaders=train_dataloader, val_dataloaders=validation_dataloader)
predictions = tft.predict(test_dataloader, return_y=True)```
Ответ или решение
Чтобы решить проблему извлечения предсказанных значений и значений цели из модели Temporal Fusion Transformer (TFT), важно разобраться в концепциях и инструментах, которые используются в данном процессе. В частности, понимание работы с PyTorch и PyTorch Forecasting, а также базовых принципов временных рядов и их прогнозирования, помогут решить вашу задачу.
Теория
Temporal Fusion Transformer – это модель глубокого обучения, разработанная для работы с временными рядами. Она может учитывать как статические, так и временные характеристики данных, используя сложные механизмы внимания, которые позволяют ей справляться с нелинейностями и сложными зависимостями данных. Основные этапы работы с TFT включают подготовку данных, создание набора данных временных рядов, обучение и валидация модели, а также извлечение предсказаний.
Для работы с временными рядами используются объекты TimeSeriesDataSet
из библиотеки PyTorch Forecasting. Этот объект формирует обновленный набор данных, который поддерживает все необходимые функции для обучения моделей, включая кодирование временных характеристик и целей.
Пример
В приведенном вами коде, вы уже создали наборы данных для обучения и тестирования, используя TimeSeriesDataSet
. Настроили модель, используя TemporalFusionTransformer
и создали объекты DataLoader
для загрузки данных пакетами. Теперь нужно сделать следующую ключевую задачу – извлечение предсказанных и фактических значений и формирование из них удобного для анализа DataFrame.
Применение
-
Извлечение предсказаний и фактических значений:
В конце вашего процесса вы используете функцию
predict
для получения предсказаний:predictions = tft.predict(test_dataloader, return_y=True)
Параметр
return_y=True
указывает, что нужно возвращать и фактическое значение, и предсказанное.predictions
– это объект, который содержит в себе структуру, включающую и предсказания, и фактические значения. Вам необходимо будет развернуть этот объект для извлечения необходимых данных. -
Формирование DataFrame:
Вы можете организовать извлечение данных и их последующую компоновку в DataFrame следующим образом:
import pandas as pd # Для большинства интерфейсов PyTorch предсказания возвращаются в формате Tensor y_pred, y_true = predictions y_pred = y_pred.numpy() # Конвертируйте Tensor в numpy для удобной работы с DataFrame y_true = y_true.numpy() # Теперь вы можете создать DataFrame results = pd.DataFrame({ "actual_value": y_true.flatten(), "predicted_value": y_pred.flatten(), "Series": test_data.data['Series'], # предположим, что Series был сохранен в данных "Date": test_data.data['date'], # предположим, что Date был сохранен в данных }) # Назначаем индексы на основе даты results.set_index("Date", inplace=True) print(results.head()) # Просмотр результата
Убедитесь, что колонки
Series
иDate
сохранены в данных, которые вы вводите в модель. Это может потребовать сохранения дополнительных метаданных, таких как идентификационные номера временных шагов. -
Настройка DataLoader:
Будьте внимательны к настройкам DataLoader, например, параметры, такие как
shuffle
илиdrop_last
, могут повлиять на соответствие индексов и порядок данных. Для тестовых данных выберитеshuffle=False
для сохранения исходного порядка данных. -
Визуализация и анализ:
После того как вы получили DataFrame, вы можете использовать функции библиотеки pandas и matplotlib для визуализации и анализа предсказанных и фактических значений. Это поможет лучше понимать производительность модели и области возможного улучшения.
Внимательный подход к каждому элементу данного процесса позволит вам эффективно извлечь нужные параметры и упростить анализ предсказаний вашей модели. Успехов в вашем проекте!