突破最强时间序列模型,自回归积分滑动平均!!

文摘   2024-11-04 15:36   北京  

哈喽,我是cos大壮~

今儿和大家再来聊聊时间序列中,比较重要的一个算法模型:自回归积分滑动平均

之前咱们也把各种自回归的场景进行了总结,大家可以翻到前面看看~

咱们把自回归积分滑动平均拆分出来看下~

老规矩如果大家伙觉得近期文章还不错!欢迎大家点个赞、转个发,文末赠送《机器学习学习小册》

文末可取本文PDF版本~

1. 什么是时间序列数据?

时间序列数据就是按时间顺序记录的数据,比如每天的股票价格、每天的温度、每月的销量等等。我们可以用时间序列模型来发现这些数据的规律,并进行预测。

2. 什么是「自回归积分滑动平均模型」(ARIMA)?

ARIMA 模型包含三个部分,每个字母代表一种操作:

  • AR:自回归(Auto-Regressive)
  • I:积分(Integrated)
  • MA:滑动平均(Moving Average)

接下来,我们分别解释这三部分。


AR:自回归

「自回归」的意思是我们可以用过去的值来预测未来的值。比如,如果你要预测明天的股票价格,可以参考今天和前几天的价格,因为它们可能有一定的联系。

假设有一段温度数据:20℃、21℃、22℃、23℃。如果气温每天只上涨 1℃,你可以根据前几天的气温来推测出明天的气温可能是 24℃。这就是自回归的思路。

AR 模型的公式中会有一个「自回归系数」来决定过去的数据对现在的影响程度。


MA:滑动平均

滑动平均的意思是,我们在预测时,不仅考虑历史数据的趋势,还考虑历史的“误差”或“噪音”的影响。

假设每天的气温记录中,有一些误差,比如风向、湿度等因素影响了温度,使得有些天比实际温度更高或更低。滑动平均会利用过去误差的均值来调整当前预测,以减少这些误差的影响。

例如,如果过去几天的温度波动很大,滑动平均会平滑这些波动,帮助我们更稳定地预测未来的温度。


I:积分

积分的作用是消除数据中的趋势,使数据变得「平稳」。在时间序列分析中,我们希望数据的平均值、方差等统计特性是稳定的。

假设我们有一个公司的季度销售额记录,发现每个季度的销售额都在增加,那么这种趋势会导致数据不断变大,不平稳。积分操作就是通过「差分」来消除这种趋势,使数据波动稳定。

差分的意思是用前后两个时间点的数据差值来替换原数据。例如,如果销售额是 100、120、140、160,那么差分之后得到 20、20、20,这样数据就平稳了。


简单例子:预测商店的每日销售额

假设我们有一家商店,它的每日销售额是这样的:100元、110元、120元、130元、125元、135元……

  1. 自回归(AR):我们观察到,今天的销售额与过去几天的销售额相关联,比如每天销售额大约增加10元。我们可以用前几天的数据来预测今天的数据。这个规律可以通过自回归系数来表示,比如「前一天的销售额影响 80%,前两天的销售额影响 20%」。

  2. 积分(I):如果销售额有上升趋势,比如每个月销售额都会有小幅度增长,我们可以用差分操作去掉这种趋势,让数据变平稳。这样做之后,我们只需要分析这种「增量」而不是绝对值的变化。

  3. 滑动平均(MA):假设有几天的销售额波动很大,比如突然有促销活动,销售额在 150 元、90 元、130 元之间波动。滑动平均会考虑这些波动,并平滑它们的影响,使预测不受个别异常数据的干扰。

通过结合这三种方法(AR、I 和 MA),ARIMA 模型可以帮助我们预测未来的销售额,让我们更好地安排库存和促销活动。

有了这些清晰的解释,咱们下面从各项原理、推理来详细的看下~

ARIMA原理

ARIMA模型分成三个部分:

1.AR(p):自回归部分,其中表示自回归项数。模型形式是:

其中,是当前时间的数据值,是前p个时间点的数据值,是系数,是随机误差项。

2.I(d):差分部分,用来使非平稳数据变成平稳数据。若存在长期趋势,可以用差分来消除趋势。差分公式为:

若需要做d阶差分,就差分d次。

3.MA(q):滑动平均部分,其中表示滑动平均项数。公式为:

其中,是滑动平均的系数,是误差项。

完整的ARIMA模型(ARIMA(p, d, q))公式如下:

完整案例

数据集方面,我选择了 kaggle 上的 Air Passenger 数据集,它记录了 1949 年至 1960 年每个月的航空乘客数量,适合做时间序列分析。

数据集文件名:AirPassengers.csv。

数据集获取:点击名片,回复「数据集」即可~

手动实现 ARIMA 模型的步骤

我们从基础部分开始实现 ARIMA 模型,包括:

  1. 自回归 (AR) 计算;
  2. 差分 (I) 处理;
  3. 滑动平均 (MA) 计算;
  4. 可视化分析。

