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

基于WIN10的64位系统演示

一、写在前面

上两期,我们讲了多步滚动预测的第两种策略:

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

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

没想到吧,还会有第三期。也是我突然记起的,叫做多模型预测。

2、多步滚动预测 vol-3

什么叫多模型预测呢,我举个例子,大家看便知:

首先,我们还是使用3个数值去预测2个数值。不同的是,这2个数值分别是由2个不同参数的模型(这里都是决策树)进行预测的。

第一个模型的构建如下:

输入

输出

1,2,3

4

2,3,4

6

3,4,5

8

...

...

4由(1,2,3)预测,6由(3,4,5)预测,8由(5,6,7)预测,以此类推。可以理解为,第一个模型专门被训练来预测偶数位的数值。

第二个模型的构建如下:

输入

输出

1,2,3

5

2,3,4

7

3,4,5

9

...

...

5由(1,2,3)预测,7由(3,4,5)预测,9由(5,6,7)预测,以此类推。可以理解为,第二个模型专门被训练来预测奇数位的数值。

最后,再把两个模型的预测结果按顺序拼接起来即可。也就是:模型一出一个4,模型二接上一个5;模型一接上一个6,模型二补上一个7,以此类推。

我们在总结和扩展:假设使用前n个数值去预测下m个数值。如果m=3时,那么就需要构建3个模型,分别预测3个数值,然后依次把这3个数值按顺序拼接在一起。如果m=4时,那么就需要构建4个模型,分别预测4个数值,然后依次把这4个数值按顺序拼接在一起。同理,如果m=d时,那么就需要构建d个模型,分别预测d个数值,然后依次把这d个数值按顺序拼接在一起。以此类推。

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_y = pd.read_csv('data.csv')
data['time'] = pd.to_datetime(data['time'], format='%b-%y')
data_y['time'] = pd.to_datetime(data_y['time'], format='%b-%y')n = 6for 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')]
X_train = train_data[[f'lag_{i}' for i in range(1, n+1)]]
m = 3X_train_list = []
y_train_list = []for i in range(m):X_temp = X_trainy_temp = data_y['incidence'].iloc[n + i:len(data_y) - m + 1 + i]X_train_list.append(X_temp)y_train_list.append(y_temp)# 截断y_train使其与X_train的长度匹配
for i in range(m):X_train_list[i] = X_train_list[i].iloc[:-(m-1)]
y_train_list[i] = y_train_list[i].iloc[:len(X_train_list[i])]

核心部分在于,对于数据的划分,一个X_train,对应m个(本例子中m = 3)Y_train:

X_train_list = []
y_train_list = []
for i in range(m):X_temp = X_trainy_temp = data_y['incidence'].iloc[n + i:len(data_y) - m + 1 + i]X_train_list.append(X_temp)y_train_list.append(y_temp)
# 截断y_train使其与X_train的长度匹配
for i in range(m):X_train_list[i] = X_train_list[i].iloc[:-(m-1)]y_train_list[i] = y_train_list[i].iloc[:len(X_train_list[i])]

这段代码主要用于为多个模型准备训练数据。GPT-4逐行解释:

(a)X_train_list = [] 和 y_train_list = []:初始化两个空列表,分别用于存储多个模型的训练数据和标签。

(b)for i in range(m)::开始一个循环,循环m次,其中m是模型的数量。

(c)X_temp = X_train:将X_train赋值给X_temp。这意味着每个模型的特征数据都相同。

(d)y_temp = data_y['incidence'].iloc[n + i:len(data_y) - m + 1 + i]:这是获取标签数据的关键步骤。它使用iloc来获取一个子集,这个子集的起始点根据循环的迭代而变化。起始点是n + i,而终止点是len(data_y) - m + 1 + i。

这意味着:

对于第一个模型(i=0),我们从第n个数据点开始选择标签。

对于第二个模型(i=1),我们从第n+1个数据点开始选择标签。

对于第三个模型(i=2),我们从第n+2个数据点开始选择标签。

...以此类推。

(e)X_train_list.append(X_temp):将X_temp添加到X_train_list。

(f)y_train_list.append(y_temp):将y_temp添加到y_train_list。

到此为止,我们已经为每个模型创建了训练数据和标签。

接下来,为了确保特征数据和标签数据的长度匹配,我们需要进行截断操作。

(g)for i in range(m)::开始另一个循环,再次循环m次。

