Darts库TFT模型训练缺失协变量错误排查求助
问题修正方案
核心错误原因
- 训练阶段错误传入future_covariates:TFT模型训练时仅需
past_covariates,future_covariates是预测阶段才需要的参数,训练时传入会导致协变量时间范围不匹配。 - 预测调用参数错误:
model.predict(test_data_scaled)的用法不符合要求,需要明确预测长度,同时提供覆盖输入块(input_chunk_length)和预测块(output_chunk_length)的完整协变量。 - 协变量时间范围不完整:模型需要协变量覆盖从训练序列末尾向前
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
相关产品推荐
相关产品推荐

