用Python实现时间序列模型实战——Day 20: 时间序列预测的综合练习

一、学习内容

在本节中,我们将综合应用前几周学习的时间序列分析与预测方法,完成一个完整的时间序列预测项目,包含从数据预处理、异常检测、模型选择、预测到评估的全流程。项目流程:

1. 数据获取与预处理
  • 数据加载,处理缺失值和异常值。
  • 数据的季节性分解和趋势分析。
2. 模型选择与预测
  • 选择适合的时间序列预测模型,如 ARIMA、SARIMA、Holt-Winters 等。
  • 使用滚动预测或多步预测方法进行预测。
3. 模型评估
  • 使用 MAE、MSE 和 RMSE 等指标评估模型性能。
4. 结果可视化
  • 绘制原始数据、预测值和置信区间。
二、实战案例

在此示例中,我们使用著名的航空乘客数据集 (Airline Passengers Dataset),该数据集记录了1949年到1960年每月的国际航空乘客人数。

1. 数据加载与预处理
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from sklearn.metrics import mean_absolute_error, mean_squared_error# 1. 数据加载与预处理
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv'
data = pd.read_csv(url, header=0, parse_dates=['Month'], index_col='Month')# 绘制原始数据
plt.figure(figsize=(10, 6))
plt.plot(data['Passengers'], label='Airline Passengers')
plt.title('Airline Passengers Dataset')
plt.xlabel('Date')
plt.ylabel('Passengers')
plt.legend()
plt.grid(True)
plt.show()

代码解释:

  • 我们从公开的 URL 加载航空乘客数据,解析日期并将其设置为索引。数据记录的是每月的国际航空乘客数量。
  • 首先绘制时间序列,展示乘客数量随时间的变化趋势。

结果输出:

2. 时间序列分解
# 2. 时间序列分解
result = seasonal_decompose(data['Passengers'], model='multiplicative', period=12)
result.plot()
plt.show()

代码解释:

  • 使用 seasonal_decompose 对时间序列进行分解,将其分为趋势、季节性和随机成分。这一步帮助我们理解数据的长期趋势和季节性波动。

结果输出:

3. SARIMA 模型选择与预测
# 3. 模型选择与预测:SARIMA 模型
sarima_model = SARIMAX(data['Passengers'], order=(1, 1, 1), seasonal_order=(1, 1, 1, 12))
sarima_fitted = sarima_model.fit()# 预测未来12个月的乘客数量
sarima_forecast = sarima_fitted.get_forecast(steps=12)
forecast_ci = sarima_forecast.conf_int()

代码解释:

  • 使用 SARIMA 模型进行建模。SARIMA 模型适合于包含季节性和非季节性成分的时间序列。我们设定季节性周期为 12(每年)。
4. Holt-Winters 模型选择与预测
# 4. 模型选择与预测:Holt-Winters 模型
hw_model = ExponentialSmoothing(data['Passengers'], trend='add', seasonal='mul', seasonal_periods=12).fit()
hw_forecast = hw_model.forecast(steps=12)

代码解释:

  • 使用 Holt-Winters 模型进行建模,该模型适合带有季节性、趋势的时间序列。
5. 模型评估
# 5. 评估模型性能
sarima_mae = mean_absolute_error(data['Passengers'], sarima_fitted.fittedvalues)
sarima_rmse = np.sqrt(mean_squared_error(data['Passengers'], sarima_fitted.fittedvalues))hw_mae = mean_absolute_error(data['Passengers'], hw_model.fittedvalues)
hw_rmse = np.sqrt(mean_squared_error(data['Passengers'], hw_model.fittedvalues))print(f"SARIMA MAE: {sarima_mae}, RMSE: {sarima_rmse}")
print(f"Holt-Winters MAE: {hw_mae}, RMSE: {hw_rmse}")

代码解释:

  • 使用 MAE 和 RMSE 指标对 SARIMA 和 Holt-Winters 模型进行评估,比较两个模型的预测性能。

结果输出:

SARIMA MAE: 10.04080588740737, RMSE: 15.555814305174993
Holt-Winters MAE: 7.953222055847547, RMSE: 10.52539423545747
6. 结果可视化
# 6. 绘制预测结果
plt.figure(figsize=(10, 6))
plt.plot(data.index, data['Passengers'], label='Original Data')
plt.plot(pd.date_range(start=data.index[-1], periods=12, freq='M'), sarima_forecast.predicted_mean, label='SARIMA Forecast')
plt.fill_between(pd.date_range(start=data.index[-1], periods=12, freq='M'), forecast_ci.iloc[:, 0], forecast_ci.iloc[:, 1], color='gray', alpha=0.3, label='SARIMA CI')
plt.plot(pd.date_range(start=data.index[-1], periods=12, freq='M'), hw_forecast, label='Holt-Winters Forecast')
plt.title('Airline Passengers Forecast')
plt.xlabel('Date')
plt.ylabel('Passengers')
plt.legend()
plt.grid(True)
plt.show()

代码解释:

  • 绘制 SARIMA 和 Holt-Winters 模型的预测结果,并展示 SARIMA 模型的置信区间。通过对比两个模型的预测曲线,我们可以进一步分析哪种模型更适合于该数据集。

结果输出:

三、结果分析
1. 时间序列分解
  • 分解结果展示了航空乘客数据的趋势、季节性和残差成分,帮助我们更好地理解数据的结构。
2. SARIMA 与 Holt-Winters 模型的预测
  • 通过预测结果可见,SARIMA 和 Holt-Winters 模型都捕捉到了数据的季节性和趋势。SARIMA 模型的置信区间提供了对未来乘客数量的不确定性估计。
3. 模型评估
  • 通过 MAE 和 RMSE 评估模型性能,RMSE 越小,模型的预测效果越好。我们可以通过比较这两个模型的误差来判断哪个模型更适合该数据集。
四、总结

通过本次案例,我们综合应用了时间序列分析与预测的多种方法,完成了从数据预处理、模型选择、预测到评估的完整项目流程。我们通过 SARIMA 和 Holt-Winters 模型对航空乘客数据进行了预测,并比较了两个模型的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1534169.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

三、二叉树-算法总结

文章目录 三、二叉树3.1 二叉树遍历3.1.1 前序遍历3.1.2 中序遍历3.1.3 后序遍历3.1.4 DFS 深度搜索3.1.5 BFS 广度搜索3.1.6 BFS 广度搜索 2 3.2 二叉树分治3.2.1 检验二叉搜索树3.2.2 二叉树的最大深度3.2.3 平衡二叉树 3.3 二叉树分治法3.3.1 二叉树中的最大路径和3.3.2 二叉…

mysql数据库如何开启binlog日志

首先我们要知道什么是binlog日志 binlog是 MySQL数据库的二进制日志文件,记录了数据库更改的所有操作,但不包括SELECT和SHOW这类操作,这些操作对数据进行修改、管理操作、数据库修改等操作都会被记录在日志中。 对于一个sql,它…

Qt-QPushButton按钮类控件(22)

目录 描述 使用 给按钮添加图片 给按钮添加快捷键 添加槽函数 添加快捷键 添加组合键 开启鼠标的连发功能 描述 经过上面的一些介绍,我们也尝试的使用过了这个控件,接下来我们就要详细介绍这些比较重要的控件了 使用 给按钮添加图片 我们创建…

在线IP代理检测:保护您的网络安全

在互联网飞速发展的今天,越来越多的人开始意识到网络安全和隐私保护的重要性。在线IP代理检测工具作为一种有效的网络安全手段,能够帮助用户识别和检测IP代理的使用情况,从而更好地保护个人隐私和数据安全。本文将详细介绍在线IP代理检测的相…

最好用的翻译器:什么是DeepL?如何订阅支付DeepL,订阅DeepL Pro以及申请DeepL API?

DeepL目前最好用的翻译软件,如果是学习翻译的同学或者海外客户翻译,一定不能错过,用它来处理文件,论文等翻译是最好不过了的!!! AI翻译技术的飞速发展正在颠覆我们的沟通方式,打破语…

预测日前电价:回顾最先进的算法、最佳实践和公开基准——阅读笔记

Forecasting day-ahead electricity prices: A review of state-of-the-art algorithms, best practices and an open-access benchmark 预测日前电价:回顾最先进的算法、最佳实践和公开基准 Applied Energy (2021) 摘要:电价预测在过去二十年间已经得到…

【pycharm】安装以及简单使用教程

以windows版本举例: 1、首先去Pycharm官网,或者直接输入网址:http://www.jetbrains.com/pycharm/download/#sectionwindows,下载PyCharm安装包,根据自己电脑的操作系统进行选择,对于windows系统选择下图的…

