第72步 时间序列建模实战:单步滚动预测(以决策树回归为例)

news2025/1/13 16:55:13

基于WIN10的64位系统演示

一、写在前面

从这一期开始,我们开始基于python构建各种机器学习和深度学习的时间序列预测模型,本质上就是调用各种模型的回归分析的属性。所以很多模型其实之前都介绍过,比如说决策树、SVM等等。

同样,这里使用这个数据:

《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Renal Syndrome in Jiangsu Province, China》文章的公开数据做演示。数据为江苏省2004年1月至2012年12月肾综合症出血热月发病率。运用2004年1月至2011年12月的数据预测2012年12个月的发病率数据。

首先,我们从最简单的决策树开始。建模是其次,主要是介绍时间序列预测的一些常见策略和方法。

二、时间序列预测的策略:单步滚动预测

(1)滞后期(lag)

假设我们有一组时间序列数据:1,2,3,4,5,6,7,8,这是一个由8个数字构成的序列。我们的目标是基于这个1至8的序列来预测接下来的6个数字,也就是9,10,11,12,13,14。

在机器学习建模的过程中,我们需要确定模型的“输入”和“输出”。因此,我们面临的首要问题是:在训练模型时,时间序列数据的输入和输出应该是什么?

这个问题可以被重新表述为:你计划使用前几个数字来预测下一个数字?

例如,如果我们选择使用一个数字来预测下一个数字,那么就会是1预测2,2预测3,以此类推。

输入

输出

1

2

2

3

3

4

...

...

或者,我们可以选择使用四个数字来预测下一个数字,那么就会是1,2,3,4预测5,2,3,4,5预测6。

输入

输出

1,2,3,4

5

2,3,4,5

6

3,4,5,6

7

...

...

简单来说,我们正在尝试从时间序列数据中分解出输入和输出,以便将其输入到模型中进行训练。这里的“一”和“四”被称为滞后期(lag),它们代表了我们用于预测的历史数据的长度。

因此,我们需要中Python干这件事:

使用的咒语:读取data.csv文件的数据,使用决策树建立一个时间序列预测模型。使用2004年1月至2011年12月的数据进行训练,采用2002年1月至2012年12月的数据作为验证集。滞后期(lag)暂时设置为6,也就是使用前6个数字预测地7个数值。决策树模型采用网格搜索进行参数寻优。

请一步一步进行,每一步运行好用保存好结果,我说继续,你再继续。

代码如下:

# 读取数据
import pandas as pd

data = pd.read_csv('data.csv')
data.head()

# 将时间列转换为日期格式
data['time'] = pd.to_datetime(data['time'], format='%b-%y')
# 显示转换后的前几行数据
data.head()

#拆分输入和输出
lag_period = 6

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

# 删除包含NaN的行
data = data.dropna().reset_index(drop=True)

看看输出:

原始数据被拆分成这种矩阵,大家仔细看肯定能看出规律,比如,对角线的数值都是一致的。

(2)数据集拆分

代码如下:

# 划分训练集和验证集
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')]
train_data.shape, validation_data.shape
# 定义特征和目标变量
X_train = train_data[['lag_1', 'lag_2', 'lag_3', 'lag_4', 'lag_5', 'lag_6']]
y_train = train_data['incidence']
X_validation = validation_data[['lag_1', 'lag_2', 'lag_3', 'lag_4', 'lag_5', 'lag_6']]
y_validation = validation_data['incidence']
X_train.shape, X_validation.shape

但是,这其实有一个问题:验证集是不能用的。

让我们以一个具体的例子来阐明另一个概念:

假设我们有一组时间序列数据:1,2,3,4,5,6,7,8,其中滞后期设定为3。

在训练集中,我们使用前三个数据点(1,2,3)来预测第四个数据点(4),然后使用(2,3,4)来预测第五个数据点(5),以此类推,直到使用(3,4,5)来预测第六个数据点(6)。

接下来,我们面临的问题是如何构建验证集。请注意,在这个阶段,我们只知道数据点1,2,3,4,5,6,而数据点7和8对我们来说是未知的。

首先,预测第七个数据点相对简单,我们可以使用已知的数据点(4,5,6)来预测7。但是,当我们尝试预测第八个数据点时,就会遇到问题。如果我们试图用(5,6,7)来预测8,问题在于,这里的7是未知的。

正确的做法应该是,首先使用(4,5,6)预测出一个估计的第七个数据点,记作7#。然后,我们再使用(5,6,7#)来预测第八个数据点。这个过程被称为滚动预测,希望这样的解释能帮助大家理解。

因此,划分的验证集,其实就第一行的数据可以用!

(3)建立模型和滚动预测

(3.1)决策树回归模型

#建立模型
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import GridSearchCV

# 初始化决策树模型
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_params

import numpy as np
from sklearn.metrics import mean_absolute_error, mean_squared_error

