第73步 时间序列建模实战:多步滚动预测 vol-1(以决策树回归为例)

news2024/12/24 8:45:08

基于WIN10的64位系统演示

一、写在前面

上一期,我们讲了单步滚动预测,一次只预测一个值。

既然有单步,有没有多步呢?那肯定有,这一期来介绍多步滚动预测。

然而,多步滚动模型也可以有不同的步骤,我会一一介绍。

2、多步滚动预测 vol-1

顾名思义,多步滚动预测就是使用前n个数值去预测下m个数值。假设,n = 3,m = 2,那么,之前举的例子就变成:使用三个数据点(1,2,3)来预测第4个和第5个数据点(4,5),使用三个数据点(2,3,4)来预测第5个和第6个数据点(5,6),使用三个数据点(3,4,5)来预测第6个和第7个数据点(6,7)。

输入

输出

1,2,3

4,5

2,3,4

5,6

3,4,5

6,7

...

...

发现没,这里有一个问题,预测的结果会出现重合。例如5,可以是(1,2,3)和(2,3,4)预测的结果,问题来了,我们选哪一个呢?

我想到两种方案:

(1)对于重复的预测值,取平均处理。例如,(1,2,3)预测出3.9和4.5,(2,3,4)预测出5.2和6.3,那么拼起来的结果就是3.9,(4.5 + 5.2)/2, 6.3。

(2)删除一半的输入数据集。例如,4,5由(1,2,3)预测,6,7由(3,4,5)预测,删掉输入数据(2,3,4)。

这一期,我们先试一试第一种策略吧。

2.1 数据拆分

import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_absolute_error, mean_squared_error

data = pd.read_csv('data.csv')
data['time'] = pd.to_datetime(data['time'], format='%b-%y')

n = 6  # 使用前3个数据点
m = 2  # 预测接下来的2个数据点

# 创建滞后期特征
for i in range(n, 0, -1):
    data[f'lag_{i}'] = data['incidence'].shift(n - i + 1)

data = data.dropna().reset_index(drop=True)

train_data = data[(data['time'] >= '2004-01-01') & (data['time'] <= '2011-12-31')]
validation_data = data[(data['time'] >= '2012-01-01') & (data['time'] <= '2012-12-31')]

X_train = train_data[[f'lag_{i}' for i in range(1, n+1)]]

# 创建m个目标变量
y_train_list = [train_data['incidence'].shift(-i) for i in range(m)]
y_train = pd.concat(y_train_list, axis=1)
y_train.columns = [f'target_{i+1}' for i in range(m)]
y_train = y_train.dropna()
X_train = X_train.iloc[:-m+1, :]

X_validation = validation_data[[f'lag_{i}' for i in range(1, n+1)]]
y_validation = validation_data['incidence']

看看结果:

2.2 建模与预测

tree_model = DecisionTreeRegressor()
param_grid = {
    'max_depth': [None, 3, 5, 7, 9],
    'min_samples_split': range(2, 11),
    'min_samples_leaf': range(1, 11)
}

grid_search = GridSearchCV(tree_model, param_grid, cv=5, scoring='neg_mean_squared_error')
grid_search.fit(X_train, y_train)
best_params = grid_search.best_params_

best_tree_model = DecisionTreeRegressor(**best_params)
best_tree_model.fit(X_train, y_train)

# 预测验证集
y_validation_pred = []

for i in range(len(X_validation) - m + 1):
    pred = best_tree_model.predict([X_validation.iloc[i]])
    y_validation_pred.extend(pred[0])

# 重叠预测值取平均
for i in range(1, m):
    for j in range(len(y_validation_pred) - i):
        y_validation_pred[j+i] = (y_validation_pred[j+i] + y_validation_pred[j]) / 2

y_validation_pred = np.array(y_validation_pred)[:len(y_validation)]

mae_validation = mean_absolute_error(y_validation, y_validation_pred)
mape_validation = np.mean(np.abs((y_validation - y_validation_pred) / y_validation))
mse_validation = mean_squared_error(y_validation, y_validation_pred)
rmse_validation = np.sqrt(mse_validation)

print(mae_validation, mape_validation, mse_validation, rmse_validation)


# 拟合训练集
y_train_pred = []

for i in range(len(X_train) - m + 1):
    pred = best_tree_model.predict([X_train.iloc[i]])
    y_train_pred.extend(pred[0])

# 重叠预测值取平均
for i in range(1, m):
    for j in range(len(y_train_pred) - i):
        y_train_pred[j+i] = (y_train_pred[j+i] + y_train_pred[j]) / 2

y_train_pred = np.array(y_train_pred)[:len(y_train)]
mae_train = mean_absolute_error(y_train.iloc[:, 0], y_train_pred)
mape_train = np.mean(np.abs((y_train.iloc[:, 0] - y_train_pred) / y_train.iloc[:, 0]))
mse_train = mean_squared_error(y_train.iloc[:, 0], y_train_pred)
rmse_train = np.sqrt(mse_train)

print(mae_train, mape_train, mse_train, rmse_train)

