You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Darts库TFT模型训练缺失协变量错误排查求助

问题修正方案

核心错误原因

  1. 训练阶段错误传入future_covariates:TFT模型训练时仅需past_covariates,future_covariates是预测阶段才需要的参数,训练时传入会导致协变量时间范围不匹配。
  2. 预测调用参数错误:model.predict(test_data_scaled)的用法不符合要求,需要明确预测长度,同时提供覆盖输入块(input_chunk_length)和预测块(output_chunk_length)的完整协变量。
  3. 协变量时间范围不完整:模型需要协变量覆盖从训练序列末尾向前input_chunk_length的时间段(用于输入),以及预测时间段(用于未来协变量),原代码中协变量拆分后没有覆盖这个完整范围。

修正后的代码

import numpy as np
import pandas as pd
from datetime import timedelta
from tqdm import tqdm_notebook as tqdm

import matplotlib.pyplot as plt

from darts import TimeSeries, concatenate
from darts.dataprocessing.transformers import Scaler
from darts.models import TFTModel
from darts.metrics import mape
from darts.utils.statistics import check_seasonality, plot_acf
from darts.utils.timeseries_generation import datetime_attribute_timeseries
from darts.utils.likelihood_models import QuantileRegression

f_columns = ['Year', 'Month', 'Week', 'DayOfMonth', 'DayOfWeek', 'WeekOfMonth', 'Season', 'Holidays', 'Weekend']
QUANTILES = [0.01, 0.05, 0.1, 0.2, 0.25, 0.5, 0.75, 0.8, 0.9, 0.95, 0.99]
ICL = 60
OCL = 15

# 加载数据并拆分
time_series = TimeSeries.from_dataframe(data, time_col='CreateDate', value_cols=f_columns + ['Count'], freq='D')
train, test = time_series.split_after(SPLIT)

# 标准化处理
scaler = Scaler()
train_scaled = scaler.fit_transform(train)
test_scaled = scaler.transform(test)

# 提取目标序列和协变量序列
train_target = train_scaled['Count']
train_covariates = train_scaled[f_columns]
# 合并训练+测试的协变量,确保预测时有完整的时间范围
full_covariates_scaled = concatenate([train_covariates, test_scaled[f_columns]])

# 初始化模型
model = TFTModel(
    input_chunk_length=ICL,
    output_chunk_length=OCL,
    hidden_size=16,
    lstm_layers=2,
    num_attention_heads=1,
    dropout=0.1,
    batch_size=16,
    n_epochs=2,
    likelihood=QuantileRegression(quantiles=QUANTILES),
)

# 训练模型:仅传入目标序列和训练阶段的past_covariates
model.fit(
    series=train_target,
    past_covariates=train_covariates,
    verbose=True
)

# 预测:传入覆盖输入块+预测块的协变量
test_target = test_scaled['Count']
preds_scaled = model.predict(
    n=len(test_target),
    past_covariates=full_covariates_scaled,
    future_covariates=full_covariates_scaled
)

# 反标准化得到真实尺度的预测结果
preds = scaler.inverse_transform(preds_scaled)

关键修正点说明

  • 训练阶段:移除future_covariates参数,仅使用训练数据的协变量作为past_covariates。
  • 协变量准备:合并训练和测试的协变量为full_covariates_scaled,确保它覆盖从训练开始到测试结束的所有时间,这样模型在预测时可以获取到输入块(训练末尾的60天)和预测块(所有测试天数)的协变量数据。
  • 预测调用:使用n=len(test_target)指定预测长度,同时传入full_covariates_scaled作为past_covariates和future_covariates——TFT会自动根据所需的时间范围从完整协变量序列中提取对应部分。

内容的提问来源于stack exchange,提问作者Mnifldz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 20:27:42