(h)X_train_list[i] = X_train_list[i].iloc[:-(m-1)]:这行代码将X_train_list中的每个元素(即特征数据)从末尾截断m-1行。例如,如果m=3,则截断最后2行。

(i)y_train_list[i] = y_train_list[i].iloc[:len(X_train_list[i])]:这行代码确保标签数据的长度与特征数据的长度相匹配。

综上所述,我们得到的X_train_list包含三个相同的输入集(A\B\C);同样,y_train_list包含三个输出集(D\E\F),注意D\E\F的数据不一样。A和D用于训练模型一,B和E用于训练模型二,C和F用于训练模型三。

大家看上图自行体会吧!!!

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)
}best_tree_models = []for i in range(m):grid_search = GridSearchCV(tree_model, param_grid, cv=5, scoring='neg_mean_squared_error')grid_search.fit(X_train_list[i], y_train_list[i])best_tree_model = DecisionTreeRegressor(**grid_search.best_params_)best_tree_model.fit(X_train_list[i], y_train_list[i])best_tree_models.append(best_tree_model)# 为了使validation_data的划分遵循上述的逻辑,我们首先需要确定其开始的时间点
# 这是在train_data最后一个时间点之后的第一个时间点
validation_start_time = train_data['time'].iloc[-1] + pd.DateOffset(months=1)
validation_data = data[data['time'] >= validation_start_time]X_validation = validation_data[[f'lag_{i}' for i in range(1, n+1)]]
y_validation_pred_list = [model.predict(X_validation) for model in best_tree_models]
y_train_pred_list = [model.predict(X_train_list[i]) for i, model in enumerate(best_tree_models)]def concatenate_predictions(pred_list):concatenated = []for j in range(len(pred_list[0])):for i in range(m):concatenated.append(pred_list[i][j])return concatenatedy_validation_pred = np.array(concatenate_predictions(y_validation_pred_list))[:len(validation_data['incidence'])]
y_train_pred = np.array(concatenate_predictions(y_train_pred_list))[:len(train_data['incidence']) - m + 1]mae_validation = mean_absolute_error(validation_data['incidence'], y_validation_pred)
mape_validation = np.mean(np.abs((validation_data['incidence'] - y_validation_pred) / validation_data['incidence']))
mse_validation = mean_squared_error(validation_data['incidence'], y_validation_pred)
rmse_validation = np.sqrt(mse_validation)
print("验证集:", mae_validation, mape_validation, mse_validation, rmse_validation)mae_train = mean_absolute_error(train_data['incidence'][:-(m-1)], y_train_pred)
mape_train = np.mean(np.abs((train_data['incidence'][:-(m-1)] - y_train_pred) / train_data['incidence'][:-(m-1)]))
mse_train = mean_squared_error(train_data['incidence'][:-(m-1)], y_train_pred)
rmse_train = np.sqrt(mse_train)
print("训练集:", mae_train, mape_train, mse_train, rmse_train)

核心代码一,建立m个模型:

for i in range(m):grid_search = GridSearchCV(tree_model, param_grid, cv=5, scoring='neg_mean_squared_error')grid_search.fit(X_train_list[i], y_train_list[i])best_tree_model = DecisionTreeRegressor(**grid_search.best_params_)best_tree_model.fit(X_train_list[i], y_train_list[i])
best_tree_models.append(best_tree_model)

这段代码的目的是为每一个模型(共m个)找到最优的参数,并使用这些参数训练模型,然后保存这些模型。

核心代码二,结果拼接:

def concatenate_predictions(pred_list):concatenated = []for j in range(len(pred_list[0])):for i in range(m):concatenated.append(pred_list[i][j])return concatenatedy_validation_pred = np.array(concatenate_predictions(y_validation_pred_list))[:len(validation_data['incidence'])]
y_train_pred = np.array(concatenate_predictions(y_train_pred_list))[:len(train_data['incidence']) - m + 1]

详细解释 concatenate_predictions 函数并通过一个简单的例子进行说明。

函数的目的是将多个模型的预测结果按照一定的顺序串联起来。

考虑如下情况:

假设我们有3个模型(即m=3),每个模型都为3个月份进行预测。那么,模型的预测列表 pred_list 可能如下所示:

pred_list = [[0.1, 0.2, 0.3],  # 模型1的预测结果[0.4, 0.5, 0.6],  # 模型2的预测结果[0.7, 0.8, 0.9]   # 模型3的预测结果
]

