You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 15:03:14