当前位置:   article > 正文

【视频讲解】Python、R时间卷积神经网络TCN与CNN、RNN预测时间序列3实例附代码数据...

【视频讲解】Python、R时间卷积神经网络TCN与CNN、RNN预测时间序列3实例附代码数据...

全文链接:https://tecdat.cn/?p=36944

本文旨在探讨时间卷积网络(Temporal Convolutional Network, TCN)与CNN、RNN在预测任务中的应用点击文末“阅读原文”获取完整代码数据)。

视频

通过引入TCN模型,我们尝试帮助客户解决时间序列数据中的复杂依赖关系,以提高预测的准确性。本文首先介绍了TCN的基本原理,随后详细描述了数据预处理、模型构建、训练及评估的整个过程。实验结果表明,TCN模型在处理时间序列数据时表现出色,为相关领域的研究提供了一种新的有效方法。

时间卷积网络(TCN)概述

时间卷积网络(TCN)是一种专为序列建模设计的卷积神经网络架构。它通过引入因果卷积和膨胀卷积,实现了对序列数据的长期依赖关系的有效捕捉。因果卷积确保了模型输出的每个时间步仅依赖于过去的输入,而膨胀卷积则通过增加感受野的大小,使得模型能够捕捉到更远距离的信息。

数据预处理

在模型训练之前,对数据进行适当的预处理是至关重要的。本文采用以下步骤进行数据预处理:

  • 数据加载:从指定路径加载时间序列数据。

  • 归一化:使用MinMaxScaler对数据进行归一化处理,以消除不同量纲对模型训练的影响。

  • 划分数据集:将数据集划分为训练集、验证集和测试集,用于模型的训练、验证和测试。

  1. from sklearn.metrics import mean_squared_error
  2. from sklearn.preprocessing import MinMaxScaler

下面的代码将帮助定义一些需要运行程序的变量。它还将创建用于测试和预测的训练样本、验证样本和附加样本。

  1. df = pd.read_csv(f_path)
  2. # 计算训练样本的大小,这里取数据总量的60%
  3. training_sample_size = math.ceil(df.shape[0] * .6)
  4. # 计算验证样本的大小,这里取数据总量的15%
  5. validation_sample_size = math.ceil(df.shape[0] * .15)
  6. # 设置采样方式为'sliding_window',即滑动窗口方式,也可以设置为'jump'(跳步方式)

ed5af2f192bd479bd523b028ec74d9d8.png

在此,数据已经成型,可以输入到模型中,但我们需要先定义模型 要定义模型,我们应该知道内核的大小、TCN 需要多少个滤波器和多少个层

  1. if len(channels) != num_layers:
  2. print('You should not have more than {} residual layers or else model will be equivalent to RNN'.format(num_layers))

模型定义

TCN作为一种专为序列数据设计的深度学习架构,通过其独特的卷积结构和时间因果性,能够有效捕捉数据中的长期依赖关系,从而提高预测的准确性。

模型架构设计

模型的定义是预测任务中的关键环节。在本研究中,我们采用了TemporalConvolutionalNet类来实例化TCN模型。该类通过接收一系列参数来定义模型的具体结构,包括输入通道数(in_channels)、输出通道数(channels)、卷积核大小(kernel_size)、dropout比率以及是否应用权重归一化等。

de3e1e3e87b394c7a3d4f33efacc21bf.png

  1. y_pred = model(X_train) # 让模型对训练集X_train进行预测
  2. loss_value = loss(y_pred, y_train) # 计算预测值与真实值之间的损失
  3. #print(y_pred) # 注释掉的代码,原本可能用于打印预测值

a1ccfd0fe25e8c180b47ce8b8711b6b1.png

在这里,我们测试了训练数据,看看平均验证损失是否足够低。之所以要看平均值,是因为数据的性质决定了它的波动性。一个好的模型应该能够应对这种波动性。

  1. # 验证模型
  2. validation_loss = []
  3. with torch.no_grad(): # 禁用梯度计算,以节省内存和加速计算
  4. model.eval() # 将模型设置为评估模式,停止dropout等操作

7225a827c954a7ed0574b00ae9e01bf1.png

eff012c4a7d3b193111743f36c690512.png

给定一组新数据,我们将其输入模型,以确定其预测结果

46a9d8c1fee47826333c194484499402.png

0b03657072f8120a4b6a186645bab81d.png


点击标题查阅往期内容

163e112b8cb87872c8e8a03ef1b32d3a.jpeg

