当前位置: 首页 > news >正文

【python深度学习】Day 59 经典时序预测模型3——SARIMA

知识点
  1. SARIMA模型的参数和用法:SARIMA(p, d, q)(P, D, Q)m
  2. 模型结果的检验可视化(昨天说的是摘要表怎么看,今天是对这个内容可视化)
  3. 多变量数据的理解:内生变量和外部变量
  4. 多变量模型
    1. 统计模型:SARIMA(单向因果)、VAR(考虑双向依赖)
    2. 机器学习模型:通过滑动窗口实现,往往需要借助arima等作为特征提取器来捕捉线性部分(趋势、季节性),再利用自己的优势捕捉非线性的残差
    3. 深度学习模型:独特的设计天然为时序数据而生

一、模型介绍

1.SARIMA模型介绍

相对于ARIMA,SARIMA模型将季节性差分引入到模型中。

SARIMA (Seasonal AutoRegressive Integrated Moving Average)是标准ARIMA模型的扩展。它专门用于处理具有明显季节性模式的时间序列数据。

2. SARIMA模型的参数

SARIMA模型由两组参数定义:(p,d,q) 和 (P,D,Q,m)

ps:注意大小写

1. 非季节性部分: (p, d, q) 这里和之前arima一致

2. 季节性部分: (P, D, Q, m),这是一套全新的参数 (P, D, Q, m)。它负责处理序列的长期、周期性的依赖关系。

3.SARIMA模型的理解

sarima不是单纯的对arima做了一次季节差分,而且做了季节性的一些其他特征捕捉:季节自回归P、季节移动平均Q。

SARIMA的完整工作流程:

(1)季节性层面分析:模型首先利用 (P, D, Q)m 这一套完整的“季节性ARIMA”来处理数据。它进行季节性差分(D),然后用季节性自回归(P)和季节性移动平均(Q)来解释季节性平稳后的数据中的模式。这个过程的输出是一个“季节性影响被剥离后”的残差序列。

(2) 非季节性层面分析:接着,模型再将我们熟悉的 (p, d, q) 应用于第一步产生的残差序列上。它对这个序列进行普通差分(d),然后用AR(p)和MA(q)来捕捉其中剩余的、短期的、非季节性的模式。

总结:SARIMA不是在ARIMA上打个补丁,而是构建了一个与非季节性部分 (p,d,q) 平行且完整的季节性分析系统 (P,D,Q)m。这两个系统协同工作,一个负责宏观的、周期性的规律,另一个负责微观的、短期的波动,最终结合成一个强大而全面的预测模型。

二、代码实战

使用国际航空乘客人数数据集

1.可视化原始数据

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.statespace.sarimax import SARIMAX
import warnings
warnings.filterwarnings('ignore')
# 显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False# 1. 加载数据(这里使用国际航空乘客数量)
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv'
df = pd.read_csv(url, header=0, index_col=0, parse_dates=True)
df.columns = ['Passengers']# 2. 划分训练集和测试集(保留最后12个月作为测试)
train_data = df.iloc[:-12]
test_data = df.iloc[-12:]print("--- 训练集 ---")
print(train_data.tail()) # 观察训练集最后5行
print("\n--- 测试集 ---")
print(test_data.head()) # 观察测试集前5行# 3. 可视化原始数据
plt.figure(figsize=(12, 6))
plt.plot(train_data['Passengers'], label='训练集')
plt.plot(test_data['Passengers'], label='测试集', color='orange')
plt.title('国际航空乘客数量 (1949-1960)')
plt.xlabel('年份')
plt.ylabel('乘客数量 (千人)')
plt.legend()
plt.show()

输出结果

2.选择差分阶数

确定SARIMA模型参数 (p,d,q)(P,D,Q)m

(1)确定季节周期 m

数据是月度的,季节性模式是年度的。因此,季节性周期 m = 12。

(2)确定差分阶数 d 和 D