现在,我们想要的串联顺序是:模型1的第1个月预测,模型2的第1个月预测,模型3的第1个月预测,模型1的第2个月预测,模型2的第2个月预测,模型3的第2个月预测,依此类推。

所以,使用 concatenate_predictions 函数处理 pred_list 后的结果应该是:

[0.1, 0.4, 0.7, 0.2, 0.5, 0.8, 0.3, 0.6, 0.9]

这就是 concatenate_predictions 函数的作用,大家看懂了吧!

2.3 输出

三、数据

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

提取码:q41n

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于安卓SVGA浅尝(一)svgaplayer库的使用

关于安卓SVGA浅尝&#xff08;一&#xff09;使用 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发&#xff0c;都会和动画打交道&#xff0c;动画的方案选取&#xff0c;就有很多选择。如Json动画&#xff0c;svga动画&#xff0c;gif等等。各有各的优势。目前项目中…

工具及方法 - 二进制编辑软件

之前介绍过用Notepad和VSCode进行二进制文件编辑。 很多通用型的文本编辑器都会集成二进制文件编辑功能&#xff0c;或者使用插件等形式扩展此项功能。比如vi/vim等工具。 而且&#xff0c;作为文本编辑、二进制文件编辑一类的工具&#xff0c;数量众多&#xff0c;各有特色。…

面试官:为什么说HTTPS比HTTP安全? HTTPS是如何保证安全的?

公众号 小册 这是我整理的学习资料&#xff0c;非常系统和完善&#xff0c;欢迎一起学习 现代JavaScript高级小册 深入浅出Dart 现代TypeScript高级小册 linwu的算法笔记&#x1f4d2; 一、安全特性 在前文中&#xff0c;我们已经了解到HTTP在通信过程中存在以下问题&…

STM32 EtherCAT 总线型(1 拖 4)步进电机解决方案

第 1 章 概述  技术特点  支持标准 100M/s 带宽全双工 EtherCAT 总线网络接口及 CoE 通信协议一 进一出&#xff08;RJ45 接口&#xff09;&#xff0c;支持多组动态 PDO 分组和对象字典的自动映射&#xff0c;支持站 号 ID 的自动设置与保存&#xff0c;支持 SDO 的…

zemaxMIF曲线图

调制传递函数&#xff08; Modulation Transfer Function&#xff0c;MTF &#xff09;是用来形容光学系统成像质量的重要指标。 通过对光学系统像空间进行傅里叶变换&#xff0c;可以得到一张分析图表&#xff0c;来描述像面上对比度和空间频率之间的对应关系。 对比度&…

相机有俯仰角时如何将像素坐标正确转换到其他坐标系

一般像素坐标系转相机坐标系都是默认相机是水平的&#xff0c;没有考虑相机有俯仰角的情况&#xff0c;大致的过程是&#xff1a;像素坐标系统-->图像坐标系-->相机坐标系 ->世界坐标系或雷达坐标系: 像素坐标系 像素坐标系&#xff08;u&#xff0c;v&#xff09;是…

R语言贝叶斯MCMC:GLM逻辑回归、Rstan线性回归、Metropolis Hastings与Gibbs采样算法实例...

原文链接&#xff1a;http://tecdat.cn/?p23236 在频率学派中&#xff0c;观察样本是随机的&#xff0c;而参数是固定的、未知的数量&#xff08;点击文末“阅读原文”获取完整代码数据&#xff09;。 相关视频 什么是频率学派&#xff1f; 概率被解释为一个随机过程的许多观测…

Spring Cloud Gateway快速入门(一)——网关简介

文章目录 前言一、什么是网关1.1 gateway的特点1.2 为什么要使用gateway 二、使用 Nginx 实现网关服务什么是网关服务&#xff1f;为什么选择 Nginx 作为网关服务&#xff1f;如何使用 Nginx 实现网关服务&#xff1f;1. 安装 Nginx2. 配置 Nginx3. 启动 Nginx4. 测试网关服务 …

Windows11 手把手教授开放端口

首先在控制面板点击“系统与安全”&#xff0c;找到防火墙 然后点击“windows defender”打开防火墙 点击左侧目录栏中“高级设置” 点击“入站规则”&#xff0c;再点击新建入站规则&#xff08;开放端口有开放入站端口与开放出站端口之分&#xff0c;这里讲入站端口的开放…

精品Python宠物领养网站系统失物招领

《[含文档PPT源码等]精品基于Python实现的宠物网系统》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;JavaScript、VUE.js&…