Python深度学习TensorFlow Keras心脏病预测神经网络模型评估损失曲线、混淆矩阵可视化

outside_default.png

左右滑动查看更多

outside_default.png

01

b333fc5bc611b3345c85257080d81926.png

02

32e8a79c75362c1a7d69a939ee09fbdd.png

03

fb9d4d74e2e4bb6cd57d323630a2dc60.jpeg

04

208950f4717c256941ffbd557b8b7727.jpeg

多元TCN

接下来旨在介绍基于时间卷积网络(Temporal Convolutional Network, TCN)的多元时间序列预测模型的构建过程,并详细阐述数据预处理及特征工程的实施步骤。通过整合多变量预处理技术、特征提取方法和模型构建策略,本文提出了一种有效的预测框架,旨在提高时间序列数据预测的准确性。

模型定义

时间卷积网络(TCN)是一种专为序列建模设计的深度学习架构,它通过引入因果卷积和膨胀卷积来捕获序列中的长期依赖关系。在本研究中,我们使用TemporalConvolutionalNet类来定义TCN模型,具体参数包括输入通道数(in_channels)、输出通道数(channels)、卷积核大小(kernel_size)、丢弃率(dropout)以及权重归一化选项(weight_normal)。

下面的代码将帮助定义一些需要运行程序的变量。它还将创建用于测试和预测的训练样本、验证样本和附加样本

  1. window_size = 14
  2. # ticer_options = ['APPLE', 'TESLA', 'AT&T', 'S&P500']
  3. ticker = 'APPLE'
  4. cur_dir = Path(os.getcwd())
  5. parent_path = cur_dir.parent
  6. f_path = parent_path / 'data/{}.csv'.format(ticker)
  7. df=pd.read_csv(f_path)

c81242c7ac29323555d975ea64f9400f.png

在这里,数据已经成型,可以输入到模型中,但我们需要先定义模型。要定义模型,我们应该知道内核的大小、TCN 需要多少个过滤器和层

  1. in_channels = num_features
  2. out_channel = 1
  3. filter_size = 3

defa6c35b55c062b7bb1928272aabe78.png

模型定义与训练

模型定义

在本文中,我们采用了一个时间卷积网络(Temporal Convolutional Network, TCN)作为我们的主要模型架构,用于处理时间序列数据。

1360631d656fa23d5649d77cb8bb0c4d.png

此模型配置旨在通过调整输入通道数、卷积核的通道数、卷积核大小以及引入适当的Dropout来优化模型的性能。

训练模型

训练参数设置

为了训练该模型,我们设置了以下训练参数:

  • 训练周期数 (num_epoch): 500,即整个训练数据集将被遍历500次。

  • 损失函数 (loss): 采用均方误差损失(MSE Loss),适用于回归任务。

  • 优化器 (optimizer): 使用Adam优化器,其学习率设置为0.015,betas参数为(0.45, 0.35),以及权重衰减为0.4。这些参数经调优后旨在提高模型的收敛速度和泛化能力。此外,还提供了另一组备选超参数以供比较。

0414086fcec419337a2e4cabeb099100.png

在这里,我们测试了训练数据,看看平均验证损失是否足够低。之所以要看平均值,是因为数据的性质决定了它的波动性。一个好的模型应该能够应对这种波动性。

6f0c947c4dcf4ddd6e89794ea16d79a4.png

9c980634978860e87f8bd973dad79063.png

准确预测未来趋势对于决策制定至关重要。本文探讨了一种利用滑动窗口法(Sliding Window Method)进行时间序列预测的方法,该方法通过动态调整输入数据的窗口大小,有效捕捉时间序列中的历史信息,并据此预测未来的数据点。

方法

1. 滑动窗口法概述

滑动窗口法是一种处理时间序列数据的常用技术,它通过设定一个固定大小的窗口在数据序列上滑动,每次滑动都选取窗口内的数据作为模型的输入。在本研究中,我们特别关注于输入和输出长度相等的配置,即窗口大小与预测目标序列的长度相匹配。

预测流程

