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

Statsmodels中MarkovAutoregression模型如何基于新验证集做预测?

关于MarkovAutoregression.predict()的问题解答

1. start/end索引是否对应train_data?

是的,start和end参数的索引完全对应拟合模型时使用的train_data。模型训练完成后,它的时间序列索引范围默认是0到len(train_data)-1,所有涉及索引的参数都是基于这个范围定义的。

2. 如何用val_data实现预测?

首先要注意:你当前用train_test_split拆分时间序列的方式是错误的——它会随机打乱数据顺序,而马尔可夫自回归模型依赖时序的连续性,必须按时间顺序拆分数据。以下是正确的实现步骤:

步骤1:修正数据拆分逻辑

# 替换原随机拆分,按时间顺序划分训练集和验证集
split_idx = int(len(data) * 0.8)
train_data = data[:split_idx]
val_data = data[split_idx:]

步骤2:基于训练模型预测验证集

训练完成后,有两种常用方式预测验证集:

方式一:直接指定预测范围

验证集的起始索引是训练集的长度(len(train_data)),结束索引是整个数据集的最后一个位置(len(data)-1),直接调用result.predict()即可:

# 预测验证集对应的时间区间
val_predictions = result.predict(start=len(train_data), end=len(data)-1)

方式二:手动递推预测(适合理解底层逻辑)

如果需要明确看到每一步的预测过程,可以用训练集末尾的lag_order个值作为初始输入,逐个预测验证集的点:

lag_order = 2
# 取训练集最后lag_order个值作为初始序列
current_seq = train_data[-lag_order:]
val_predictions = []

for _ in range(len(val_data)):
    # 预测下一个值
    pred = result.predict(start=len(train_data)-1, end=len(train_data)-1 + 1)
    val_predictions.append(pred[-1])
    # 更新序列,滚动进入新预测值
    current_seq = np.concatenate([current_seq[1:], [pred[-1]]])

val_predictions = np.array(val_predictions)

重要提示

  • 绝对不要用train_test_split处理时间序列:随机拆分会破坏时序依赖关系,导致模型训练无效。
  • 调用result.predict()时无需传入params参数,因为result对象已经保存了训练好的模型参数;如果直接调用model.predict(),才需要传入result.params。

内容的提问来源于stack exchange,提问作者Ihmon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 22:53:05