# 使用最佳参数初始化决策树模型
best_tree_model = DecisionTreeRegressor(**best_params)

# 在训练集上训练模型
best_tree_model.fit(X_train, y_train)

解读:

(a)其实吧,也就是换了一个函数:DecisionTreeRegressor();这个是决策树的回归函数,我们之前最分类用的是它的分类函数,仅此而已。

(b)其次,在拟合模型的时候:grid_search = GridSearchCV(tree_model, param_grid, cv=5, scoring='neg_mean_squared_error'),scoring换成均方误差的负值。为什么使用负值呢?因为GridSearchCV的默认行为是认为分数(score)越大越好,而对于均方误差来说,值越小表示模型越好。通过使用负值,我们可以使GridSearchCV在优化时选择最小的均方误差。其他可选的还有:

--neg_mean_squared_error: 负均方误差

--neg_mean_absolute_error: 负平均绝对误差

--neg_median_absolute_error: 负中位绝对误差

--r2: R^2(决定系数)

(3.2)滚动预测

看代码:

# 对于验证集,我们需要迭代地预测每一个数据点
y_validation_pred = []

for i in range(len(X_validation)):
    if i == 0:
        # 使用最后一个训练集的数据预测验证集的第一个数据点
        pred = best_tree_model.predict([X_validation.iloc[0]])
    else:
        # 使用前面预测出的数据构建新的特征,然后预测下一个数据点
        new_features = list(X_validation.iloc[i, 1:]) + [pred[0]]  # 将前面的特征向前移动,并使用上一次的预测作为最新的特征
        pred = best_tree_model.predict([new_features])
    y_validation_pred.append(pred[0])

y_validation_pred = np.array(y_validation_pred)

解读:

上面已经说了原理,这个只是代码实现。大家看注释,基本也看得懂了。

(4)模型评价

代码如下:

# 计算验证集上的MAE, MAPE, MSE和RMSE
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)
mae_validation, mape_validation, mse_validation, rmse_validation

# 计算训练集上的MAE, MAPE, MSE和RMSE
y_train_pred = best_tree_model.predict(X_train)
mae_train = mean_absolute_error(y_train, y_train_pred)
mape_train = np.mean(np.abs((y_train - y_train_pred) / y_train))
mse_train = mean_squared_error(y_train, y_train_pred)
rmse_train = np.sqrt(mse_train)
mae_train, mape_train, mse_train, rmse_train

直接看结果吧:

以上,就是时间序列预测的一种策略:单步滚动预测。因此,一次只预测一个值。

既然有单步,有没有多步呢?

那肯定有,下次再说。

三、数据

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

提取码:q41n

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

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

相关文章

【踩坑篇】代码中使用 Long 作为 Map的Key存在的问题

本周的工作结束&#xff0c;详述一些在项目代码中实际遇到的一些坑。 代码中遇到这样一个场景&#xff1a; 有个业务接口&#xff0c;接口返回的值是一个JSON格式的字符串&#xff0c;通过JSON解析的方式&#xff0c;解析为格式为&#xff1a; Map<Long, Map<String, O…

数据结构——时间复杂度与空间复杂度

目录 一.什么是空间复杂度与时间复杂度 1.1算法效率 1.2时间复杂度的概念 1.3空间复杂度的概念 二.如何计算常见算法的时间复杂度 2.1大O的渐近表示法 使用规则 三.如何计算常见算法的空间复杂度 3.1 大O渐近表示法 3.2 面试题——消失的数字 3.3 面试题——旋转数组 一…

ChatGPT是留学生的论文神器还是学术不端的罪魁祸首?

当今时代&#xff0c;ChatGPT无疑是大数据和人工智能的完美结合&#xff0c;成为了搜索技术的革命性创新。几秒钟&#xff0c;一篇逻辑清晰、观点鲜明、有充分论据支持的文章即可生成。这种革命性的创新在学术界掀起了巨大的浪潮&#xff0c;甚至让全球的学校开始思考&#xff…

【GAN入门】生成 AI的概念

一、说明 GAN是生成对抗网络&#xff08;Generative Adversarial Network&#xff09;的缩写&#xff0c;是一种无监督学习算法&#xff0c;由Goodfellow等人于2014年提出。GAN由一个生成器网络和一个判别器网络组成&#xff0c;通过二者之间的对抗来训练生成器网络生成与真实样…

深入了解Python数据类型及应用

Python提供了一组丰富的内置数据类型&#xff0c;使您能够在程序中处理不同类型的数据。核心数值类型包括整数、浮点数和复数。整数表示整数&#xff0c;对于精确的计数和计算非常有用。 浮点数表示具有小数精度的实数&#xff0c;这对科学和统计计算非常重要。复数将数字扩展到…

C++系列赋值运算符重载

