百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

使用TensorFlow和深度混合学习进行时间序列预测

bigegpt 2024-08-08 12:06 2 浏览



在本文中,我们将看到深度混合学习如何应用于时间序列数据,以及它是否与图像数据一样有效。

在这篇文章中,我将使用Kaggle的太阳黑子数据。如上所述,数据可以很容易地从GitHub项目TimeSeries-Using-TensorFlow下载。我鼓励大家使用谷歌协作笔记本,因为所需的模块已经安装好了,基础设施也准备好了。现在,让我们开始吧!

下载并加载数据

数据下载使用只需要一个简单的命令-

!wget — no-check-certificate https://raw.githubusercontent.com/adib0073/TimeSeries-Using-TensorFlow/main/Data/Sunspots.csv -O /tmp/sunspots.csv


下载完成后,我们可以使用pandas将数据加载到数据帧中。

# Loading the data as a pandas dataframe 
df = pd.read_csv(‘/tmp/sunspots.csv’, index_col=0) 
df.head()

我们可以浏览一下数据,如下图所示:


现在,我们应该做广泛的探索性数据分析(EDA)来了解数据的趋势和季节性。但在本例中,为了简单起见,我们将对数据进行目视检查。


准备数据

在这一步中,我们需要对加载的数据进行转换和处理,以便将其作为输入传递给深度混合学习模型,然后我们可以开始训练过程。我们可以把时间序列预测看作是一个有序的机器学习回归问题,把时间序列数据转换成一组特征值和相应的真值或目标值。由于回归是一个监督学习问题,我们需要目标值,目标值中滞后的时间序列数据变成这样的特征值:


我们将采用窗口或缓冲区方法,其中我们必须考虑适当的窗口大小。然后我们将序列或序列数据的窗口从左到右移动。我们将把窗口框右边的值作为目标值或真值。因此,每一次时间步,我们都会移动或移动窗口,以获得新的一行特征值和目标值对。这样我们就形成了训练数据和训练标签。以类似的方式,我们形成了测试和验证数据集,这是机器学习预测模型通常需要的。另外,请记住,对于一个预测模型来说,拥有更宽的观察窗口和更窄的预测窗口可以得到更好的结果。接下来,对于训练测试验证的分割比率,我们必须根据数据的大小计算出来。对于本例,我使用了0.8的分割比率,并且基于数据的季节性,我们将窗口大小设置为60。但是这些变量都是超参数,需要进行一些调整以获得可能的最佳结果。

代码如下:

# Convert the data values to numpy for better and faster processing 
time_index = np.array(df['Date']) 
data = np.array(df['Monthly Mean Total Sunspot Number'])   
# Certain Hyper-parameters to tune 
SPLIT_RATIO = 0.8 
WINDOW_SIZE = 60 
BATCH_SIZE = 32 
SHUFFLE_BUFFER = 1000  
# Dividing into train-test 
split split_index = int(SPLIT_RATIO * data.shape[0])   
# Train-Test Split 
train_data = data[:split_index] 
train_time = time_index[:split_index]  
test_data = data[split_index:] 
test_time = time_index[split_index:]

接下来,我们将准备一个为我们准备训练和测试数据的数据生成器。

def ts_data_generator(data, window_size, batch_size, shuffle_buffer):
  '''
  Utility function for time series data generation in batches
  '''
  ts_data = tf.data.Dataset.from_tensor_slices(data)
  ts_data = ts_data.window(window_size + 1, shift=1, drop_remainder=True)
  ts_data = ts_data.flat_map(lambda window: window.batch(window_size + 1))
  ts_data = ts_data.shuffle(shuffle_buffer).map(lambda window: (window[:-1], window[-1]))
  ts_data = ts_data.batch(batch_size).prefetch(1)
  return ts_data
# Expanding data into tensors
tensor_train_data = tf.expand_dims(train_data, axis=-1)
tensor_test_data = tf.expand_dims(test_data, axis=-1)

tensor_train_dataset = ts_data_generator(tensor_train_data, WINDOW_SIZE, BATCH_SIZE, SHUFFLE_BUFFER)
tensor_test_dataset = ts_data_generator(tensor_test_data, WINDOW_SIZE, BATCH_SIZE, SHUFFLE_BUFFER)

现在,我们已经准备好将处理后的数据输入到模型中。

建立DHL模型和训练

我们将使用一个简单版本的深度混合学习架构来解决这个问题。如前所述,我们将使用带有后期融合技术的深度学习变体。模型架构是这样的:


