第77步 时间序列建模实战:多因素预测 vol-2(以ARIMA为例)

基于WIN10的64位系统演示

一、写在前面

上一期,我们构建了多变量的ARIMA时间序列预测模型,其实人家有名字的,叫做ARIMAX模型(X就代表解释变量)。

这一期,我们介绍其他机器学习回归模型如何建立多变量的时间序列模型。与ARIMA一把能输出12个数值不同,其他ML模型还得分多种预测的策略:单步滚动预测、多步滚动预测,其中多步滚动预测还能分成3种类型。

为了便于演示,本期仅仅使用决策树的单步滚动预测进行演示。

二、数据介绍

再介绍一遍:

使用的是一个公共数据集,主要用于做风速预测,包含一个气象站内的5个天气变量传感器的6574个样本数据,如下表:

从数据中,我们可以看到以下几列:

DATE:日期。

WIND:风速。

IND 和 IND.1:指标0和指标1(具体啥意思我也不懂)

RAIN:降雨量。

T.MAX:最高温度。

IND.2:指标2(具体啥意思我也不懂)

T.MIN:最低温度。

T.MIN.G:09UTC草最低温度(我也不懂是啥意思)

使用GPT-4分析画个图看看:

看起来,数据比较潦草。

附上python的代码:

import matplotlib.pyplot as plt# 将日期列转换为datetime格式,并设置为索引
data['DATE'] = pd.to_datetime(data['DATE'])
data.set_index('DATE', inplace=True)# 绘制WIND的时间序列图
plt.figure(figsize=(14, 7))
data['WIND'].plot(title='WIND 时间序列图')
plt.ylabel('风速')
plt.xlabel('日期')
plt.grid(True)
plt.tight_layout()
plt.show()

三、相关性分析

这一步,有点类似特征工程。

直接沿用上一期的结果:

从上表可以看出:

(1)RAIN在当天和滞后1天还不错,在之后就不行了;

(2)T.MAX不管滞后多久,依旧相关;

(3)T.MIN滞后1天之后,开始展现出相关。

综上,我们尝试使用RAIN、T.MAX、T.MIN(lag3)和T.MIN.G(lag3)建立多因素预测模型。

四、决策树回归(未纳入WIND的一次性预测)

这次我们还是用Spyder运行,GPT-4辅助:

(1)数据读取

import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_absolute_error, mean_squared_error
import numpy as np
data = pd.read_csv('wind_dataset.csv', index_col=0, parse_dates=True)

记住这个data变量:

(2)创建滞后特征

data['T.MIN_lag3'] = data['T.MIN'].shift(3)
data['T.MIN.G_lag3'] = data['T.MIN.G'].shift(3)

看看这个data变量变成了啥:

(3)删除NaN值

data = data.dropna()

(4)拆分数据

train_size = int(len(data) * 0.8)
train, test = data[:train_size], data[train_size:]
X_train = train[['RAIN', 'T.MAX', 'T.MIN_lag3', 'T.MIN.G_lag3']]
y_train = train['WIND']
X_test = test[['RAIN', 'T.MAX', 'T.MIN_lag3', 'T.MIN.G_lag3']]
y_test = test['WIND']

