Сложности при извлечении предсказанных и целевых значений из модели TFT (pytorch)

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

Я в первый раз создаю модель прогнозирования 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.

Применение

  1. Извлечение предсказаний и фактических значений:

    В конце вашего процесса вы используете функцию predict для получения предсказаний:

    predictions = tft.predict(test_dataloader, return_y=True)

    Параметр return_y=True указывает, что нужно возвращать и фактическое значение, и предсказанное.

    predictions – это объект, который содержит в себе структуру, включающую и предсказания, и фактические значения. Вам необходимо будет развернуть этот объект для извлечения необходимых данных.

  2. Формирование 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 сохранены в данных, которые вы вводите в модель. Это может потребовать сохранения дополнительных метаданных, таких как идентификационные номера временных шагов.

  3. Настройка DataLoader:

    Будьте внимательны к настройкам DataLoader, например, параметры, такие как shuffle или drop_last, могут повлиять на соответствие индексов и порядок данных. Для тестовых данных выберите shuffle=False для сохранения исходного порядка данных.

  4. Визуализация и анализ:

    После того как вы получили DataFrame, вы можете использовать функции библиотеки pandas и matplotlib для визуализации и анализа предсказанных и фактических значений. Это поможет лучше понимать производительность модели и области возможного улучшения.

Внимательный подход к каждому элементу данного процесса позволит вам эффективно извлечь нужные параметры и упростить анализ предсказаний вашей модели. Успехов в вашем проекте!

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

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