给定一组新的时间序列数据,我们按照以下步骤进行预测:

  • 步骤一:数据准备:首先,确定预测所需的窗口大小(即输入长度)和预测长度(num_predictions)。例如,若num_predictions为2,则意味着我们希望模型能够基于当前及之前的数据点预测未来两个时间步的值。

  • 步骤二:构建输入和目标序列:通过滑动窗口法构建输入和目标序列。具体而言,将目标序列相对于输入序列向后移动num_predictions个时间步,以确保输入序列包含了用于预测未来num_predictions个时间步所需的所有历史信息。例如,对于输入序列t1,t2,t3,t4,t5,对应的目标序列将是t3,t4,t5,t6,t7,其中t6,t7即为预测目标。

  • 步骤三:模型预测:将构建好的输入序列输入到已训练的时间序列预测模型中,模型将输出与输入序列长度相等的预测序列。由于模型已知输入序列中前len(input)-num_predictions个时间步的真实值,它利用这些信息来预测接下来的num_predictions个时间步的值。

  • 步骤四:验证与评估:为了验证模型的预测性能,我们将预测结果与真实值(即总数据集中位于输入序列之后的num_predictions个时间步的值)进行比较。例如,如果总数据集为t1,t2,t3,t4,t5,t6,t7,则通过比较模型预测的t6,t7与实际的t6,t7来评估预测准确性。

1a767dc932fc316b5d7454c47384fd6c.png

54e9f14004b4e86f82f1c1bbfc18b893.png

CNN(卷积神经网络)模型以及R语言实现

当我们将CNN(卷积神经网络)模型用于训练多维类型的数据(例如图像)时,它们非常有用。我们还可以实现CNN模型进行回归数据分析。我们之前使用Python进行CNN模型回归 ,在本视频中,我们在R中实现相同的方法。

视频


我们使用一维卷积函数来应用CNN模型。我们需要Keras R接口才能在R中使用Keras神经网络API。如果开发环境中不可用,则需要先安装。本教程涵盖:

  1. 准备数据

  2. 定义和拟合模型

  3. 预测和可视化结果

  4. 源代码

我们从加载本教程所需的库开始。

  1. html
  2. library(keras)
  3. library(caret)

准备

数据在本教程中,我们将波士顿住房数据集用作目标回归数据。首先,我们将加载数据集并将其分为训练和测试集。

  1. html
  2. set.seed(123)
  3. boston = MASS::Boston
  4. indexes = createDataPartition(boston$medv, p = .85, list = F)
  1. html
  2. train = boston[indexes,]
  3. test = boston[-indexes,]


接下来,我们将训练数据和测试数据的x输入和y输出部分分开,并将它们转换为矩阵类型。您可能知道,“ medv”是波士顿住房数据集中的y数据输出,它是其中的最后一列。其余列是x输入数据。
检查维度。

  1. html
  2. dim(xtrain)
  3. [1] 432 13
  1. html
  2. dim(ytrain)
  3. [1] 432 1


接下来,我们将通过添加另一维度来重新定义x输入数据的形状。

  1. html
  2. dim(xtrain)
  3. [1] 432 13 1
  1. html
  2. dim(xtest)
  3. [1] 74 13 1


在这里,我们可以提取keras模型的输入维。

  1. html
  2. print(in_dim)
  3. [1] 13 1

定义和拟合模型

我们定义Keras模型,添加一维卷积层。输入形状变为上面定义的(13,1)。我们添加Flatten和Dense层,并使用“ Adam”优化器对其进行编译。

  1. model %>% summary()
  2. ________________________________________________________________________
  3. Layer (type) Output Shape Param #
  4. ========================================================================
  5. conv1d_2 (Conv1D) (None, 12, 64) 192
  6. ________________________________________________________________________
  7. flatten_2 (Flatten) (None, 768) 0
  8. ________________________________________________________________________
  9. dense_3 (Dense) (None, 32) 24608
  10. ________________________________________________________________________
  11. dense_4 (Dense) (None, 1) 33
  12. ========================================================================
  13. Total params: 24,833
  14. Trainable params: 24,833
  15. Non-trainable params: 0
  16. ________________________________________________________________________


接下来,我们将使用训练数据对模型进行拟合。

  1. html
  2. print(scores)
  3. loss
  4. 24.20518

5c8b8b2637fde401d02b482306f30ec1.png 预测和可视化结果

现在,我们可以使用训练的模型来预测测试数据。

  1. html
  2. predict(xtest)


我们将通过RMSE指标检查预测的准确性。

  1. html
  2. cat("RMSE:", RMSE(ytest, ypred))
  3. RMSE: 4.935908


