用Python实现时间序列模型实战——Day 17: 时间序列模型的评估方法

news2024/9/20 0:02:52
一、学习内容
1. 预测误差的评估指标

在时间序列预测中,常用的评估指标包括 MAE (Mean Absolute Error), MSE (Mean Squared Error) 和 RMSE (Root Mean Squared Error)。这些指标用于衡量模型的预测误差。

  • MAE (Mean Absolute Error): MAE 衡量预测值与实际值之间的平均绝对误差,公式为:

\text{MAE} = \frac{1}{n} \sum_{i=1}^{n} |y_i - \hat{y}_i|

其中,y_i​ 是实际值,\hat{y}_i 是预测值,n 是样本数量。

  • MSE (Mean Squared Error): MSE 衡量预测值与实际值之间的平均平方误差,公式为:

\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2

  • RMSE (Root Mean Squared Error): RMSE 是 MSE 的平方根,用于衡量预测误差的大小,公式为:

\text{RMSE} = \sqrt{\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2}

2. 交叉验证在时间序列中的应用

在时间序列中,交叉验证的使用不同于普通数据,因为时间序列有时间依赖性。常见的时间序列交叉验证方法是 时间序列滚动窗口法 (Time Series Cross-Validation)。这种方法通过固定训练集,逐步扩大测试集的方式进行交叉验证,保证模型仅使用过去的数据进行预测。

3. 时间序列模型的稳定性分析

模型稳定性 指的是模型在未来时间步中的性能是否能够保持一致。通过分析预测误差随时间的变化情况,我们可以评估模型的稳定性。

二、实战案例

使用不同时间序列模型评估其预测性能,在这个案例中,我们将使用 ARIMA 模型和 Holt-Winters 模型进行预测,评估它们的性能,并使用滚动窗口法进行交叉验证。

1. 数据生成
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from sklearn.metrics import mean_absolute_error, mean_squared_error

# 生成模拟的时间序列数据
np.random.seed(42)
n_obs = 150
time = pd.date_range(start='2000-01-01', periods=n_obs, freq='M')
data = 0.5 * np.arange(n_obs) + np.random.normal(0, 1, n_obs)

# 创建数据框
ts_data = pd.DataFrame({'Date': time, 'Value': data})
ts_data.set_index('Date', inplace=True)

# 绘制时间序列
plt.figure(figsize=(10, 6))
plt.plot(ts_data['Value'], label='Original Data')
plt.title('Simulated Time Series Data')
plt.legend()
plt.show()

代码解释:

  • 生成了一个带有线性趋势和噪声的模拟时间序列。

结果输出:

2. 模型构建与预测
# 构建 ARIMA 模型 (p=1, d=1, q=1)
arima_model = ARIMA(ts_data['Value'], order=(1, 1, 1)).fit()

# 进行一步预测
arima_forecast = arima_model.forecast(steps=12)

# 构建 Holt-Winters 模型
hw_model = ExponentialSmoothing(ts_data['Value'], trend='add', seasonal=None).fit()
hw_forecast = hw_model.forecast(steps=12)

代码解释:

  • 使用 ARIMA 和 Holt-Winters 模型分别对数据进行拟合,并进行未来 12 个月的预测。

3. 模型评估

# 评估 ARIMA 模型的 MAE, MSE, RMSE
arima_mae = mean_absolute_error(ts_data['Value'][-12:], arima_forecast)
arima_mse = mean_squared_error(ts_data['Value'][-12:], arima_forecast)
arima_rmse = np.sqrt(arima_mse)

# 评估 Holt-Winters 模型的 MAE, MSE, RMSE
hw_mae = mean_absolute_error(ts_data['Value'][-12:], hw_forecast)
hw_mse = mean_squared_error(ts_data['Value'][-12:], hw_forecast)
hw_rmse = np.sqrt(hw_mse)

# 打印评估结果
print(f"ARIMA - MAE: {arima_mae}, MSE: {arima_mse}, RMSE: {arima_rmse}")
print(f"Holt-Winters - MAE: {hw_mae}, MSE: {hw_mse}, RMSE: {hw_rmse}")

代码解释:

  • 使用 MAE、MSE 和 RMSE 三个指标对模型的预测性能进行评估,并输出结果。MAE 评估绝对误差,MSE 评估平方误差,RMSE 评估误差的平方根。

结果输出:

ARIMA - MAE: 3.0684361288958293, MSE: 12.956223363680662, RMSE: 3.599475428959151
Holt-Winters - MAE: 6.07368718610084, MSE: 37.78886789846922, RMSE: 6.1472650746872155
4. 交叉验证
# 交叉验证 - 滚动窗口法
window_size = 120
rolling_mae, rolling_mse, rolling_rmse = [], [], []
for i in range(window_size, n_obs):
    train = ts_data['Value'][:i]
    test = ts_data['Value'][i:i+1]
    
    model = ARIMA(train, order=(1, 1, 1)).fit()
    forecast = model.forecast(steps=1)
    
    # 计算滚动窗口内的误差
    rolling_mae.append(mean_absolute_error(test, forecast))
    rolling_mse.append(mean_squared_error(test, forecast))
    rolling_rmse.append(np.sqrt(mean_squared_error(test, forecast)))

代码解释:

  • 使用滚动窗口法进行交叉验证,每次滚动一个时间步,对下一个时间点进行预测。通过滚动预测,计算每个时间点的预测误差。

5. 误差可视化

# 绘制滚动窗口的预测误差
plt.figure(figsize=(10, 6))
plt.plot(range(window_size, n_obs), rolling_mae, label='MAE')
plt.plot(range(window_size, n_obs), rolling_rmse, label='RMSE')
plt.title('Rolling Forecast Error (Cross-Validation)')
plt.legend()
plt.show()

代码解释:

  • 绘制滚动窗口法中的预测误差变化情况,展示了预测误差随时间的变化趋势。

结果输出:

三、结果分析

1. ARIMA 和 Holt-Winters 模型的预测性能
  • 从输出的 MAE、MSE 和 RMSE 值可以看出,两个模型的预测误差。通常 RMSE 用于评估模型的预测性能,值越小表明模型预测效果越好。
2. 滚动窗口的预测误差分析
  • 随着时间的推移,预测误差(MAE 和 RMSE)可以帮助我们判断模型的稳定性。如果误差波动较小,模型预测性能较为稳定;如果误差逐渐增大,表明模型可能存在过拟合或不适应未来趋势的情况。

四、总结

通过本次案例学习,我们详细了解了时间序列模型的评估方法,尤其是通过 MAE、MSE 和 RMSE 来衡量模型的预测误差。此外,滚动窗口交叉验证方法在时间序列数据中的应用,可以帮助我们更好地评估模型在不同时间点上的稳定性和预测能力。

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

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

相关文章

mysql学习教程,从入门到精通,MySQL WHERE 子句(10)

1、SQL WHERE 子句 在本教程中,您将学习如何使用SQL从表中选择特定记录。 根据条件选择记录 在上一章中,我们学习了如何从表或表列中获取所有记录。但是,在现实世界中,我们通常只需要选择,更新或删除满足某些条件的那…

HarmonyOS---应用测试概述

一、应用质量要求 应用质量要求分为应用体验质量建议和应用内容合规要求两大部分。 1、应用体验质量建议 功能数据完备、基础体验要求、HarmonyOS特征增强体验要求。 (1)功能数据完备 (2)基础体验要求 (3)增…

盘古信息IMS 驱动智能工厂建设,助力制造企业降本增效

随着全球化的加剧和市场竞争的日益激烈,制造业面临着提高生产效率、降低成本、提升产品质量以及实现绿色可持续发展等多重压力。智能工厂是利用人工智能、大数据、物联网、云计算等新技术,实现工厂的智能化、自动化、可持续化发展的新型制造业模式&#…

《深度学习》OpenCV 高阶 图像直方图、掩码图像 参数解析及案例实现

目录 一、图像直方图 1、什么是图像直方图 2、作用 1)分析图像的亮度分布 2)判断图像的对比度 3)检测图像的亮度和色彩偏移 4)图像增强和调整 5)阈值分割 3、举例 二、直方图用法 1、函数用法 2、参数解析…

芋道快速开发平台的使用心得

1.前端版本 项目的管理后台有 4 个版本: yudao-ui-admin-vue3 (opens new window):基于 Vue3 element-plus yudao-ui-admin-vben (opens new window):基于 Vue3 vben(ant-design-vue) yudao-ui-admin-vue2 (opens new window)&#xff…

LaTeX中制作表格【表格数据自动换行】(附latex源码)

一、latex软件推荐 在使用LaTeX进行文档编写时,有几款非常受欢迎且功能强大的软件和在线编辑器可供选择。以下是一些推荐的LaTeX软件: 1. Overleaf(强烈推荐) Your Projects - Overleaf, Online LaTeX Editorhttps://www.overleaf.com/project 2.Tex…

图新说【消防】(一步步的做好态势标绘)

0.序 越来越多的消防战士使用图新说来做消防预案,态势标绘比武等。 图新说即可应用于具体的消防救援任务,制作具体的作战方案,让战士的配合更加紧密。 也可以做大型的消防预案,针对辖区内的重点建筑、危化存储区提前做应急救援方…

最新版MYMPay码支付开源版系统源码_个人免签支付_聚合支付系统