注意:训练集并没有WIND,所以这个算法的意思是:仅仅使用['RAIN', 'T.MAX', 'T.MIN_lag3', 'T.MIN.G_lag3'去构建一个模型,来预测WIND。个人认为不太行,忽略了WIND本身的时间序列变化的规律。

(5)建模和评估

#使用决策树回归进行拟合
tree = DecisionTreeRegressor()
tree.fit(X_train, y_train)
# 进行预测
train_pred = tree.predict(X_train)
test_pred = tree.predict(X_test)
# 5. 计算误差指标
train_mae = mean_absolute_error(y_train, train_pred)
train_mse = mean_squared_error(y_train, train_pred)
train_rmse = np.sqrt(train_mse)
train_mape = np.mean(np.abs((y_train - train_pred) / y_train)) * 100
test_mae = mean_absolute_error(y_test, test_pred)
test_mse = mean_squared_error(y_test, test_pred)
test_rmse = np.sqrt(test_mse)
test_mape = np.mean(np.abs((y_test - test_pred) / y_test)) * 100
print((train_mae, train_mape, train_mse, train_rmse),(test_mae, test_mape, test_mse, test_rmse))

看看结果,意料之中,测试集的性能不太好:

主要是过拟合啦~

五、决策树回归(纳入WIND的单步滚动预测)

直接上代码:

# 导入必要的库
import pandas as pd
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_absolute_error, mean_squared_error
import numpy as np# 读取数据
uploaded_data = pd.read_csv('wind_dataset.csv')#中位数填充
uploaded_data = uploaded_data.fillna(uploaded_data.median())# 删除不必要的列
data = uploaded_data.drop(columns=['IND', 'IND.1', 'IND.2'])# 将日期列转换为日期格式
data['DATE'] = pd.to_datetime(data['DATE'])# 创建滞后期特征
lag_period = 6
for i in range(lag_period, 0, -1):data[f'WIND_lag_{i}'] = data['WIND'].shift(lag_period - i + 1)
data['T.MIN_lag3'] = data['T.MIN'].shift(3)
data['T.MIN.G_lag3'] = data['T.MIN.G'].shift(3)# 删除包含NaN的行
data = data.dropna().reset_index(drop=True)# 重新划分训练集和验证集
train_data = data[data['DATE'] < data['DATE'].max() - pd.DateOffset(years=1)]
validation_data = data[data['DATE'] >= data['DATE'].max() - pd.DateOffset(years=1)]# 定义新的特征和目标变量
features = ['RAIN', 'T.MAX', 'T.MIN_lag3', 'T.MIN.G_lag3'] + [f'WIND_lag_{i}' for i in range(1, lag_period + 1)]
X_train = train_data[features]
y_train = train_data['WIND']X_validation = validation_data[features]
y_validation = validation_data['WIND']# 初始化决策树模型,并使用网格搜索寻找最佳参数
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)):if i < 6:pred = best_tree_model.predict([X_validation.iloc[i]])else:new_features = X_validation.iloc[i][0:4].values.tolist() + y_validation_pred[-6:]pred = best_tree_model.predict([new_features])y_validation_pred.append(pred[0])
y_validation_pred = np.array(y_validation_pred)# 计算验证集上的误差
mae_validation = mean_absolute_error(y_validation, y_validation_pred)
mse_validation = mean_squared_error(y_validation, y_validation_pred)
rmse_validation = np.sqrt(mse_validation)
mape_validation = np.mean(np.abs((y_validation - y_validation_pred) / y_validation))# 计算训练集上的误差
y_train_pred = best_tree_model.predict(X_train)
mae_train = mean_absolute_error(y_train, y_train_pred)
mse_train = mean_squared_error(y_train, y_train_pred)
rmse_train = np.sqrt(mse_train)
mape_train = np.mean(np.abs((y_train - y_train_pred) / y_train))print((mae_validation, mse_validation, rmse_validation, mape_validation),(mae_train, mse_train, rmse_train, mape_train))

解读:

这里使用前6个WIND,加上1个RAIN、T.MAX、T.MIN(lag3)和T.MIN.G(lag3),一共10个特征去预测下一个WIND。

先看看结果:

似乎好一点,至少不是过拟合~

问题来了:RAIN、T.MAX、T.MIN(lag3)和T.MIN.G(lag3)为什么只要1个数值作训练集呢?哈哈哈,也有道理哦,大家自己试试了。

六、总结

(1)策略选择的多样性在多变量时间序列预测中十分常见,大多数情况下,经过一系列复杂操作后,其预测效果仍然无法超越单一变量的时间序列模型。但是,正因为其内在的多元性,也为创新性算法提供了发展空间:例如,如果你经过精细的调整和优化,使得多变量预测性能超过单因素模型,那么这就是值得称赞和骄傲的(灌水)成就!

(2)多变量时间序列预测对数据的需求也非常高,有时候获得十年的序列数据已经相当不易,而要寻找与之匹配的外部解释性变量(同样需要十年的数据),难度更是加倍。

六、数据

链接:https://pan.baidu.com/s/1jnaiJHsPhY9lHDmZsKPuCw?pwd=pr13

提取码:pr13

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

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

相关文章

Windows10/11显示文件扩展名 修改文件后缀名教程

前言 写这篇文章的原因是由于我分享的教程中的文件、安装包基本都是存在阿里云盘的&#xff0c;下载后需要改后缀名才能使用。 但是好多同学不会改。。 Windows 10 随便打开一个文件夹&#xff0c;在上方工具栏点击 “查看”点击 “查看” 后下方会显示更详细的工具栏然后点…

Lyapunov optimization 李雅普诺夫优化

文章目录 正文引言Lyapunov drift for queueing networks 排队网络的Lyapunov漂移Quadratic Lyapunov functions 二次李雅普诺夫函数Bounding the Lyapunov drift 李亚普诺夫漂移的边界A basic Lyapunov drift theorem 一个基本的李雅普诺夫漂移定理 Lyapunov optimization for…

全球与中国数字万用表市场:增长趋势、竞争格局与前景展望

数字万用表是一种标准诊断工具&#xff0c;用于测试电气设备中的电压、电流和电阻等电气值。它由带按钮的显示屏、刻度盘或旋转开关以及各种输入插孔&#xff08;用于插入测试导线&#xff09;组成。此外&#xff0c;与传统的指针式模拟仪表相比&#xff0c;数字式仪表具有更高…

C#程序中很多ntdll.dll、clr.dll的线程

