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
相关产品推荐
相关产品推荐