华为云云耀云服务器L实例评测|基于L实例安装Prometheus+Grafana插件实现数据可视化监控

文章目录 一、云耀云服务器介绍二、安装Prometheus创建prometheus.service配置文件启动prometheus服务查看prometheus服务进程三、安装node_exporter下载node_exporter组件包创建node_exporter.service配置文件启动node_exproter服务配置prometheus.yml文件访问Prometheus四、安…

php代码审计篇熊海cms代码审计

文章目录 自动审计逐个分析首页index.php文件包含漏洞后台逻辑漏洞cookie绕过登录后台sql报错注入存储型XSS 结束吧 自动审计 看到有很多 逐个分析 首页index.php文件包含漏洞 读一下代码&#xff0c;可以看到很明显的一个文件包含 <?php //单一入口模式 error_repor…

SpringBoot Admin监控平台《二》基础报警设置

一、前置准备 首先搭建监控一个平台和连个客户端&#xff0c;搭建流程见SpringBoot Admin监控平台《一》平台搭建及基础介绍 &#xff0c;搭建完毕之后&#xff0c;启动各个项目&#xff0c;监控平台的界面如下所示&#xff1a; 二、邮件报警 2.1.邮箱授权码获取 授权码主要…

minikube搭建k8s

环境&#xff1a;centos7&#xff0c;docker18 minikube搭建k8s 说明 minikube是最接近原生kubernetes的本地单机版集群&#xff0c;支持大部分kubernetes功能&#xff0c;用于学习和开发k8s。支持Linux、Windows、Mac 官网安装文档 安装前提 一台物理机或者虚拟机&#x…

配置HBase和zookeeper

一、上传文件 二、解压 tar -zxf ./zookeeper-3.4.5-cdh5.14.2.tar.gz -C /opt/soft/ tar -zxf ./hbase-2.3.5-bin.tar.gz -C ../soft/ 三、改名字 mv ./zookeeper-3.4.5-cdh5.14.2/ zk345 mv ./hbase-2.3.5/ hbase235 四、配置映射 vim /etc/profile#ZK export ZOOKEEPE…

宝塔部署node后使用pm2管理上传文件路径失效问题

如何进行文件上传&#xff1f; node上传文件 vue3 elementPlus 组件封装 在本地或者以宝塔终端的形式允许 上传后是没问题的&#xff0c;直接默认对multer直接写入路径就可以了 const multer require(multer) const upload multer({ dest: ./public/avataruploads/ }) …

(十二)VBA常用基础知识:worksheet的各种操作之sheet移动

当前sheet确认 把sheet1移动到sheet3前边 Sub Hello()10Worksheets("Sheet1").Move Before:Worksheets("Sheet3") End Sub3. 把sheet2移动到sheet1后边 Sub Hello()11Worksheets("Sheet2").Move after:Worksheets("Sheet1") End Sub…

ARM 汇编指令集——汇编中三种符号(汇编指令、伪指令、伪操作)、汇编基本格式、数据操作指令、跳转指令、特殊功能寄存器操作指令、内存操作指令、混合编程

目录 一、汇编中三种符号&#xff08;汇编指令、伪指令、伪操作&#xff09; 二、汇编基本格式 三、数据操作指令 3.1 数据搬移指令mov/mvn ① 示例 ② 立即数 3.2 移位操作指令lsl/lsr/asr/ror 示例 3.3 位运算操作指令and/orr/eor/bic ① 示例1 ② 示例2 3.4 算数…

【云计算】从云计算到边缘计算

从云计算到边缘计算 1.前言2.边缘计算概述2.1 边缘计算的定义2.2 边缘计算的价值 3.边缘计算服务商3.1 CDN 服务商3.1.1 Akamai3.1.2 网宿科技 3.2 移动运营商3.2.1 中国移动3.2.2 中国电信3.2.3 中国联通3.3.4 AT&#xff06;T 3.3 硬件厂商3.3.1 Intel3.3.2 Arm 3.4 云计算服…

使用 LangChain 和 Elasticsearch 对私人数据进行人工智能搜索

关于本博文的所有代码可以在地址下载&#xff1a;GitHub - liu-xiao-guo/python-vector-private 我将在本博文中其中深入研究人工智能和向量嵌入的深水区。 ChatGPT 令人大开眼界&#xff0c;但有一个主要问题。 这是一个封闭的托管系统。 在一个被大型网络公司改变的世界里生…