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
相关产品推荐
相关产品推荐

