基于SARIMAX的样本外预测问题求助
问题背景
我正在使用statsmodels库中的SARIMAX模块构建季节性ARIMA模型,示例代码如下:
import pandas as pd import numpy as np from statsmodels.tsa.statespace.sarimax import SARIMAX date_range = pd.date_range(start='2000-01-01', end='2009-12-01', freq='MS') values = np.random.rand(len(date_range)) ts_full = pd.Series(values, index=date_range) train = ts_full[:-12] mdl = SARIMAX(train, order=(1, 0, 0), seasonal_order=(1, 0, 0, 12)).fit()
我希望在未参与训练的最后12个月数据上测试模型性能,且无需每月重新拟合模型。尝试执行mdl.predict(ts_full)时出现如下错误:
TypeError: Cannot convert input [2000-01-01 0.509615 2000-02-01 0.094391 2000-03-01 0.454202 2000-04-01 0.489502 . . . 2009-10-01 0.167847 2009-11-01 0.625154 2009-12-01 0.621803 Freq: MS, dtype: float64] of type <class 'pandas.core.series.Series'> to Timestamp
网上找到的预测示例多为单步预测或需要每次预测前重新拟合模型,请问是否存在无需重拟合即可在未训练数据上进行预测的方法?
解决方案
可以不用重拟合模型完成多步预测,你遇到的错误是因为predict()参数使用错误——它不需要传入整个时间序列,而是要指定预测的起始/结束位置或步数。以下是两种可行方法:
方法1:指定预测的时间范围
直接传入测试集的起始和结束时间戳:
# 测试集起始时间为训练集最后一个时间点的下一个月 start_date = train.index[-1] + pd.DateOffset(months=1) # 测试集结束时间为完整序列的最后一个时间点 end_date = ts_full.index[-1] # 生成预测结果 forecast = mdl.predict(start=start_date, end=end_date)
方法2:指定预测步数
由于测试集正好是12个月,可直接用steps参数指定预测步数:
# 从训练集结束位置开始,预测12步 forecast = mdl.predict(start=len(train), steps=12)
验证模型性能
得到预测结果后,可与真实测试数据对比计算评估指标:
test = ts_full[-12:] from sklearn.metrics import mean_absolute_error, mean_squared_error mae = mean_absolute_error(test, forecast) rmse = np.sqrt(mean_squared_error(test, forecast)) print(f"MAE: {mae:.4f}") print(f"RMSE: {rmse:.4f}")
补充说明
- 上述方法实现的是动态多步预测:完全依赖模型自身的预测结果生成后续每一步,无需真实数据输入或重拟合模型。
- 如果需要静态预测(每一步用真实历史数据预测下一个点),可使用
get_prediction()方法,同样无需重拟合:
preds = mdl.get_prediction(start=start_date, end=end_date, dynamic=False) predicted_values = preds.predicted_mean
内容的提问来源于stack exchange,提问作者Serge Kashlik
相关产品推荐
相关产品推荐

