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

Python中Darts库未来协变量报错求助:预测时间范围不匹配

Darts TFT模型小时级预测时Future Covariates长度不足的解决方案

我的代码

mydata_train = X_train.copy()
mydata_train['y_train'] = y_train

mydata_test = X_test.copy()
mydata_test['y_test'] = y_test

# Convert your DataFrame to TimeSeries objects for the target variable and covariates
train_series = TimeSeries.from_dataframe(mydata_train, value_cols=['y_train'], fill_missing_dates=True, freq='h')
test_series = TimeSeries.from_dataframe(mydata_test, value_cols=['y_test'], fill_missing_dates=True, freq='h')

train_covariates = TimeSeries.from_dataframe(mydata_train, value_cols=[col for col in mydata_train.columns if col != 'y_train'], fill_missing_dates=True, freq='h')
test_covariates = TimeSeries.from_dataframe(mydata_test, value_cols=[col for col in mydata_test.columns if col != 'y_test'], fill_missing_dates=True, freq='h')

# Initialize the TFT model
model = TFTModel(
    input_chunk_length=24,
    output_chunk_length=12,
    hidden_size=16,  # Example size, adjust based on dataset size and complexity
    lstm_layers=2,  # Number of LSTM layers
    num_attention_heads=4,  # Number of attention heads
    dropout=0.1,  # Dropout rate
    batch_size=16,  # Batch size for training
    n_epochs=1,  # Number of epochs to train
    add_relative_index=False,  # Whether to add a relative index as a feature
    add_encoders=None,  # Additional encoder settings can be specified here
    likelihood=None,  # Can specify a likelihood for probabilistic forecasting
    random_state=42  # Seed for reproducibility
)

# Fit the model
model.fit(series=train_series, past_covariates=None, future_covariates=train_covariates, verbose=True)

# Predict using the model and future covariates
# n = 160 #len(mydata_test)  # Set the forecast horizon
predicted = model.predict(n=12, series=test_series, future_covariates=test_covariates)

报错信息

ValueError: For the given forecasting horizon <code>n=12</code>, the provided future covariates at dataset index <code>0</code> do not extend far enough into the future. As <code>n <= output_chunk_length</code> the future covariates must end at time step <code>2022-10-01 16:00:00</code>, whereas now they end at time step <code>2022-10-01 04:00:00</code>

问题分析

报错核心原因:调用model.predict(n=12, series=test_series, future_covariates=test_covariates)时,模型会基于test_series的最后一个时间点向后预测12小时(n=12步),因此要求future_covariates必须覆盖从test_series结束时间开始的全部12个小时的协变量数据。

你的test_covariates由mydata_test转换而来,而mydata_test的最后时间戳仅到2022-10-01 04:00:00,缺少后续12小时(至16:00)的协变量数据,因此触发报错。

解决方案

1. 扩展未来协变量的时间范围

确保协变量数据集(X_test)包含从test_series结束时间往后12小时的所有时间步数据。如果是时间特征(如小时、星期几)可直接生成;如果是外部协变量,需补充对应时间段的数据。

示例代码:

import pandas as pd

# 获取测试序列的结束时间
test_end = test_series.end_time()
# 计算需要的协变量结束时间:结束时间 + 12小时
required_end = test_end + pd.Timedelta(hours=12)

# 生成扩展的时间索引
extended_time_index = pd.date_range(start=mydata_test.index[0], end=required_end, freq='h')
# 重新构建带有扩展时间的协变量DataFrame
extended_X_test = X_test.reindex(extended_time_index)
# 填充缺失值(时间特征可用ffill,外部协变量按需处理)
extended_X_test = extended_X_test.ffill()

# 转换为Darts TimeSeries
extended_test_covariates = TimeSeries.from_dataframe(extended_X_test, fill_missing_dates=True, freq='h')

2. 使用historical_forecasts进行滚动预测(若需求是对测试序列每个点预测未来12小时)

如果你的需求不是从测试序列末尾一次性预测12小时,而是对测试序列中每个时间点滚动预测未来12小时,可使用historical_forecasts方法,此时仅需test_covariates覆盖到测试序列结束时间即可:

predicted = model.historical_forecasts(
    series=test_series,
    future_covariates=test_covariates,
    forecast_horizon=12,
    stride=1,
    verbose=True
)

3. 验证协变量时间范围

调整后可通过以下代码验证协变量时间范围是否符合要求:

print("Test series end time:", test_series.end_time())
print("Extended covariates end time:", extended_test_covariates.end_time())

关键注意点

  • Darts的predict方法中,series参数用于提供模型预测的历史输入,预测会从该序列最后一个时间点向后推进n步,因此未来协变量必须覆盖这段预测区间。
  • 若output_chunk_length≥n,模型会一次性生成n步预测,协变量需覆盖完整n步区间;若n>output_chunk_length,模型会分多次生成预测,每次需要对应时间段的协变量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 06:43:13