苹果CMS影视程序被举报侵权?有效解决方案指南

在当今数字时代,影视版权问题成为了许多网站面临的主要挑战。如果你使用苹果CMS进行影视内容管理,可能会遇到版权举报的问题。幸运的是,有一种有效的解决方案可以帮助你应对这些挑战——苹果CMS插件,它能够屏蔽原视频内容&#xf…

网络药理学:2、文章基本思路、各个数据库汇总与比对、其他相关资料(推荐复现的文章、推荐学习视频、论文基本框架、文献基本知识及知网检索入门)

一、文章基本思路(待更) 一篇不含分子对接和实验的纯网络药理学文章思路如下: 即如下: 二、 各个数据库(待更) 三、其他相关资料 1.推荐复现的文章 纯网络药理学分子对接:知网&#xff1…

《C++》解密--顺序表

一、线性表 线性表是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈...... 线性表在【逻辑上】是线性结构…

单调队列的实现

这是C算法基础-数据结构专栏的第二十五篇文章,专栏详情请见此处。 引入 单调队列就是满足单调性的队列,它最经典的应用就是给定一个序列和一个窗口,使窗口在序列中从前向后滑动,求出窗口在每个位置时,其中元素的最大/小…

STM32启用FPU浮点运算

这篇文章产生背景:其他人的文章太杂了,对我这种菜鸡无法接受; 参考文章: stm32h743单片机嵌入式学习笔记7-FPU_stmh743vit4-CSDN博客 stm32F407 打开 FPU(浮点运算处理器)_stm32f407开启fpu-CSDN博客 STM32F4CubeMXHal库下使能…

第J1周:ResNet-50算法实战与解析

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 文章目录 一、前期工作1、ResNet-50总体结构2、设置GPU3、导入数据 二、数据预处理1、加载数据2、可视化数据3、再次检查数据4、配置数据集 三、构建ResNet-50…

初级练习[2]:Hive SQL查询汇总分析

目录 SQL查询汇总分析 成绩查询 查询编号为“02”的课程的总成绩 查询参加考试的学生个数 分组查询 查询各科成绩最高和最低的分 查询每门课程有多少学生参加了考试(有考试成绩) 查询男生、女生人数 分组结果的条件 查询平均成绩大于60分的学生的学号和平均成绩 查询至少…

基于python+django+vue的农业管理系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的农…

C++ push_back和emplace_back的区别

基本类型情况西&#xff0c;两者几乎没什么区别 但是再自定义类型的时候&#xff1f;emplace——back更高效&#xff0c;但是emplace_back 没有类型检查的安全&#xff1b;只有运行时候才会报错。 #include <vector> #include <iostream> using namespace std; …

基于 CycleGAN 对抗网络的自定义数据集训练

目录 生成对抗网络&#xff08;GAN&#xff09; CycleGAN模型训练 训练数据生成 下载开源项目CycleGAN 配置训练环境 开始训练 模型测试 可视化结果 生成对抗网络&#xff08;GAN&#xff09; 首先介绍一下什么是GAN网络&#xff0c;它是由生成器&#xff08;Generator…

分类预测|基于差分优化DE-支持向量机数据分类预测完整Matlab程序 DE-SVM

分类预测|基于差分优化DE-支持向量机数据分类预测完整Matlab程序 DE-SVM 文章目录 一、基本原理DE-SVM 分类预测原理和流程总结 二、实验结果三、核心代码四、代码获取五、总结 一、基本原理 DE-SVM 分类预测原理和流程 1. 差分进化优化算法&#xff08;DE&#xff09; 原理…

【运维监控】Prometheus+grafana监控tomcat运行情况

运维监控系列文章入口&#xff1a;【运维监控】系列文章汇总索引 文章目录 一、prometheus二、grafana三、tomcat与jmx_exporter配置1、下载jmx_exporter2、部署jmx_exporter3、添加tomcat的配置信息4、修改tomcat的启动文件5、重启tomcat及验证6、其他 四、集成prometheus与gr…

vue3 动态 svg 图标使用

前言 在做后台管理系统中,我们经常会用到很多图标,比如左侧菜单栏的图标 当然这里 element-ui 或者 element-plus 组件库都会提供图标 但是在有些情况下 element-ui 或者 element-plus 组件库提供的图标满足不了我们的需求时,这个时候我们就需要自己去网上找一些素材或者…