最新版MYMPay码支付开源版系统源码_个人免签支付_聚合支付系统 安装环境: PHP:7.0-8.2 (推荐使用7.4) 需要安装Xload 扩展 MySQL:5.6版本 访问 http://你的域名/install 进行安装 后台地址:http://你的域名/Admin/ 账号&am…

C++笔记之map的实用操作

C++笔记之map的实用操作 文章目录 C++笔记之map的实用操作1.初始化1.1.使用列表初始化1.2.使用 `insert` 方法1.3.使用 `emplace` 方法1.4.复制构造1.5.移动构造2.赋值2.1.列表赋值2.2.插入元素2.3.批量插入3.取值3.1.使用 `[]` 操作符3.2.使用 `at()` 方法3.3.检查键是否存在3…

C++设计模式——State状态模式

一,状态模式的定义 状态模式是一种行为型设计模式,状态模式允许对象在内部状态发生切换时改变它自身的行为。 状态模式的主要目的是将复杂的状态切换逻辑抽象化为一组离散的状态类,使代码结构更加清晰和易于维护。 状态模式将对象的行为封…

【spring】IDEA 新建一个spring boot 项目

参考新建项目-sprintboot 选择版本、依赖,我选了一堆 maven会重新下载一次么?

Vue(8)——v-model原理

v-model 原理:v-model本质上是一个语法糖。例如应用在输入框上&#xff0c;就是value和input事件的合写。 作用&#xff1a;提供数据的双向绑定。 数据变&#xff0c;视图跟着变 :value视图变&#xff0c;数据跟着变 input <template><div><input v-model&quo…

【智能体】浅谈大模型之AI Agent

随着ChatGPT推出插件和函数调用功能&#xff0c;构建以LLM&#xff08;大语言模型&#xff09;为核心控制器的AI Agent愈发成为一个拥有无限可能的概念。 AI Agent是一种超越简单文本生成的人工智能系统。它使用大型语言模型&#xff08;LLM&#xff09;作为其核心计算引擎&am…

如何将JSON字符串里面的某个字段的json字符串格式转成json对象?

目录标题 背景临时方案最好的方案 背景 下游传过来的数据是一个json字符串&#xff0c;这个json字符串里面有的字段又套着json字符串&#xff01;还有一些字段直接是null传过来的&#xff01;现在要去掉null&#xff0c;且将一些json字符串&#xff01;尽可能的换成json对象&a…

UE4_后期处理_后期处理材质及后期处理体积一

后期处理效果 在渲染之前应用于整个渲染场景的效果。 后期处理效果&#xff08;Post-processing effect&#xff09;使美术师和设计师能够对影响颜色、色调映射、光照的属性和功能进行组合选择&#xff0c;从而定义场景的整体外观。要访问这些功能&#xff0c;可以将一种称为…

[转]什么是工作流,flowable 与 Activiti对比

工作流 什么是工作流工作流是复杂版本的状态机Java工作流开源框架工作流对比 Activiti 设计器Flowable 兼容性Camunda 设计器兼容性&#xff1a;小结&#xff1a;社区活跃度 FlowableActivitiCamunda总结 什么是工作流 工作流&#xff0c;是指“业务​过程的部分或整体在​计算…

面试题:try和finally中都出现了return语句会发生什么情况

答&#xff1a;会导致提前返回&#xff0c;即执行finally中的return语句&#xff0c;try中的return语句不会被执行。 原因&#xff1a;当try中有return语句时&#xff0c;会延迟返回&#xff0c;即先执行完finally的代码&#xff0c;再执行try的return语句&#xff0c;这样做的…

在windows下抓空包(monitor网卡+wareshark+MNM)

当我们的电脑是通过网线联网时&#xff0c;我们可以通过wareshark来抓取通过网口发送和接收到的包&#xff0c;其中包括单播包、多播包以及广播包等等&#xff0c;只要这个包是通过目标网口的。 但是&#xff0c;如果是无线包呢&#xff1f;我们的无线包其实也是通过无线网卡来…

多目标优化及其MATLAB实现

目录 引言 多目标优化的数学模型 非劣解与Pareto前沿 多目标优化求解方法 MATLAB多目标优化工具 多目标规划中的重要概念 表格总结&#xff1a;常见多目标优化方法及其特点 MATLAB在多目标优化中的应用 结论 引言 多目标优化问题在实际应用中非常常见&#xff0c;因为…

ai学习(2)分词、分词算法、加入注意力机制的Seq2Seq结构模型(编码器、解码器、注意力机制)、日期转换实战代码

文章目录 参考书《多模态大模型&#xff1a;算法、应用与微调》1.分词2.分词算法主流的三种分词算法&#xff0c;BPE分词算法&#xff08;GPT-2、BART、Llama模型&#xff09;、WordPiece分词算法&#xff08;BERT模型&#xff09;、SentencePiece分词算法&#xff08;ChatGLM、…