如何对ARMA模型一阶差分后的预测结果做逆差分还原
一阶差分逆还原实现方案
一阶差分的计算逻辑为 y_diff[t] = y[t] - y[t-1],对应的逆运算逻辑非常明确:当期原始值 = 前一期原始值 + 当期差分值。逆差分不需要全量原始数据,仅需要待预测区间前一个时间点的原始值作为初始基准,即可通过递推完成全部预测结果的还原,适配测试集验证、实时滚动预测两类场景。
针对测试集预测代码的还原实现
首先修正原代码里的笔误:预测结果重命名时多写了嵌套反引号,修正后的基础代码逻辑不变,逆差分操作可按如下步骤实现:
- 定位初始基准值:由于做差分后调用了
dropna()删除了首行空值,训练集截止位置对应的原始序列值,就是测试集差分预测的递推起点 - 遍历差分预测结果逐期递推,得到还原后的原始尺度预测值
完整代码示例:
import pandas as pd y_transformed = y.diff().dropna() # 原始一阶差分序列 nobs=12 train, test = y_transformed[0:-nobs], y_transformed[-nobs:] # 拟合ARMA模型 model = ARMA(train['Sales'],order=(2,2)) ARMAfit = model.fit() # 生成差分尺度的测试集预测结果 start=len(train) end=len(train)+len(test)-1 predictions = ARMAfit.predict(start=start , end=end, dynamic=False).rename('ARMA Predictions') # ---------------- 逆差分还原核心代码 ---------------- # 拿到递推初始基准值:测试集第一个点对应的前一期原始值 base_value = y['Sales'].iloc[len(train)] reverted_pred = [] current_val = base_value for diff_val in predictions: current_val += diff_val reverted_pred.append(current_val) # 转为带原时间索引的Series,方便和测试集真实值对比 reverted_predictions = pd.Series(reverted_pred, index=test.index, name='Reverted ARMA Predictions')
实时预测场景的还原方法
做在线实时预测时不需要留存全量历史原始数据,只需要保存上一个时间点的还原值作为下一次预测的递推基准即可:
- 假设已得到t时刻的还原预测值
y_t,模型输出t+1时刻的差分预测值diff_t1,直接计算y_t1 = y_t + diff_t1就得到t+1时刻的原始尺度预测值 - 后续每一期预测都以上一期的还原结果为基准递推,不需要依赖更早的历史原始数据
注意事项
- 不要直接对差分预测结果做全局
cumsum()后不加基准值偏移,否则还原出的序列会出现整体平移的错误 - 如果做了更高阶的差分(比如二阶差分),只需要从最高阶的预测结果开始,按同样的递推逻辑逐层还原即可
- 当前的建模流程本质是手动实现了ARIMA(2,1,2),如果直接调用statsmodels的ARIMA接口指定
order=(2,1,2)拟合原始序列,接口输出的预测结果会自动完成逆差分,不需要手动实现还原逻辑,其内部计算逻辑和上述递推方法完全一致。
内容的提问来源于stack exchange,提问作者metti021
相关产品推荐
相关产品推荐