解读:

这里的核心代码在于提取出重复值进行平均运算:

# 重叠预测值取平均

for i in range(1, m):

    for j in range(len(y_validation_pred) - i):

        y_validation_pred[j+i] = (y_validation_pred[j+i] + y_validation_pred[j]) / 2

y_validation_pred = np.array(y_validation_pred)[:len(y_validation)]

解释:

在多步滚动预测中,当我们每次都用前n个数去预测后面的m个数时,如果m大于1,那么就会出现预测值重叠的情况。为了具体解释哪些是重叠的数值,我们可以通过以下步骤来描述:

每次我们使用前n个数预测后m个数时,第一次预测的结果是为了得到下一个到第m个数值的预测。

当我们移动到下一个数据点并再次使用前n个数进行预测时,我们预测的第一个数值与上一次预测的第二个数值是相同的时间点的预测,因此它们是重叠的。同理,第二个数值与上一次预测的第三个数值重叠,依此类推。

所以,每次移动一个数据点并进行预测时,前m-1个预测结果都与上一次的预测结果存在重叠。

以n=3和m=2为例:

使用数据点1,2,3预测得到4和5。

使用数据点2,3,4预测得到5和6。

这里,两次预测中的数值5是重叠的。

为了判断哪些是重叠的数值,我们可以这样理解:在多次连续的预测中,除了第一次预测的结果,后面的每次预测的前m-1个数值都是与上次预测结果的最后m-1个数值重叠的。

在代码中,这正是为什么我们要有两层循环,外层循环i控制重叠的深度(从1到m-1),内层循环j则是遍历整个预测结果列表。

最后,看看结果吧:

三、数据

链接:https://pan.baidu.com/s/1EFaWfHoG14h15KCEhn1STg?pwd=q41n

提取码:q41n

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

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

相关文章

Mac电脑运行太卡怎么办?

许多小伙伴使用Mac后都反馈电脑不如想象中的流畅&#xff0c;甚至有点卡顿的现象&#xff0c;原因可能是因为无用的应用占据了过多的内存&#xff0c;或者是系统盘垃圾过多&#xff0c;导致的电脑卡顿现象。 今天小编教给大家几招&#xff0c;让自己的Mac能够一键重生&#xf…

创造性地解决冲突

1、冲突的根本原因是矛盾双方存在不可调和的目标冲突。 2、要知己知彼&#xff1a; 知己&#xff1a;就是对自己的问题、需求进行客观定义&#xff0c;说明需求和问题的意义或价值、阐述解决方案和期望效果&#xff1b; 知彼&#xff1a;站在对方立场&#xff0c;深挖对方真…

探索AIGC人工智能(Midjourney篇)(四)

文章目录 Midjourney模特换装 Midjourney制作APP图标 Midjourney网页设计 Midjourney如何生成IP盲盒 Midjourney设计儿童节海报 Midjourney制作商用矢量插画 Midjourney设计徽章 Midjourney图片融合 Midjourney后缀参数 Midjourney模特换装 关键词生成模特照片 中国女性模特的…

虚拟机Ubuntu操作系统常用终端命令(3)(详细解释+详细演示)

本篇概要 本篇讲述了Ubuntu操作系统常用的几个功能&#xff0c;即修改文件权限、修改文件属性、可执行脚本、虚拟机网络、FTP服务器、SSH服务器、VIM等方面的知识。希望能够得到大家的支持。 文章目录 本篇概要1.修改文件权限2.修改文件属主3.可执行脚本3.1要点与细节3.2shell…

河北吉力宝打造步力宝智能康养鞋,助力健康中国行

据国家统计局数据&#xff0c;2022年我国总人口减少85万人&#xff0c;正式迈入人口负增长时代。人口老龄化程度的进一步加深令劳动力愈加不足&#xff0c;加之“421”的家庭结构&#xff0c;仅依靠政府性养老事业已难以支撑。 当老年群体对品质消费越来越看重时&#xff0c;康…

9万多条执业医师资格考试题库ACCESS数据库

《9万多条执业医师资格考试题库ACCESS数据库》搜集了大量执业医师资格考试试题&#xff0c;包括临床执业医师资格考试试题、口腔执业医师资格考试试题、中医执业医师资格考试试题、中西医结合执业医师资格考试试题、公卫执业医师资格考试试题等。 分类情况包含&#xff1a;临床…

MT4深受投资者喜欢,anzo capital昂首资本认为这几个特点必不可少

MT4为什么深受投资者喜欢&#xff0c;anzo capital昂首资本总结这几个特点&#xff0c;一起分享给各位投资者。 一.专业性 MT4平台是专门为外汇投资交易而设计的。投资者可以在指数、股票、债券、商品和各种货币上交易货币和差价合约。 二.兼容性 MT4不仅可用于32位操作系统…

对于每种情况分别统计概率来计算期望+树上连通块统计:ARC165E