最后,我们将在图表中可视化结果检查误差。

  1. html
  2. x_axes = seq(1:length(ypred))
  3. lines(x_axes, ypred, col = "red", type = "l", lwd = 2)
  4. legend("topl

d3a212961e6b757a8e86c89d391dc240.png

  在本教程中,我们简要学习了如何使用R中的keras CNN模型拟合和预测回归数据。

Python用RNN循环神经网络:LSTM长期记忆、GRU门循环单元、回归和ARIMA对COVID

该数据根据世界各国提供的新病例数据提供。

获取时间序列数据

df=pd.read_csv("C://global.csv")

探索数据

此表中的数据以累积的形式呈现,为了找出每天的新病例,我们需要减去这些值

2183ba357fa163569e978f21e593e8e9.png

df.head(10)

5ede8beef73b85451ea42b7dd351cbc8.png

这些数据是根据国家和地区报告新病例的数据,但我们只想预测国家的新病例,因此我们使用 groupby 根据国家对它们进行分组

afcb788653624c68f9f183eb78baeb05.png

总结数据

执行 groupby 以根据一个国家的新病例来汇总数据,而不是根据地区

d1=df.groupby(['Country/Region']).sum()

0fb503665dff5978b86d60e1f6a18731.png

313c0bc7cb7ec3f08e75c6dc3424ba86.png

描述随机选择的国家的累计新病例增长

from numpy.random import seed    plt.plot(F[i], label = RD[i])    plt.show()

2fd64d7015d3b0da15a0286e9786f854.png

aec4af26a001876e9626bb78bbd03efa.png

2ce269ad34a3c454de07d3d8f6322ded.png

d92142c36ae360df87a8450de17d5f15.png

# 我们不需要前两列d1=d1.iloc[:,2:]

a2497687391831602497719c641e8814.png

# # 检查是否有空值d1.isnull().sum().any()

a8b449649bb934daaed612c4e91a4c45.png

我们可以对每个国家进行预测,也可以对所有国家进行预测,这次我们对所有国家进行预测

dlycnmdcas.head()

180ded03b6471ac5c87a40ebdb4aa968.png

dalycnfreces.index
dal_cnre_ces.index = pd.to_datetime(dailyonfrmd_as.index)

ef28c45ed77c773becca9b30602f6710.png

38691446cb6039ab2bca7ddb5fb9b438.png

plt.plot(dalnimedases)

f5b951c90d772f9b2a9dd53e60aa71f4.png

ne_ces = daiy_onme_as.diff().dropna().astype(np.int64)newcaes

bd171ba03e7121c5f8a3cb9f27a5b69d.png

37460708a21f150106ccdacb25d42f0b.png

plt.plot(ne_s[1:])

d481c15de3cff0509eca82cd534d4378.png

nw_s.shape
(153,)

将数据拆分为训练和测试数据

ct=0.75trin_aa,tet_aa = train_test_split(ne_ces, pct)
(116,)
plt.plot(tainta)plt.plot(tesata)

e4cf329a375951efdf37e9a56186f7d5.png

数据标准化

scaler = MinMaxScaler()
testa.shape
(38, 1)

创建序列

lentTe = len(ts_data)for i in range(timmp, lenhTe):    X_st.append(tst_aa[i-tmStap:i])    y_tt.append(tesata[i])X_tet=np.array(X_ts)ytes=np.array(y_tt)
X_st.shape

a3533cb0d54c2aa0c8a243eaeeac0399.png

e80b7fd43979b878b7a34f40dd3331b0.png

3570e3a43e1a3de0403c7f9f8ef181e2.png

Xtrn.shape

8fcb86e6992a83d76bfeb49193d15cf0.png

#  序列的样本 X_trn[0], yran[0]

2ad071c2d5975ee18e24b2c078a6ec30.png

为股票价格预测设计 RNN 模型

模型:

  1. LSTM

  2. GRU

model.summary()

a5fa50b3d4972457423266df2b6c74ff.png

model.fit(X_trn y_rin, epochs=50, batch_size=200)

603d391437a1ebbf8fb8ab94ce825af9.png

db138f5124ab65d61933c180d4282872.png

3030b90ef1ff05ff6e5d0eec6f7dbca0.png

yprd = (mod.predict(X_test))MSE = mean_squared_error(ytue, y_rd)plt.figure(figsize=(14,6))

3425906f127001df23b9e22116f5ea47.png

meRU= Sqtal([                keras.layers.GRU(model_GRU.fit(Xtrn, ytin,epochs=50,batch_size=150)

4f37259bb9372f80962a01160ea862b2.png

af9265be46ada81ee189988d6107cfe9.png

pe_rut = {}y_ue = (y_et.reshape(-1,1))y_prd = (modlGU.predict(X_test))MSE = mean_squared_error(y_ue, ed)

7c3bb48d5b53860816891cfc14b29303.png

用于预测新病例的机器学习算法

准备数据

d__in.shape

ecb502ac577d3cc2c78cfb9c3df437e7.png

moel=LinearRegression(nos=-2)

9e141ebbcea9b28dd1f433064bc6c1ca.png

ARIMA

COVID-19 新病例预测的自回归综合移动平均线

#我们不需要前两列df1.head()daly_nfrd_cses = df1.sum(axis=0)day_cnir_ase.index = pd.to_datetime(da_onieses.index)
new_cs = dacofmecss.diff().dropna().astype(np.int64)tri_ta,tet_ata = trintt_it(nw_es, pct)

9386aabab4380e6fbfcbc931798f13be.png

ero = men_squred_eror(ts_ar, pricos)

108a04e2214517715dc07e296c0d9a4e.png

fdb1fe36cdf12d95c26c0426b43dbed5.png

9fb9c0e48411b27e7c683dd88ece18ab.png

plt.figure(figsize=(12,7))plt.plot(tanat)

7f2995010c59198cd374c13deeb9d5e7.png


资料获取

在公众号后台回复“领资料”,可免费获取数据分析、机器学习、深度学习等学习资料。

3a8bbb8642b62228b3e69ae83f5c6eab.jpeg

点击文末“阅读原文”

获取全文完整代码数据资料。

本文选自《【视频讲解】Python、R时间卷积神经网络TCN与CNN、RNN预测时间序列3实例》。

点击标题查阅往期内容

RNN循环神经网络 、LSTM长短期记忆网络实现时间序列长期利率预测

结合新冠疫情COVID-19股票价格预测:ARIMA,KNN和神经网络时间序列分析

深度学习:Keras使用神经网络进行简单文本分类分析新闻组数据

用PyTorch机器学习神经网络分类预测银行客户流失模型

PYTHON用LSTM长短期记忆神经网络的参数优化方法预测时间序列洗发水销售数据

Python用Keras神经网络序列模型回归拟合预测、准确度检查和结果可视化

R语言深度学习卷积神经网络 (CNN)对 CIFAR 图像进行分类:训练与结果评估可视化

深度学习:Keras使用神经网络进行简单文本分类分析新闻组数据

Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析

R语言深度学习Keras循环神经网络(RNN)模型预测多输出变量时间序列

R语言KERAS用RNN、双向RNNS递归神经网络、LSTM分析预测温度时间序列、 IMDB电影评分情感

Python用Keras神经网络序列模型回归拟合预测、准确度检查和结果可视化

Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析

R语言中的神经网络预测时间序列:多层感知器(MLP)和极限学习机(ELM)数据分析报告

R语言深度学习:用keras神经网络回归模型预测时间序列数据

Matlab用深度学习长短期记忆(LSTM)神经网络对文本数据进行分类

R语言KERAS深度学习CNN卷积神经网络分类识别手写数字图像数据(MNIST)

MATLAB中用BP神经网络预测人体脂肪百分比数据

Python中用PyTorch机器学习神经网络分类预测银行客户流失模型

R语言实现CNN(卷积神经网络)模型进行回归数据分析

SAS使用鸢尾花(iris)数据集训练人工神经网络(ANN)模型

【视频】R语言实现CNN(卷积神经网络)模型进行回归数据分析

Python使用神经网络进行简单文本分类

R语言用神经网络改进Nelson-Siegel模型拟合收益率曲线分析

R语言基于递归神经网络RNN的温度时间序列预测

R语言神经网络模型预测车辆数量时间序列

R语言中的BP神经网络模型分析学生成绩

matlab使用长短期记忆(LSTM)神经网络对序列数据进行分类

R语言实现拟合神经网络预测和结果可视化

用R语言实现神经网络预测股票实例

使用PYTHON中KERAS的LSTM递归神经网络进行时间序列预测

python用于NLP的seq2seq模型实例:用Keras实现神经网络机器翻译

用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类

ba51ac860efb6afc5811fd9984645312.jpeg

e38e29a411ca73c50aeaaf8ee9983ae2.png

2b9f1de17ff4e58a63730581519b8236.png

2b56a054d2411bcb979ba8c22a02b0df.jpeg

5a99a5577d28fd004e5e21273e92d85f.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/803177
推荐阅读
相关标签
  

闽ICP备14008679号