这里我们使用一维CNN的组合模型提取初始序列特征,然后结合2个LSTM层进行特征提取部分,最后将其传递到传统DNN全连接层,产生最终输出。

模型架构的代码如下所示:

# DHL Fusion model of 1D CNN and LSTM 
model = tf.keras.models.Sequential([
tf.keras.layers.Conv1D(filters=32, kernel_size=5,strides=1, padding="causal",activation="relu",input_shape=[None, 1]),
tf.keras.layers.LSTM(64, return_sequences=True),   
tf.keras.layers.LSTM(64, return_sequences=True),   
tf.keras.layers.Dense(30, activation="relu"),  
tf.keras.layers.Dense(10, activation="relu"),  
tf.keras.layers.Dense(1)
])

接下来,我们需要选择其他超参数,如学习速率、优化器和损失函数。为了简单起见,我在这篇文章中不涉及选择这些值的问题。

optimizer = tf.keras.optimizers.SGD(lr=1e-4, momentum=0.9)
model.compile(loss=tf.keras.losses.Huber(),
              optimizer=optimizer,
              metrics=["mae"])
history = model.fit(tensor_train_dataset, epochs=200, validation_data=tensor_test_dataset)

模型评估

接下来我们将看到如何评估我们的模型。但首先,在训练过程之后,绘制模型损失曲线来看看模型是否真的在学习。


从模型损失曲线,我们确实看到过拟合的明显存在。在本文的最后,我将给出一些如何处理这个问题的提示,以使模型更好,但我们可以看到,随着训练时间的增加,模型损失在减少,这是一个很好的迹象,表明模型正在学习。

现在,对于模型评估,我们需要选择一个度量标准。在以后的一篇文章中,我将包括时间序列数据的各种模型评估指标。但在这种情况下,我们将使用MAE作为度量标准。

def model_forecast(model, data, window_size):
    ds = tf.data.Dataset.from_tensor_slices(data)
    ds = ds.window(window_size, shift=1, drop_remainder=True)
    ds = ds.flat_map(lambda w: w.batch(window_size))
    ds = ds.batch(32).prefetch(1)
    forecast = model.predict(ds)
    return forecastrnn_forecast = model_forecast(model, data[..., np.newaxis], WINDOW_SIZE) rnn_forecast = rnn_forecast[split_index - WINDOW_SIZE:-1, -1, 0]# Overall Error
error = tf.keras.metrics.mean_absolute_error(test_data, rnn_forecast).numpy()
print(error)

我们得到的MAE值大约是40。这还不错,但对这个案子来说有点高了。模型误差更大的原因是我们看到的初始过拟合。

模型结果可视化

作为最后一步,让我们将通过测试数据得到的结果可视化,并检查模型是否接近,以预测良好的结果。


从第一张图可以看出,预测值与实际值的季节变化规律和趋势是相似的,但峰值没有实际值高。同时,由于时间序列预测应该是区间预测而不是单点估计,我们将使用错误率来形成置信区间或置信带。我们可以看到误差带很宽,这意味着模型的置信度不高,可能会有一些预测误差。

可视化的代码如下:

plt.figure(figsize=(15, 6))  
plt.plot(list(range(split_index,len(data))), test_data, label = 'Test Data') 
plt.plot(list(range(split_index,len(data))), rnn_forecast, label = 'Predictions') 
plt.legend() 
plt.show()  plt.figure(figsize=(15, 6)) 
# Plotting with Confidence Intervals 
plt.plot(list(range(split_index,len(data))), rnn_forecast, label = 'Predictions', color = 'k', linestyle = '--')
plt.fill_between(range(split_index,len(data)), rnn_forecast - error, rnn_forecast + error, alpha = 0.5, color = 'orange') 
plt.legend() 
plt.show()

我们有一个用于时间序列预测的深度混合学习模型,我们使用TensorFlow来形成模型并实现流。

但如果你想知道如何提高结果,我有以下建议:

1. 更改窗口大小(增加或减少)

1. 使用更多的训练数据(以解决过拟合问题)

1. 使用更多的模型层或隐藏的单元

1. 使用不同的损失函数和学习速率

1. 我们看到损失曲线不是平滑的。如果批处理规模很小,通常会发生这种情况,所以尝试使用更大的批处理规模。