数据分析图形

  1. 原始数据的时序图:展示时间序列的基本趋势和波动。
  2. 差分后的数据图:说明通过差分平稳化后的数据,去掉了趋势。
  3. 自回归预测 vs 实际数据图:展示自回归部分的预测效果。
  4. ARIMA 模型的残差分析图:分析模型的误差分布,帮助了解模型的拟合情况。

代码实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 读取数据
df = pd.read_csv('AirPassengers.csv')
df['Month'] = pd.to_datetime(df['Month'])
df.set_index('Month', inplace=True)

# 数据可视化 - 原始数据
plt.figure(figsize=(106))
plt.plot(df.index, df['#Passengers'], color='blue', label='Original Data')
plt.title('Air Passengers Over Time')
plt.xlabel('Time')
plt.ylabel('Number of Passengers')
plt.legend()
plt.grid(True)
plt.show()

# 差分处理 - 一阶差分
def difference(data):
    diff = []
    for i in range(1, len(data)):
        diff.append(data[i] - data[i - 1])
    return np.array(diff)

diff_data = difference(df['#Passengers'].values)

# 数据可视化 - 差分数据
plt.figure(figsize=(106))
plt.plot(df.index[1:], diff_data, color='orange', label='Differenced Data')
plt.title('Differenced Air Passengers Data')
plt.xlabel('Time')
plt.ylabel('Differenced Number of Passengers')
plt.legend()
plt.grid(True)
plt.show()

# 自回归 (AR) 部分
def autoregression(data, p):
    predictions = []
    for t in range(p, len(data)):
        ar_value = np.dot(data[t-p:t][::-1], np.ones(p) / p)
        predictions.append(ar_value)
    return np.array(predictions)

p = 3  # 自回归阶数
ar_predictions = autoregression(diff_data, p)

# 修正: 计算误差时对齐数据
errors = diff_data[p:] - ar_predictions

# 数据可视化 - 自回归预测 vs 实际数据
plt.figure(figsize=(106))
plt.plot(df.index[p+1:], diff_data[p:], label='Actual Data', color='green')
plt.plot(df.index[p+1:], ar_predictions, label='AR Predictions', color='red')
plt.title('AR Model Predictions vs Actual Data')
plt.xlabel('Time')
plt.ylabel('Differenced Number of Passengers')
plt.legend()
plt.grid(True)
plt.show()

# 滑动平均 (MA) 部分
def moving_average(errors, q):
    ma_predictions = []
    for t in range(q, len(errors)):
        ma_value = np.dot(errors[t-q:t][::-1], np.ones(q) / q)
        ma_predictions.append(ma_value)
    return np.array(ma_predictions)

q = 3  # 滑动平均阶数
ma_predictions = moving_average(errors, q)

# 数据可视化 - ARIMA 模型的残差分析
plt.figure(figsize=(106))
plt.hist(errors, bins=20, color='purple')
plt.title('Residuals (Errors) Distribution')
plt.xlabel('Error Value')
plt.ylabel('Frequency')
plt.grid(True)
plt.show()

图1:原始数据的时序图 展示了航空乘客数量随时间的增长趋势和季节性波动。这个图形可以帮助我们直观了解时间序列的特性。

图2:差分后的数据图 表明差分后数据的波动更加平稳,去掉了原始数据中的趋势,这使得后续的自回归分析更加准确。

图3:自回归预测 vs 实际数据图 展示了通过自回归模型得到的预测值与实际差分值的对比。这个图说明了我们使用过去数据来预测当前值的效果。

图4:ARIMA 模型的残差分析图 帮助我们理解模型的误差分布,若误差是均匀分布的,则表明模型拟合较好;若误差分布偏离,可能需要调整模型。

整个的代码,咱们从基础原理出发,手动实现了 ARIMA 模型的自回归、差分和滑动平均部分,并通过航空乘客数据集进行了预测和可视化分析。在这个过程中,我们通过代码实现了模型,还通过多个图形直观展示了模型的效果和数据的变化特点。

最后

通过手动实现 ARMA 模型,可以深刻理解其数学推导和实现细节,同时通过图形直观地理解模型的拟合效果和残差分布。

大家有问题可以直接在评论区留言即可~

喜欢本文的朋友可收藏、点赞、转发起来!

需要本文PDF的同学,扫码备注「基础算法」即可~ 
关注本号,带来更多算法干货实例,提升工作学习效率!
最后,给大家准备了《机器学习学习小册》PDF版本16大块的内容,124个问题总结
100个超强算法模型,大家如果觉得有用,可以点击查看~

推荐阅读

原创、超强、精华合集
100个超强机器学习算法模型汇总
机器学习全路线
机器学习各个算法的优缺点
7大方面,30个最强数据集
6大部分,20 个机器学习算法全面汇总
铁汁,都到这了,别忘记点赞呀~

深夜努力写Python
Python、机器学习算法
 最新文章