使用Python Prophet做预测时,如何保留测试集id列并避免索引异常?
解决Prophet预测结果丢失id列且对应关系异常的问题
核心原因是你尝试通过索引合并时,Prophet内部处理可能改变了行顺序;而id是Date(ds)、Var1、Var2的唯一组合,所以可以通过这三个字段作为唯一合并键来确保匹配准确,以下是两种可靠的解决方法:
方法一:预测时直接保留id列
Prophet的predict()方法会保留输入DataFrame中的所有非模型必需列(除ds和回归变量外的列都会被带回预测结果),只需确保你的df_test包含id列即可:
# 重命名Date为ds时,保留原test数据中的所有列(包括id) df_test = df_test_clean.rename(columns={'Date':'ds'}) # 执行预测,test_forecast会自动包含id列 test_forecast = m.predict(df_test)
方法二:通过唯一键合并id列(兼容所有Prophet版本)
如果方法一不生效,直接用ds、Var1、Var2这三个唯一标识字段做合并键,把id匹配到预测结果中:
# 执行预测 test_forecast = m.predict(df_test) # 合并id列,确保匹配准确 test_forecast_with_id = pd.merge( test_forecast, df_test_clean[['id', 'Date', 'Var1', 'Var2']], left_on=['ds', 'Var1', 'Var2'], right_on=['Date', 'Var1', 'Var2'], how='left' ).drop(columns='Date') # 删除重复的Date列
额外注意:训练数据处理的潜在问题
你的代码中使用df_train_clean.index.get_level_values('Date'),说明Date是索引的一部分,但后续执行rename(columns={'Date':'ds'})时,Date是索引而非列,重命名操作不会生效,会导致Prophet训练时找不到ds列报错。修正方法如下:
# 先把Date从索引移到列 df_train_clean = df_train_clean.reset_index(level='Date') # 再进行数据分割和重命名 split_date = '2019-01-01' df_train = df_train_clean[df_train_clean['Date'] < split_date] df_val = df_train_clean[df_train_clean['Date'] >= split_date] df_train = df_train.rename(columns={'Date':'ds','Y':'y'}) df_val = df_val.rename(columns={'Date':'ds','Y':'y'})
内容的提问来源于stack exchange,提问作者thenoirlatte
相关产品推荐
相关产品推荐