有时,更简单的模型可能会得到更好的结果。在我使用TensorFlow的深度学习进行后期时间序列预测时,我只使用了一个简单的深度神经网络就得到了更好的结果。现在,不同于图像数据,我们看到,在时间序列数据中,深度混合学习并不比传统的深度学习、机器学习或统计方法好多少。但是,在做了彻底的超参数调优之后,我确信结果会更好!

作者:Aditya Bhattacharya

源代码地址:github.com/adib0073/TimeSeries-Using-TensorFlow


deephub翻译组

相关推荐

【Docker 新手入门指南】第十章:Dockerfile

Dockerfile是Docker镜像构建的核心配置文件,通过预定义的指令集实现镜像的自动化构建。以下从核心概念、指令详解、最佳实践三方面展开说明,帮助你系统掌握Dockerfile的使用逻...

Windows下最简单的ESP8266_ROTS_ESP-IDF环境搭建与腾讯云SDK编译

前言其实也没啥可说的,只是我感觉ESP-IDF对新手来说很不友好,很容易踩坑,尤其是对业余DIY爱好者搭建环境非常困难,即使有官方文档,或者网上的其他文档,但是还是很容易踩坑,多研究,记住两点就行了,...

python虚拟环境迁移(python虚拟环境conda)

主机A的虚拟环境向主机B迁移。前提条件:主机A和主机B已经安装了virtualenv1.主机A操作如下虚拟环境目录:venv进入虚拟环境:sourcevenv/bin/active(1)记录虚拟环...

Python爬虫进阶教程(二):线程、协程

简介线程线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能...

基于网络安全的Docker逃逸(docker)

如何判断当前机器是否为Docker容器环境Metasploit中的checkcontainer模块、(判断是否为虚拟机,checkvm模块)搭配学习教程1.检查根目录下是否存在.dockerenv文...

Python编程语言被纳入浙江高考,小学生都开始学了

今年9月份开始的新学期,浙江省三到九年级信息技术课将同步替换新教材。其中,新初二将新增Python编程课程内容。新高一信息技术编程语言由VB替换为Python,大数据、人工智能、程序设计与算法按照教材...

CentOS 7下安装Python 3.10的完整过程

1.安装相应的编译工具yum-ygroupinstall"Developmenttools"yum-yinstallzlib-develbzip2-develope...

如何在Ubuntu 20.04上部署Odoo 14

Odoo是世界上最受欢迎的多合一商务软件。它提供了一系列业务应用程序,包括CRM,网站,电子商务,计费,会计,制造,仓库,项目管理,库存等等,所有这些都无缝集成在一起。Odoo可以通过几种不同的方式进...

Ubuntu 系统安装 PyTorch 全流程指南

当前环境:Ubuntu22.04,显卡为GeForceRTX3080Ti1、下载显卡驱动驱动网站:https://www.nvidia.com/en-us/drivers/根据自己的显卡型号和...

spark+python环境搭建(python 环境搭建)

最近项目需要用到spark大数据相关技术,周末有空spark环境搭起来...目标spark,python运行环境部署在linux服务器个人通过vscode开发通过远程python解释器执行代码准备...

centos7.9安装最新python-3.11.1(centos安装python环境)

centos7.9安装最新python-3.11.1centos7.9默认安装的是python-2.7.5版本,安全扫描时会有很多漏洞,比如:Python命令注入漏洞(CVE-2015-2010...

Linux系统下,五大步骤安装Python

一、下载Python包网上教程大多是通过官方地址进行下载Python的,但由于国内网络环境问题,会导致下载很慢,所以这里建议通过国内镜像进行下载例如:淘宝镜像http://npm.taobao.or...

centos7上安装python3(centos7安装python3.7.2一键脚本)

centos7上默认安装的是python2,要使用python3则需要自行下载源码编译安装。1.安装依赖yum-ygroupinstall"Developmenttools"...

利用本地数据通过微调方式训练 本地DeepSeek-R1 蒸馏模型

网络上相应的教程基本都基于LLaMA-Factory进行,本文章主要顺着相应的教程一步步实现大模型的微调和训练。训练环境:可自行定义,mac、linux或者window之类的均可以,本文以ma...

【法器篇】天啦噜,库崩了没备份(天啦噜是什么意思?)

背景数据库没有做备份,一天突然由于断电或其他原因导致无法启动了,且设置了innodb_force_recovery=6都无法启动,里面的数据怎么才能恢复出来?本例采用解析建表语句+表空间传输的方式进行...