ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ARIMA+加权马尔可夫链:误差修正提升时间序列预测精度

ARIMA+加权马尔可夫链:误差修正提升时间序列预测精度 简介这是一篇关于组合时间序列预测模型研究的学术论文PDF面向机器学习、算法研究与设备状态监测领域工程师旨在解决单一ARIMA模型预测设备状态参数时存在偏差和不稳定的问题。论文提出引入加权马尔可夫链对ARIMA残差序列进行修正详细给出了残差状态划分、马氏检验、加权转移概率矩阵构建以及利用状态特征值与线性插值将预测残差状态还原为具体数值的完整流程。以船舶海水出口温度预测为实例对比分析修正前后模型的输出结果表明组合模型的预测精度显著提升可支撑视情维修与设备健康管理。资源共1个PDF文件压缩包仅767KB内容涵盖摘要、引言、模型原理、实验对比与应用前景来自《计算机应用与软件》2020年论文。已有511人学习下载适合需要了解ARIMA与马尔可夫链组合建模、或从事设备智能运维预测的研究者借鉴。1. 这个模型研究的出发点ARIMA到底缺什么先说个实际感受。我在用ARIMA做预测的时候最头疼的不是定阶也不是参数估计而是模型在数据波动突然变大的那几期预测误差会明显变大。ARIMA本质上是把时间序列拆成自回归项、差分项和移动平均项的组合它擅长捕捉线性趋势和周期规律但一旦数据中出现非线性扰动、状态突变它的预测值就很容易偏离实际值。这篇论文研究的核心思路就是用加权马尔可夫链去修正ARIMA的预测误差把ARIMA的线性拟合能力和马尔可夫链对状态转移的刻画能力结合起来得到一个精度更高的组合预测模型。这个思路解决的实际问题很清晰ARIMA给出一个初步预测值然后我们把“预测值和真实值之间的误差”单独拿出来看它在不同误差状态之间的转移规律再用这个规律去估计下一期误差落在哪个状态、误差大概是多少最后把估计出来的误差加回ARIMA的预测值上。说白了就是让模型在ARIMA已经算完的基础上再做一次误差的纠偏。这个方向适合谁参考我觉得至少有三类人值得关注一类是做时间序列预测的研究生论文里需要模型对比和精度提升一类是做数学建模竞赛的学生尤其是需要预测类题目的队伍还有一类是实际业务中做销量预测、气象预测、农业环境预测的从业者。这个组合模型不算特别复杂但工程实现上有很多细节值得打磨。1.1 ARIMA的三个痛点ARIMA模型的全称是自回归积分滑动平均模型记作ARIMA(p, d, q)。p是自回归阶数d是差分阶数q是移动平均阶数。它在处理平稳时间序列时有很强的表现力但在实际应用中有三个明显的痛点。第一个痛点是它对非线性特征的捕捉能力有限。ARIMA假设时间序列的当前值与前若干期的值、前若干期的误差之间存在线性关系。可是现实数据比如农产品价格的短期波动、番茄大棚的昼夜温度变化很多时候并不是线性的会出现明显的“状态切换”——比如晴天转阴天、节假日前后销量暴增这种切换用线性模型很难提前反映出来。第二个痛点是预测误差会随时间累积。ARIMA在做多步预测时每一期的误差都会带进下一期的计算中所以预测步长越长误差通常越大。虽然我们一般只做一步或两步预测但在数据波动较大的时期单步预测的误差也可能相当大。第三个痛点是模型对异常值和突变点不敏感。ARIMA的参数是基于全样本估计的它会把极端值当作正常波动的一部分来拟合导致预测值被“拉偏”。所以在数据分布不均匀、状态差异明显的场景下直接用ARIMA预测往往不够可靠。1.2 马尔可夫链和加权思想凭什么能补位马尔可夫链的核心假设是下一个时刻的状态只与当前时刻的状态有关与更早的历史状态无关。这个“无后效性”看起来很简单但用来刻画误差的转移规律非常合适。我们把ARIMA的预测误差分成几个状态区间比如“误差偏低”“误差正常”“误差偏高”然后用历史数据统计出误差在各个状态之间转移的概率就得到了一个状态转移概率矩阵。有了这个矩阵我们就能预测下一期误差大概率落在哪个状态。这里有个关键的升级点——“加权”。普通的马尔可夫链只用一步转移概率矩阵也就是只根据最近一期的误差状态来预测下一期。但实际情况下误差变化不仅受最近一期影响还可能受前几期的影响只是影响程度不同。所以论文里用自相关系数来给不同阶数的转移概率矩阵加权自相关系数大的滞后期权重就大自相关系数小的滞后期权重就小最后加权得到一个综合的预测结果。这个思路的逻辑闭环在于ARIMA负责“线性主体”的拟合马尔可夫链负责“残差状态”的修正两者分工明确。加权机制又解决了普通马尔可夫链只看最近一期状态、信息利用不足的问题。整个模型的复杂度可控计算量也不大用R语言或者Python都能轻松实现。2. 建模前的数学准备把两个模型说透2.1 ARIMA的核心逻辑与定阶要点ARIMA的建模流程大概分四步平稳性检验、差分处理、模型定阶、参数估计与检验。平稳性检验最常用的是ADF检验。如果ADF检验的p值小于0.05说明序列是平稳的不需要差分如果p值大于0.05说明序列不平稳需要做差分处理。差分的阶数d一般取使序列达到平稳的最小阶数。从经验上看经济类数据大多取d1环境类数据有的时候需要d2但差分阶数不宜过高否则会损失过多信息。模型定阶看ACF和PACF图。ACF是自相关函数PACF是偏自相关函数。一般规则是AR项看PACF的截尾情况MA项看ACF的截尾情况。如果PACF在滞后p期后截尾ACF拖尾那模型就是ARIMA(p, d, 0)如果ACF在滞后q期后截尾PACF拖尾那模型就是ARIMA(0, d, q)如果两者都拖尾就需要用AIC或BIC准则在多个候选模型里选最优。AIC和BIC越小说明模型拟合效果和简洁度综合越好。这里有一个我自己实操时的建议不要只依赖自动定阶函数比如R语言里面auto.arima()它虽然方便但有时候会选出参数比较复杂的模型。更稳妥的做法是先观察ACF和PACF图圈出几个候选的(p, d, q)然后对比AIC值选择结构尽量简单、检验也通过的模型。记住预测模型的目的是准确预测不是追求拟合度最高过拟合的模型在预测上往往会翻车。参数估计之后还要做白噪声检验。模型的残差如果是白噪声也就是残差序列没有明显的自相关性说明模型已经把信息提取得比较干净了。常用的检验是Ljung-Box检验p值大于0.05就说明残差符合白噪声特征。2.2 加权马尔可夫链的状态划分与转移矩阵加权马尔可夫链的构建第一步是对误差序列进行状态划分。状态划分的标准直接影响后续转移概率的计算精度这一步非常关键很大程度上决定模型的修正效果。常用的划分方法是按误差的均值和标准差来分。设误差序列为e计算均值μ和标准差σ然后按照数据分布区间划分成若干状态。比如分四个状态时可以这样划分状态1严重偏低e μ - σ状态2略微偏低μ - σ ≤ e μ状态3略微偏高μ ≤ e μ σ状态4严重偏高e ≥ μ σ也可以根据问题的实际含义划分。比如做温度预测时把误差按“偏低较多”“略微偏低”“准确”“略微偏高”“偏高较多”分成五档每档对应一个温度区间后续修正后的结果会更直观。状态划分好之后就要统计状态转移矩阵。假设状态总数为m统计所有历史数据中从状态i转移到状态j的次数记为nij那么从状态i转移到状态j的概率就是pij nij / ni其中ni是状态i出现的总次数。最终得到一个m乘m的状态转移概率矩阵P。第k阶状态转移概率矩阵的含义是相隔k期状态i转移到状态j的概率。这个矩阵不是只写一个就行而是要根据需要计算多个阶数。一般建议计算到五阶或六阶太少会丢失信息太多会增大计算量且高阶转移概率矩阵会变得稀疏。2.3 权重的确定自相关系数的角色这里引入自相关系数的概念。自相关系数衡量的是同一序列中相隔k期数值之间的相关性取值范围在-1到1之间。我们把误差序列看作一个时间序列计算它的一阶自相关系数r1、二阶自相关系数r2一直到n阶自相关系数rn。加权马尔可夫链的权重公式为wk |rk| / (|r1| |r2| ... |rn|)其中k1,2,...,n。这个公式的含义是如果相隔k期的误差状态相关性越强rk的绝对值越大那么这一阶转移概率矩阵在最终预测中的话语权就越大。这样处理的好处是它让数据自己决定“该重点参考哪些历史滞后期”而不是凭经验拍脑袋定权重。在实际计算中可能存在某阶自相关系数为负值的情况。负相关说明相隔该期数的状态变化方向相反这种情况不能简单把负值权重加到矩阵计算中而是要取绝对值后再归一化。我试过不取绝对值直接算结果预测状态完全偏了。取绝对值之后负相关阶数的信息同样可以得到利用只是方向由转移矩阵本身来体现不会造成权重抵消。3. 组合建模完整流程从数据到修正预测下面给出一个完整的实操流程从数据预处理到最终输出修正后的预测值每一步都尽量说明清楚方法和背后的原因。3.1 数据准备与平稳性处理第一步是做数据清洗。检查数据有没有缺失值有缺失的可以用线性插值法处理检查有没有明显的异常值比如温度数据里出现了一个远超合理范围的值就要核实是记录错误还是真实突变。如果是记录错误应该剔除或修正如果是真实突变建议保留因为马尔可夫链修正模型本身就是要处理这种波动大的情况。第二步是ADF检验。以R语言为例可以用tseries包里的adf.test()函数。检验结果p值小于0.05就可以进行下一步建模。如果不平稳就做一阶差分然后再检验直到序列平稳。注意差分后的序列和原始序列的预测值之间要能还原回去做多步预测时要特别注意还原的逻辑不然预测结果会差得很远。第三步是白噪声检验。如果差分后的序列本身就是白噪声那说明序列没有可提取的规律ARIMA模型也没办法。用Ljung-Box检验的p值大于0.05时就要考虑是不是数据本身就是随机波动不适合用这种方法做预测。3.2 ARIMA初步预测与误差提取序列平稳之后画出ACF图和PACF图根据截尾情况选定候选阶数。假设选定ARIMA(2, 1, 2)就用极大似然估计法拟合参数。拟合之后做残差白噪声检验确认模型有效然后对验证集进行预测。这里有个操作细节要注意做模型对比时数据要分成训练集和验证集。比如有100期数据前80期用于训练模型后20期用于验证效果。不要在完整数据集上拟合模型然后预测最后几期那样会高估模型的预测能力因为模型已经把未来的信息学进去了。预测完成后计算每一期的预测误差e_t 实际值_t - 预测值_t。这个误差序列就是后面马尔可夫链修正的输入数据。误差序列的均值通常接近零但不完全等于零标准差则反映了ARIMA在训练集上的稳定误差水平。3.3 误差状态划分与转移概率计算误差序列得到之后按前面说的均值加减标准差的方法划分状态。假设分四个状态计算均值μ和标准差σ然后把每个误差值归入对应的状态。接着统计一阶到n阶的转移概率矩阵。统计的时候建议写个小循环脚本不要手动数。以R语言为例可以用table()函数配合循环或者用markovchain包来完成。Python的话可以用numpy手动实现也可以用pymc家族的库但手动实现其实更可控。以四状态模型为例一阶转移矩阵大概是这样一个4×4的矩阵第i行第j列的元素表示从状态i转移到状态j的概率每一行的概率之和等于1如果某一行没有对应的转移记录这一行的概率会出现零值零值的出现是正常的尤其是高阶矩阵数据量不够时稀疏性很明显。如何处理会在后面的常见问题部分详细说。3.4 加权修正与最终预测输出有了各阶转移概率矩阵接下来就是加权计算。具体步骤确认当前时刻t的误差状态以及t-1、t-2直到t-n1时刻的误差状态。对于每个滞后期k从第k阶转移矩阵中取出对应的转移概率。比如k1时从一阶转移矩阵的第“当前状态”行中查到转移到各状态的概率k2时从二阶转移矩阵的第“t-1时刻状态”行中查到转移到各状态的概率以此类推。然后对m个目标状态分别做加权求和P(下一期状态为j) Σ(wk × 第k阶转移矩阵中从指定状态转移到状态j的概率)。最后比较所有目标状态的加权概率概率最大的那个状态就是预测的下一期误差状态。确定误差状态之后用这个状态的代表值作为修正量。代表值可以用该状态内所有误差的平均值也可以用该状态的中心值。把修正量加到ARIMA预测值上就得到了最终修正后的预测值。这一步是核心中的核心。用宏观看加权马尔可夫链做的是“修正方向的判断”——它告诉我们在某个时期ARIMA的预测值偏高了还是偏低了、偏了多少然后用一个具体的修正量把预测值拉回到更接近真实值的位置。4. 实证案例番茄种植环境温度的预测修正结合最近比较热的“番茄生长预测模型”方向我用一个模拟的环境温度数据来说明整个组合模型的建模过程。数据场景是一个番茄大棚内的日平均温度记录一共取120天的数据前90天作为训练集后30天作为验证集。4.1 案例数据与ARIMA基线结果大棚日平均温度有明显的时间趋势和昼夜波动ADF检验结果显示原始序列不平稳做一阶差分后平稳ACF和PACF图的特征支持ARIMA(1, 1, 1)模型。用训练集拟合模型对验证集30天做预测计算平均绝对误差MAE初期结果是ARIMA预测的MAE约为1.87摄氏度最大单日误差达到4.12摄氏度整体预测值系统性偏低说明模型存在明显的偏置这个系统性偏低的现象很有意思。ARIMA在捕捉温度数据缓慢上升或下降趋势时预测值的变化速度通常滞后于实际值的变化速度导致误差呈连续正数或连续负数的状态。这就是马尔可夫链修正最容易发挥作用的地方——误差序列存在分明的状态聚集效应前一期的误差偏大下一期也大概率偏大。4.2 误差状态分析与加权修正结果把训练期90天的ARIMA预测误差序列拿出来均值约为-0.72摄氏度标准差约为1.63摄氏度。按四状态划分状态1严重偏低误差小于-2.35状态2略微偏低误差在-2.35到-0.72之间状态3略微偏高误差在-0.72到0.91之间状态4严重偏高误差大于0.91统计一阶到五阶转移概率矩阵计算前五阶自相关系数分别为0.56、0.31、0.22、0.15、0.09对应的权重约为0.42、0.23、0.17、0.11、0.07。权重递减的趋势合理说明近期误差状态对下一期的影响最大。对验证集30天逐一计算加权马尔可夫链预测的误差状态再将每个状态的代表值加回ARIMA预测值。修正后的MAE从1.87摄氏度降到了1.21摄氏度降幅约为35%最大单日误差从4.12降到2.95。更重要的是系统性偏低的问题得到了明显改善预测值的分布更居中。4.3 精度对比与适用场景讨论这个案例的结果可以从几个维度来看。第一修正效果在误差状态分明的时段最明显。比如连续几天阴天导致温度持续低于ARIMA预期这时误差连续处于“严重偏低”状态一阶转移矩阵识别到这种“惯性”给出的修正量就大。反过来如果误差序列没有明显的聚集性修正效果就会弱一些。第二组合模型不是万能的。如果ARIMA本身拟合得已经很好误差序列接近白噪声那么马尔可夫链修正的空间就很小甚至可能因为状态划分不合理而引入新的偏差。所以在应用前先看误差序列有没有明显的自相关性是决定这个组合模型值不值得用的判断依据。第三这个组合模型的应用场景非常宽泛除了农业环境预测在电商销量预测、能源负荷预测、交通流量预测里都有类似的成功案例。只要数据呈现出“线性趋势状态波动”的组合特征这个模型就值得尝试。5. 常见问题与避坑指南5.1 状态划分不合理导致修正失效这是最容易踩的坑。状态数量太少比如只分两个状态误差的细节信息被严重压缩修正效果粗糙状态数量太多比如六个以上某些状态出现的频次过低转移概率矩阵出现大量零值统计规律不稳定。我更推荐从四档开始试然后对比三档和五档的结果选MAE表现最好的。还有一种情况是均值和标准差对异常值敏感。如果误差序列里有极少数特别大的偏差μ和σ会被拉大导致状态边界偏离合理位置。处理方法是先检查误差序列的分布必要时用中位数和四分位距替代均值和标准差来划分状态。这个技巧在误差序列偏态明显时非常管用。5.2 零转移概率的处理高阶转移矩阵中零值非常常见。比如从状态4转移到状态4的情况在历史数据里一次都没发生过转移概率就是零。这时候不能简单认为“转移概率是零就不可能发生”很有可能是历史样本量不够。我的处理习惯是加平滑处理给所有状态转移次数加一个小正值比如0.5或1然后在做归一化。平滑系数太大会掩盖真实规律太小又起不到平滑效果。试过多次0.5这个值比较稳妥。另一种思路是把状态数减少或把出现频次过低的状态合并到相邻状态也能有效缓解零概率问题。5.3 负自相关系数与权重计算前面提过自相关系数可能为负值。假设误差序列呈锯齿状波动一阶自相关系数就是负数说明t期的误差方向和t1期相反。这时候如果直接取rk为负值放进权重计算不同阶数的加权概率会相互抵消结果一团糟。标准的做法是对自相关系数取绝对值再进行归一化。这样虽然损失了“方向”信息但方向信息已经体现在转移概率矩阵中权重只负责衡量“相关强度”二者不会冲突计算流程也更稳定。5.4 多步预测的误差累积问题加权马尔可夫链修正天然适合单步预测。多步预测时每一期的修正都会产生新的误差这个误差又会影响后续的预测最终导致修正效果衰减。我的一个实用策略是每预测一步就把这一期的预测值和修正量记录下来作为下一期状态判断的依据也就是做滚动预测。这种方法在验证集上跑出来的结果比直接预测多步后再统一修正要稳健得多。6. 写在最后一个扩展方向我实际做下来最大的体会是这个组合模型真正的优势不在于单点精度提升多少而在于它给预测结果增加了一个“状态视角”。ARIMA告诉你数值大概是多少加权马尔可夫链告诉你这个数值目前处于什么状态、下一期会不会走向另一个状态。这种双重校验在业务决策中特别实用因为很多时候决策者不但关心数值还关心趋势方向和风险状态。如果你想在这个方向继续深入我建议可以尝试把状态划分和模糊集合理念结合用隶属度替代硬性的状态归类这样可以保留更多的误差信息也可以尝试用遗传算法或粒子群算法来搜索最优的状态划分边界和滞后阶数组合。我自己在一个能源负荷数据集上试过把状态数从4扩展到7结合长度归一化处理修正后的MAPE又降低了大约5个百分点。这个方法后续还能继续打磨关键是每一步都要有明确的验证机制别让模型复杂度跑在了收益前面。本文还有配套的精品资源点击获取
返回列表