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

news2024/11/15 21:30:29
一、学习内容

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

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.coloradmin.cn/o/2134079.html

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

相关文章

023.PL-SQL进阶—视图

课 程 推 荐我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈虚 拟 环 境 搭 建 :&#x1…

跨越日语障碍2024轻松实现日语阅读的好帮手

不知道你喜欢看日本小说吗,之前的东野奎吾还有不少日本作家的书籍,如果想看一手的书籍那就只能看日语版本的啦。但是因为语言的问题日语不是很好的小伙伴阅读起来就有一定的难度。今天我就介绍几个日语翻译工具来解决这个问题咯。 1.福昕在线翻译 链接…

简单了解 JVM

目录 ♫什么是JVM ♫JVM的运行流程 ♫JVM运行时数据区 ♪虚拟机栈 ♪本地方法栈 ♪堆 ♪程序计数器 ♪方法区/元数据区 ♫类加载的过程 ♫双亲委派模型 ♫垃圾回收机制 ♫什么是JVM JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机。 虚拟机是指通过软件模…

网络安全培训班有用吗

在当今数字化时代,网络安全问题日益凸显,成为了全球关注的焦点。随着网络攻击的不断升级和复杂化,越来越多的人开始关注网络安全,并考虑参加网络安全培训班来提升自己的技能。那么,网络安全培训班到底有用吗? 一、网络…

如何彻底清除电脑上的数据?保护你的隐私安全

随着科技的飞速发展,电脑已经成为我们日常生活和工作中不可或缺的工具。然而,当我们需要更换电脑、出售旧电脑或处理废旧电脑时,如何彻底清除电脑上的数据成为了一个重要的问题。本文将详细介绍几种彻底清除电脑数据的方法,以确保…

无人机应用新纪元:图形工作站配置推荐与硬件解析

低空经济作为国家新兴的战略性产业,正逐步成为经济高质量发展的新动力。据统计,2023年中国低空经济规模达到5059.5亿元,增速为33.8%,预计到2026年有望突破万亿元大关。政府对低空经济的发展高度重视,不仅出台了相关法规…

IPv6路由基础

RIPng RIPng是一种较为简单的内部网关协议,是RIP在IPv6网络中的应用。RIPng主要用于规模较小的网络中,比如校园网以及结构较简单的地区性网络。由于RIPng的实现较为简单,在配置和维护管理方面也远比OSPFv3和IS-IS for IPv6容易,因…

腾讯地图SDK Android版开发 11 覆盖物示例 4 线

腾讯地图SDK Android版开发 11 覆盖物示例 4 线 前言线的属性介绍ColorType 和 LineTypeColorTypeLineType 与颜色有关的属性填充色和线宽描边颜色和描边的宽度分段颜色渐变色擦除颜色 与纹理相关属性内置纹理自定义颜色纹理线上叠加纹理 虚线 界面布局MapPolyline类常量成员变…

【系统架构设计】基于中间件的开发

【系统架构设计】基于中间件的开发 中间件技术J2EE.NET企业应用集成中间件技术 中间件属于可复用软件的范畴,处于操作系统、网络和数据库之上,应用软件的下层。 J2EE J2EE 是针对 Web Service、业务对象、数据访问和消息报传送的一组规范。这组应用编程接口确定了 Web 应用…

民间故事推广系统小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,民族文化管理,节日类型管理,传统节日管理,故事类型管理,民间故事管理,系统管理 微信端账号功能包括:系统首…

基于SpringBoot+Vue+MySQL的IT技术交流和分享平台

系统展示 用户前台界面 管理员后台界面 系统背景 在数字化转型的浪潮中,构建一个基于SpringBoot、Vue.js与MySQL的IT技术交流与分享平台显得尤为重要。该平台旨在汇聚广大IT从业者、开发者及爱好者,提供一个高效、便捷的线上空间,用于分享最新…

7.类的大小

对于C的类而言,类的大小似乎并非完全由用户控制,我们看看如下的代码。 class X {}; class Y : public virtual X{}; class Z : public virtual X{}; class A : public Y, public Z{}; 上述的X,Y,Z,A中没有任何一个class内含有明显的数据,其…

基本开关稳压器(升压结构+降压结构+逆变结构)

2024-9-14,星期六,7:25,天气:多云,心情:晴。明天就就要迎来三天小长假啦,提前祝大家假期快乐,中秋快乐,幸福美满! 今天继续第11章的学习,主要学习…

FOTA介绍

0 Preface / Foreword 1 FOTA 1.1 FOTA介绍 FOTA:Firmware Over-the-Air (FOTA) 1.2 如何产生FOTA文件 (generate FOTA package) 第一步:打开FOTA package tool 第二步:选择flash download配置文件 文件名:flash_download.cf…

Python 常用模块(一):csv模块

目录 一、csv文件介绍二、csv模块2.1 csv模块介绍2.2 csv 模块的基本功能2.3 reader()方法——读取csv文件2.4 writer()方法——将数据写入csv文件2.5 DictWriter类——创建支持字典的csv文件2.6 DictReader类——创建字典类型的csv文件对象2.7 几个常用属性说明2.7.1 QUOTE_AL…

可怕,就算不点,也能中招!macOS神秘的零点击日历漏洞

你有没有想过,连点击都不需要,你的电脑就可能中招?最近的一个macOS漏洞——“零点击日历邀请漏洞”正是这样,它让人有点毛骨悚然。想象一下,你平时收到的那些日历邀请,可能一不留神就让你的系统陷入危机。而更恐怖的是,你根本不需要做任何操作,攻击就会在你眼皮底下悄无…

开发一款应用程序后要做的四件事

首先恭喜您开发了您的移动应用程序!然而创建高质量的应用程序只是迈向成功的第一步。在当今竞争激烈的市场中,让用户发现您的应用至关重要。这就是应用商店优化 (ASO) 发挥作用的地方。 ASO 是优化应用在 Apple App Store 和 Goog…

ROS2 自定义消息 (ACT模型训练参数化为例)

0. 背景 Ubuntu20.04ROS2 foxyPython3.8 (Anaconda) 项目需要,要将ACT模型训练参数化(GitHub - tonyzhaozh/act)。 Qt UI ROS节点(C):从json配置文件读取训练参数,自定义…

LEAN 赋型唯一性(Unique Typing)之 证明过程简介

LEAN论文在证明赋型唯一性(Unique Typing )时,引入了 n-provability 的概念,通过证明在 n-provability 情况下的赋型唯一性,来证明系统的 赋型唯一性。同时,在证明在 n-provability 情况下的赋型唯一性时&a…

Kubernetes实战——基于Helm安装Redis主从模式

目录 一、Helm介绍 1、三大概念 2、基本命令 二、NFS的安装和使用 1、安装NFS 2、NFS在K8s上使用 三、PV和PVC 1、定义 2、PV和PVC的生命周期 2.1、资源供应 2.2、资源绑定 2.3、资源使用 2.4、资源回收 3、创建PV 4、创建PVC 5、创建测试使用PVC的Pod 四、Stor…