VS中调试缓慢&#xff0c;如下图 需要“右键工程——调试——取消勾选‘启用本地代码调试’”即可。

算法leetcode|83. 删除排序链表中的重复元素(rust重拳出击)

文章目录 83. 删除排序链表中的重复元素&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 83. 删除排序链表中的重复元素&#xff1a; 给…

Zookeeper-集群介绍与核心理论

Zookeeper集群 4.Zookeeper集群4.1) 介绍4.2) 核心理论 4.Zookeeper集群 4.1) 介绍 Leader选举&#xff1a; Serverid&#xff1a;服务器ID。比如有三台服务器&#xff0c;编号分别是1,2,3。编号越大在选择算法中的权重越大。Zxid&#xff1a;数据ID。服务器中存放的最大数据…

【1】ElementUI 组件实际应用===》按钮的使用

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。个人B站主页热爱技术的小郑 &#xff0c;视频内容主要是对应文章的视频讲解形式。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘…

MySQL数据库入门到精通6--进阶篇(锁)

5. 锁 5.1 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决…

M1/M2芯片Parallels Desktop 19安装使用教程(超详细)

引言 在Window上VMware最强&#xff0c;在Mac上毫无疑问Parallels Desktop为最强&#xff01; 今天带来的是最新版Parallels Desktop 19的安装使用教程。 1. 下载安装包 Parallels Desktop 19安装包&#xff1a;https://www.aliyundrive.com/s/ThB8Fs6D3AD Parallels Deskto…

羧基荧光素-氨基.盐酸盐,FAM-NH2.HCl,138589-19-2

产品简介&#xff1a;5-FAM-NH2.HCl(羧基荧光素-氨基.盐酸盐)其中异硫氰酸荧光素(FITC)具有比较高的活性,通常来说,在固相合成过程中引 入该种荧光基团相对于其他荧光素要更容易,并且反应过程中不需要加入活化试剂。可以用来修饰蛋白质、多肽以及其他活性基团材料或者小分子。 …

ASCII码-对照表

ASCII 1> ASCII 控制字符2> ASCII 显示字符3> 常用ASCII码3.1> 【CR】\r 回车符3.2> 【LF】\n 换行符3.3> 不同操作系统&#xff0c;文件中换行 1> ASCII 控制字符 2> ASCII 显示字符 3> 常用ASCII码 3.1> 【CR】‘\r’ 回车符 CR Carriage Re…

软件设计模式系列之九——桥接模式

1 模式的定义 桥接模式是一种结构型设计模式&#xff0c;它用于将抽象部分与其实现部分分离&#xff0c;以便它们可以独立地变化。这种模式涉及一个接口&#xff0c;它充当一个桥&#xff0c;使得具体类可以在不影响客户端代码的情况下改变。桥接模式将继承关系转化为组合关系…

液氮超低温保存法的原理

细菌保存是有效保存活体微生物群体&#xff0c;使细菌不死、不衰、不变&#xff0c;便于研究和应用。保存细菌的方法有很多。保存原理是利用干燥、低温、隔离空气的方法&#xff0c;降低微生物菌株的代谢速度&#xff0c;使菌株的生命活动处于半永久性休眠状态&#xff0c;从而…

【C++】手撕string(string的模拟实现)

手撕string目录&#xff1a; 一、 Member functions 1.1 constructor 1.2 Copy constructor&#xff08;代码重构&#xff1a;传统写法和现代写法&#xff09; 1.3 operator&#xff08;代码重构&#xff1a;现代写法超级牛逼&#xff09; 1.4 destructor 二、Other mem…

多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

动手吧,vue数字动画

数字动画&#xff0c;有数字的地方都能用上&#xff0c;拿去吧&#xff01; 效果&#xff1a; 1、template部分 <template><div class"v-count-up">{{ dispVlaue }}</div> </template> 2、js部分 export default {data() {return {timer…

【LeetCode热题100】--54.螺旋矩阵

54.螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 按层遍历 可以将矩阵看成若干层&#xff0c;首先输出最外层的元素&#xff0c;其次输出次外层的元素&#xff0c;直到输出最内层的元素。 对于每层&…

【二叉树】——链式结构(快速掌握递归与刷题技巧)

&#x1f4d9;作者简介&#xff1a; 清水加冰&#xff0c;目前大二在读&#xff0c;正在学习C/C、Python、操作系统、数据库等。 &#x1f4d8;相关专栏&#xff1a;C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

《学术小白学习之路12》进阶-基于Python实现中文文本的DTM主题动态模型构建

《学术小白学习之路》基于Python实现中文文本的DTM主题动态模型构建 一、数据选择二、数据预处理三、输入数据ID映射词典构建四、文档加载成构造语料库五、DTM模型构建与结果分析六、结果进行保存七、保存模型一、数据选择 所选取的数据集是论文摘要,作为实验数据集,共计12条…

基于微信小程序的校园代送跑腿系统(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…