带1个外生变量的单变量预测:未按指定日期生成预测结果
以下是导致预测未使用future_exog_df中指定日期的常见原因及对应解决方案:
1. 外生变量数据集的日期索引格式不匹配
PyCaret的时间序列模块要求数据集的索引必须是DatetimeIndex,且频率与训练数据完全一致(此处为月度)。如果future_exog_df的日期是普通字符串、未设置为索引,或是DatetimeIndex但频率不匹配,PyCaret会自动生成基于训练数据末尾的连续日期,而非使用你指定的日期。
解决方法:将future_exog_df的日期列转换为DatetimeIndex,并设置正确的月度频率:
import pandas as pd # 假设日期列名为'date' future_exog_df['date'] = pd.to_datetime(future_exog_df['date']) # 设置索引为日期,并指定月度起始频率(MS),与训练数据保持一致 future_exog_df = future_exog_df.set_index('date').asfreq('MS')
2. 未正确指定预测步长(fh参数)
当传入X参数时,PyCaret默认根据X的行数确定预测步长,但如果未显式指定fh(forecast horizon),或fh的长度与X的行数不匹配,可能导致日期逻辑混乱。此外,若X的索引未与训练数据的末尾日期衔接(比如训练数据到2023-12,X的日期却跳至2024-03),也会引发问题。
解决方法:显式指定fh,或确保X的索引是训练数据末尾之后的连续月度日期:
# 方法1:显式指定预测步长为6(对应2024年1-6月) predict_model(model, fh=6, X=future_exog_df) # 方法2:确保X的索引与训练数据衔接且连续 # 训练数据索引末尾为2023-12,X的索引需为2024-01至2024-06的连续月度日期
3. 外生变量列名与训练数据不匹配
如果future_exog_df中的外生变量列名与训练数据中的列名不一致(比如训练数据是Aggregate_FinalGoodsDemand,而future_exog_df是Aggregate_FinalGoods_Demand),PyCaret无法识别外生变量,会直接忽略X参数,按默认逻辑生成日期。
解决方法:检查并确保列名完全一致:
# 查看训练数据的列名 print(merged_df.columns) # 保留与训练数据一致的外生变量列 future_exog_df = future_exog_df[['Aggregate_FinalGoodsDemand']]
4. 训练阶段未正确配置外生变量
在setup阶段,如果未通过exogenous参数指定外生变量,后续predict_model传入X时,模型不会使用外生变量,也不会参考X中的日期,而是生成默认日期。
解决方法:在setup时明确指定外生变量:
from pycaret.time_series import TSForecastingExperiment exp = TSForecastingExperiment() exp.setup( data=merged_df, target='Recieved_Qty_Component', exogenous='Aggregate_FinalGoodsDemand', # 正确指定外生变量 fh=12, # 训练时的预测步长,可按需调整 fold=3 )
内容的提问来源于stack exchange,提问作者Ruixiang Yang