赋值运算符重载 类的默认函数拷贝构造函数和赋值运算符 重载赋值运算符相关注意事项 类的默认函数 一个类至少有4个默认函数&#xff1a; 默认构造函数拷贝构造函数析构函数赋值运算符重载函数 拷贝构造函数和赋值运算符 拷贝构造函数是在创建类的时候调用的&#xff0c;之…

利用PCA科学确定各个指标的权重系数

背景参考: 1、提取主成分 对样本进行PCA分析,查看不同变量贡献率,确定主要的指标。我们可以通过下列代码获取需要的所有数据: import numpy as np from sklearn.decomposition import PCA# 创建一个数据 np.random.seed(0) data = np.random.random((100,5)) y = np.ra…

深入理解CI/CD流程:改变你的开发生命周期

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

投后管理系统的主要功能及开发

投后管理系统是一种用于跟踪和管理投资组合中的投资的工具&#xff0c;通常由私募股权、风险投资公司、资产管理公司和投资者使用。其主要功能包括以下内容&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合…

全新跑分软件GeekRUN-7问世

实测非常好用CPU跑分神器点击下载 感兴趣的可以测测你的手机跑的多少。 我的峰值是7340&#xff0c;低值是4685&#xff0c;测试时后台不能有任何APP

丙烯酸共聚聚氯乙烯树脂

声明 本文是学习GB-T 42790-2023 丙烯酸共聚聚氯乙烯树脂. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了丙烯酸共聚聚氯乙烯树脂的外观、物化性能等技术要求&#xff0c;描述了相应的采样、试验方 法、检验规则、标志、包装、…

2023年中国场馆产业研究报告

第一章 行业综述 1.1 定义与分类 场馆&#xff0c;作为一个多元化和充满活力的行业&#xff0c;为人们提供了一个为不同目的而聚集的空间。无论是为了活动、表演、展览还是聚会&#xff0c;场馆都在为社区的社会、文化和经济建设做出了不可或缺的贡献。 场馆是一个为举办各类…

深入思考redis面经

1 redission分布式锁 1.1 为了保证数据一致性&#xff0c;引入了redission的锁&#xff0c;你是为了抗住高并发而去为了引入这个锁还是说为了保证数据一致性去引入的 答&#xff1a;主要是为了抗住高并发问题&#xff0c;解决redis的缓存击穿问题&#xff0c;但是也能解决一定…

【算法|链表】环形链表Ⅱ

环形链表Ⅱ 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统…

原创 VTK 基础入门 ( 一 ) 贴纹理

纹理 这个示例先读入一幅JPEG的二维纹理图;然后定义一个纹理类vtkTexture对象&#xff0c;接着把读入的NPG图像输入到vtkTexture 里&#xff0c; 作为它即将“贴”到平面上的一个纹理图;再定义一个vtkPlaneSource对象&#xff0c;类vtkPlaneSource 可以生成一个…

Pytorch学习:torch.max(input,dim,keepdim=False)

文章目录 torch.max()dimkeepdimdim0dim1 out&#xff1a;返回命名元组 (values, indices) torch.max() torch.max(input) → Tensor&#xff1a;返回 input 张量中所有元素的最大值。 注意输入的必须是张量形式&#xff0c;输出的也为张量形式 当输入为tuple类型时&#xf…

Attention is all you need 论文笔记

该论文引入Transformer&#xff0c;主要核心是自注意力机制&#xff0c;自注意力&#xff08;Self-Attention&#xff09;机制是一种可以考虑输入序列中所有位置信息的机制。 RNN介绍 引入RNN为了更好的处理序列信息&#xff0c;比如我 吃 苹果&#xff0c;前后的输入之间是有…

计算机组成原理之计算机系统概论、计算机的发展史、系统总线,三章开篇讲

第一章-计算机系统概论 1计算机系统简介 现代计算机的多态性 把感应器嵌入和装备到电网、铁道、桥梁、隧道、公路、建筑、供水系统、大坝、油气管道等各种物体中&#xff0c;并且被普遍连接&#xff0c;形成“物联网”&#xff0c;然后将“物联网”与现有的网络整合起来&…

无涯教程-JavaScript - ACOT函数

描述 ACOT函数以0至π之间的弧度(以弧度为单位)返回数的反正切或反余切的主值。 语法 ACOT (number)争论 Argument描述Required/OptionalNumberNumber is the cotangent of the angle you want. This must be a real number.Required Notes 要将输出从弧度转换为度, 使用D…

【计算机视觉 | 目标检测】YOLO-NAS的介绍以及如何使用?(含源代码)

文章目录 一、介绍1.1 亮点1.2 方案简介1.3 训练简介 二、使用案例 一、介绍 Github 仓库&#xff1a; https://github.com/Deci-AI/super-gradients/blob/master/YOLONAS.md1.1 亮点 参考QARepVGG&#xff0c;该方案引入了QSP与QCI模块以同时利用重参数与8-bit量化的优化&a…