我们的目标是通过差分使数据平稳。通常先进行季节性差分,再看是否需要普通差分。

- 季节性差分 D: 由于有明显的季节性,我们先尝试 D=1。

- 普通差分 d: 季节性差分后,可能还存在长期趋势,我们再尝试 d=1。

让我们进行 d=1, D=1 的双重差分,并用ADF检验来验证平稳性。

# 进行季节性差分 (D=1, m=12)
seasonal_diff = df['Passengers'].diff(12).dropna()
# 再进行普通差分 (d=1)
seasonal_and_regular_diff = seasonal_diff.diff(1).dropna()# 绘制差分后的数据
plt.figure(figsize=(12, 6))
plt.plot(seasonal_and_regular_diff)
plt.title('经过一次季节性差分和一次普通差分后的数据')
plt.show()# ADF检验
result = adfuller(seasonal_and_regular_diff)
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}') # p-value越小,越说明数据平稳

输出结果

确定其他参数

确定AR/MA阶数 (p,q) 和 (P,Q)

# 绘制ACF和PACF图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8))
plot_acf(seasonal_and_regular_diff, lags=36, ax=ax1) # 绘制36个时间点
plot_pacf(seasonal_and_regular_diff, lags=36, ax=ax2)
plt.show()

既可以通过ACF和PCAF确定,还可以通过超参数搜索获得

# 超参数搜索
from pmdarima import auto_arima # 一个方便的自动调参库
# 使用auto_arima自动寻找最优模型
# 我们告诉它d=1, D=1, m=12是固定的,让它去寻找p,q,P,Q的最优组合
# 默认使用AIC作为评估标准
auto_model = auto_arima(train_data['Passengers'],start_p=0, start_q=0,max_p=2, max_q=2,m=12,start_P=0, seasonal=True,d=1, D=1,trace=True,error_action='ignore',suppress_warnings=True,stepwise=True)print(auto_model.summary())

3.模型诊断

# 从auto_arima的结果中获取最优参数best_order = auto_model.order
best_seasonal_order = auto_model.seasonal_order# 拟合模型
model = SARIMAX(train_data['Passengers'],order=best_order,seasonal_order=best_seasonal_order)
results = model.fit(disp=False)# 打印模型诊断图
results.plot_diagnostics(figsize=(15, 12))
plt.show()

http://www.lryc.cn/news/580270.html

相关文章:

  • Day05: Python 中的并发和并行(1)
  • SpringAIAlibaba正式版发布!
  • Python-GUI-wxPython-布局
  • 汽车功能安全概念阶段开发【相关项定义HARA】2
  • VS CodeC51 单片机开发环境搭建
  • 【AI大模型面试八股文】大模型训练中如何应对灾难性遗忘问题?
  • Cookie + Session
  • suricata新增协议处理流程
  • 数据结构与算法:贪心(三)
  • 图灵完备之路(数电学习三分钟)----数据选择器与总线
  • 《设计模式之禅》笔记摘录 - 3.工厂方法模式
  • c语言中的函数IV
  • 利用TCP协议,创建一个多人聊天室
  • 关于python
  • NumPy-核心函数np.dot()深入理解
  • 物联网中的Unity/Unreal引擎集成:数字孪生与可视化控制
  • 免费PDF处理软件,支持多种操作
  • 转Go学习笔记
  • 项目中大表治理方案实践
  • Dash 安装使用教程
  • 遗传算法的原理与实现示例
  • Kotlin 安装使用教程
  • windows11下启动 rqt 时报错:This application failed to start...... 的解决方法
  • CSS——圆形头像外嵌光圈
  • JavaWeb笔记05
  • 【ACP】阿里云云计算高级运维工程师--ACP
  • 力扣:70. 爬楼梯
  • [C++] # 深入理解C++继承:从原理到实现
  • Querybook:一个开源大数据查询分析工具
  • Gartner《数据与分析治理的参考架构概述》学习心得