Temporal Fusion Transformer长预测长度下未知类别错误的解决问询
问题场景
手里有153天(5个月)的日销售数据,用Temporal Fusion Transformer(TFT)搭建时间序列模型,目标是预测未来30天的销量。设置max_prediction_length=7、max_encoder_length=21时模型能正常运行,但把max_prediction_length改成13后,直接触发报错:
KeyError: Unknown category '10' encountered. Set
add_nan=Trueto allow unknown categories
解决方法
排查类别特征的取值范围
错误核心是预测阶段出现了训练数据里从没见过的类别值'10'。当预测长度从7调到13,模型需要生成更长的未来序列,其中某个类别特征(比如门店编号、促销标签,甚至是日期衍生的周/月字段)在未来13天的取值超出了训练集的范围。先核对训练数据里所有类别特征的取值,再对比未来预测用的数据里对应字段的内容,找出那个出现'10'的特征。给类别编码器加
add_nan=True参数
按照错误提示,在处理类别特征时,给对应的编码器加上add_nan=True,让模型遇到未知类别时自动映射为NaN,避免报错。比如在定义TimeSeriesDataSet时:from pytorch_forecasting import TimeSeriesDataSet, CategoricalEncoder training_data = TimeSeriesDataSet( your_dataframe, time_idx="time_idx", target="sales", # 给有问题的类别特征指定带add_nan的编码器 categorical_encoders={"problem_category_col": CategoricalEncoder(add_nan=True)}, # 其他必要参数... max_encoder_length=21, max_prediction_length=13 )修正未来数据的类别特征
如果是未来数据里的类别特征确实出现了训练集没有的新值,比如训练集只有1-9号门店,未来要预测10号店的销量,那要么补充10号店的历史销售数据到训练集,要么把这个特征改成数值型(如果有顺序意义),或者提前把所有可能出现的类别值都加入训练集的特征取值中。检查日期衍生特征的处理方式
很多时候这类错误来自日期特征,比如把dayofyear当成类别特征处理——训练数据是5个月(dayofyear 1-153),预测未来13天的dayofyear超过153,就会出现训练集没有的新类别。这种情况应该把日期特征改成循环编码(用sin、cos转换),而不是类别特征,毕竟日期是连续循环的,不适合按类别处理。
内容的提问来源于stack exchange,提问作者hellokitty