https://atcoder.jp/contests/arc165/tasks/arc165_e 考虑一个常见套路&#xff0c;我们对每个连通块统计其概率&#xff0c;设为 p ( T ) p(T) p(T)&#xff0c;则答案为 ∑ ∣ T ∣ > k p ( T ) \sum_{|T|>k} p(T) ∣T∣>k∑​p(T) 可以想成对于每个大小大于 k …

RockyLinux安装MariaDB

文章目录 1 前言2 参考3 开始安装3.1 运行官方脚本 添加 MariaDB 的源3.2 安装 MariaDB Server3.3 启动 MariaDB 4 SSH 登录 MariaDB4.1 ssh 上使用 root 账号登录4.2 新建管理员账号并授权 5 放行端口 33065.1 VirtualBox 上设置端口转发5.2 Rocky Linux 防火墙放行 3306 端口…

nacos服务端--切换数据源

nacos服务端版本&#xff1a;2.3.0-SNAPSHOT 在nacos的服务端&#xff0c;需改application.properties文件 #*************** Config Module Related Configurations ***************# ### Deprecated configuration property, it is recommended to use spring.sql.init.platf…

BK698CPA15B0 创建了通用电气数字工业发展指数

BK698CPA15B0 创建了通用电气数字工业发展指数 基于调查研究&#xff0c;通用电气创建了通用电气数字工业发展指数&#xff0c;以跟踪数字化转型的实际进展——从对IIoT的展望到准备好转型。该创始指数在100分制中的总得分为63&#xff0c;表明尽管工业互联网的前景非常强劲&a…

3.2-3.4 Qt样式表使用补充说明

本期内容 3.2 设置样式的几种方式—— 3.2.1 不同方式使用介绍—— 3.2.2 不同方式的优缺点3.3 样式表使用过程中产生的冲突-分析及解决3.4 各控件中常用样式讲解及说明3.2 设置样式的几种方式 我们通常在使用Qt开发的过程中都会使用样式表来美化我们的界面,关于如何使用样式…

input修改checkbox复选框默认选中样式

问题描述&#xff1a; <input type"checkbox" /> input修改checkbox默认选中样式&#xff0c;直接设置选中后的样式不生效&#xff0c;需要先给复选框设置-webkit-appearance: none&#xff08;取消默认样式&#xff09;&#xff0c; 再设置样式才会生效。 …

Vue中的路由懒加载:提高性能和用户体验

Vue中的路由懒加载&#xff1a;提高性能和用户体验 在现代Web应用程序中&#xff0c;性能和用户体验是至关重要的。为了加速页面加载速度和提高用户感知的响应性&#xff0c;Vue提供了一种路由懒加载的方法。本文将详细介绍Vue中如何进行路由懒加载&#xff0c;并提供代码示例…

充分利用学习平台,提升个人职业竞争力

在当今竞争激烈的职场环境中&#xff0c;个人职业竞争力的提升变得至关重要。而充分利用学习平台成为了我们提升竞争力的一种有效途径。学习平台不仅可以提供丰富多样的学习资源&#xff0c;还能提升个人技能和知识水平&#xff0c;让我们更具竞争力。 学习平台提供了丰富的学…

图扑邀您共聚 IOTE 国际物联网展·深圳站 | 展会预告

参展时间&#xff1a;9 月 20 日- 22 日 图扑展位&#xff1a;9 号馆 9B 35-1 参展地址&#xff1a;深圳国际会展中心&#xff08;宝安新馆&#xff09; IOTE 2023 第二十届国际物联网展深圳站&#xff0c;将于 9 月 20 日- 22 日在深圳国际会展中心&#xff08;宝安&#xff0…

Python 之利用matplotlib.pyplot 生成图形和图表

文章目录 介绍运用 介绍 matplotlib.pyplot是Matplotlib库的一个子模块&#xff0c;它提供了一个简单的界面来创建各种类型的图形和图表。使用pyplot&#xff0c;您可以轻松创建、定制和显示图形&#xff0c;而无需编写大量的底层代码。以下是matplotlib.pyplot的一些常见用法…

Vue Router最佳实践,以确保你的Vue.js应用的路由管理清晰、可维护和高效

文章目录 路由结构设计命名路由动态路由参数导航守卫命名视图 (Named Views)懒加载路由错误处理 ✍创作者&#xff1a;全栈弄潮儿 &#x1f3e1; 个人主页&#xff1a; 全栈弄潮儿的个人主页 &#x1f3d9;️ 个人社区&#xff0c;欢迎你的加入&#xff1a;全栈弄潮儿的个人社区…

【面试经典150 | 双指针】判断子序列

文章目录 写在前面Tag题目来源题目解题解题思路方法一&#xff1a;双指针方法二&#xff1a;动态规划 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对…

如何在Gazebo中实现多机器人编队仿真

文章目录 前言一、仿真前的配置二、实现步骤1.检查PC和台式机是否通讯成功2.编队中对单个机器人进行独立的控制3、对机器人进行编队控制 前言 实现在gazebo仿真环境中添加多个机器人后&#xff0c;接下来进行编队控制&#xff0c;对具体的实现过程进行记录。 一、仿真前的配置…