时间序列预测——时序卷积网络(TCN)

article/2025/11/5 8:15:39

  本文展示了使用时序卷积网络(TCN)进行时间序列预测的全过程,包含详细的注释。整个过程主要包括:数据导入、数据清洗、结构转化、建立TCN模型、训练模型(包括动态调整学习率和earlystopping的设置)、预测、结果展示、误差评估等完整的时间序列预测流程。
  本文使用的tcn库在本人上传的资源中,链接为tcn.py
  本文使用的数据集在本人上传的资源中,链接为mock_kaggle.csv

import pandas as pd
import numpy as np
import math
from matplotlib import pyplot as plt
from matplotlib.pylab import mpl
import tensorflow as tf
from sklearn.preprocessing import MinMaxScaler
from keras import backend as K
from keras.layers import LeakyReLU
from tcn import TCN,tcn_full_summary
from sklearn.metrics import mean_squared_error # 均方误差
from keras.callbacks import LearningRateScheduler
from keras.callbacks import EarlyStopping
from tensorflow.keras import Input, Model,Sequential
mpl.rcParams['font.sans-serif'] = ['SimHei']   #显示中文
mpl.rcParams['axes.unicode_minus']=False       #显示负号

取数据

data=pd.read_csv('mock_kaggle.csv',encoding ='gbk',parse_dates=['datetime'])
Date=pd.to_datetime(data.datetime)
data['date'] = Date.map(lambda x: x.strftime('%Y-%m-%d'))
datanew=data.set_index(Date)
series = pd.Series(datanew['股票'].values, index=datanew['date'])
series
date
2014-01-01    4972
2014-01-02    4902
2014-01-03    4843
2014-01-04    4750
2014-01-05    4654... 
2016-07-27    3179
2016-07-28    3071
2016-07-29    4095
2016-07-30    3825
2016-07-31    3642
Length: 937, dtype: int64

滞后扩充数据

dataframe1 = pd.DataFrame()
num_hour = 16
for i in range(num_hour,0,-1):dataframe1['t-'+str(i)] = series.shift(i)
dataframe1['t'] = series.values
dataframe3=dataframe1.dropna()
dataframe3.index=range(len(dataframe3))
dataframe3
t-16t-15t-14t-13t-12t-11t-10t-9t-8t-7t-6t-5t-4t-3t-2t-1t
04972.04902.04843.04750.04654.04509.04329.04104.04459.05043.05239.05118.04984.04904.04822.04728.04464
14902.04843.04750.04654.04509.04329.04104.04459.05043.05239.05118.04984.04904.04822.04728.04464.04265
24843.04750.04654.04509.04329.04104.04459.05043.05239.05118.04984.04904.04822.04728.04464.04265.04161
34750.04654.04509.04329.04104.04459.05043.05239.05118.04984.04904.04822.04728.04464.04265.04161.04091
44654.04509.04329.04104.04459.05043.05239.05118.04984.04904.04822.04728.04464.04265.04161.04091.03964
......................................................
9161939.01967.01670.01532.01343.01022.0813.01420.01359.01075.01015.0917.01550.01420.01358.02893.03179
9171967.01670.01532.01343.01022.0813.01420.01359.01075.01015.0917.01550.01420.01358.02893.03179.03071
9181670.01532.01343.01022.0813.01420.01359.01075.01015.0917.01550.01420.01358.02893.03179.03071.04095
9191532.01343.01022.0813.01420.01359.01075.01015.0917.01550.01420.01358.02893.03179.03071.04095.03825
9201343.01022.0813.01420.01359.01075.01015.0917.01550.01420.01358.02893.03179.03071.04095.03825.03642

921 rows × 17 columns

二折划分数据并标准化

# pot=int(len(dataframe3)*0.8)
pd.DataFrame(np.random.shuffle(dataframe3.values))  #shuffle
pot=len(dataframe3)-12
train=dataframe3[:pot]
test=dataframe3[pot:]
scaler = MinMaxScaler(feature_range=(0, 1)).fit(train)
#scaler = preprocessing.StandardScaler().fit(train)
train_norm=pd.DataFrame(scaler.fit_transform(train))
test_norm=pd.DataFrame(scaler.transform(test))
test_norm.shape,train_norm.shape
((12, 17), (909, 17))
X_train=train_norm.iloc[:,:-1]
X_test=test_norm.iloc[:,:-1]
Y_train=train_norm.iloc[:,-1:]
Y_test=test_norm.iloc[:,-1:]

转换为3维数据 [samples, timesteps, features]

source_x_train=X_train
source_x_test=X_test
X_train=X_train.values.reshape([X_train.shape[0],1,X_train.shape[1]]) #从(909,16)-->(909,1,16)
X_test=X_test.values.reshape([X_test.shape[0],1,X_test.shape[1]])  #从(12,16)-->(12,1,16)
Y_train=Y_train.values
Y_test=Y_test.values
X_train.shape,Y_train.shape
((909, 1, 16), (909, 1))
X_test.shape,Y_test.shape
((12, 1, 16), (12, 1))
type(X_train),type(Y_test)
(numpy.ndarray, numpy.ndarray)

动态调整学习率与提前终止函数

def scheduler(epoch):# 每隔50个epoch,学习率减小为原来的1/10if epoch % 50 == 0 and epoch != 0:lr = K.get_value(tcn.optimizer.lr)if lr>1e-5:K.set_value(tcn.optimizer.lr, lr * 0.1)print("lr changed to {}".format(lr * 0.1))return K.get_value(tcn.optimizer.lr)reduce_lr = LearningRateScheduler(scheduler)
early_stopping = EarlyStopping(monitor='loss', patience=20, min_delta=1e-5,mode='auto',restore_best_weights=False,#是否从具有监测数量的最佳值的时期恢复模型权重verbose=2)

构造TCN模型

batch_size=None
timesteps=X_train.shape[1]
input_dim=X_train.shape[2] #输入维数
tcn = Sequential()
input_layer =Input(batch_shape=(batch_size,timesteps,input_dim))
tcn.add(input_layer)
tcn.add(TCN(nb_filters=64, #在卷积层中使用的过滤器数。可以是列表。kernel_size=3, #在每个卷积层中使用的内核大小。nb_stacks=1,   #要使用的残差块的堆栈数。dilations=[2 ** i for i in range(6)], #扩张列表。示例为:[1、2、4、8、16、32、64]。#用于卷积层中的填充,值为'causal' 或'same'。#“causal”将产生因果(膨胀的)卷积,即output[t]不依赖于input[t+1:]。当对不能违反时间顺序的时序信号建模时有用。#“same”代表保留边界处的卷积结果,通常会导致输出shape与输入shape相同。padding='causal',use_skip_connections=True, #是否要添加从输入到每个残差块的跳过连接。dropout_rate=0.1, #在0到1之间浮动。要下降的输入单位的分数。return_sequences=False,#是返回输出序列中的最后一个输出还是完整序列。activation='relu', #残差块中使用的激活函数 o = Activation(x + F(x)).kernel_initializer='he_normal', #内核权重矩阵(Conv1D)的初始化程序。use_batch_norm=True, #是否在残差层中使用批处理规范化。use_layer_norm=True, #是否在残差层中使用层归一化。name='tcn' #使用多个TCN时,要使用唯一的名称))
tcn.add(tf.keras.layers.Dense(64))
tcn.add(tf.keras.layers.LeakyReLU(alpha=0.3))
tcn.add(tf.keras.layers.Dense(32))
tcn.add(tf.keras.layers.LeakyReLU(alpha=0.3))
tcn.add(tf.keras.layers.Dense(16))
tcn.add(tf.keras.layers.LeakyReLU(alpha=0.3))
tcn.add(tf.keras.layers.Dense(1))
tcn.add(tf.keras.layers.LeakyReLU(alpha=0.3))
tcn.compile('adam', loss='mse', metrics=['accuracy'])
tcn.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
tcn (TCN)                    (None, 64)                143168    
_________________________________________________________________
dense (Dense)                (None, 64)                4160      
_________________________________________________________________
leaky_re_lu (LeakyReLU)      (None, 64)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 32)                2080      
_________________________________________________________________
leaky_re_lu_1 (LeakyReLU)    (None, 32)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 16)                528       
_________________________________________________________________
leaky_re_lu_2 (LeakyReLU)    (None, 16)                0         
_________________________________________________________________
dense_3 (Dense)              (None, 1)                 17        
_________________________________________________________________
leaky_re_lu_3 (LeakyReLU)    (None, 1)                 0         
=================================================================
Total params: 149,953
Trainable params: 148,417
Non-trainable params: 1,536
_________________________________________________________________

训练

history=tcn.fit(X_train,Y_train, epochs=80,batch_size=32,callbacks=[reduce_lr])
Train on 909 samples
Epoch 1/80
909/909 [==============================] - 14s 16ms/sample - loss: 0.1332 - accuracy: 0.0187......
Epoch 10/80
909/909 [==============================] - 1s 1ms/sample - loss: 0.0135 - accuracy: 0.0187......
Epoch 20/80
909/909 [==============================] - 1s 1ms/sample - loss: 0.0091 - accuracy: 0.0187......
Epoch 30/80
909/909 [==============================] - 1s 1ms/sample - loss: 0.0090 - accuracy: 0.0176......
Epoch 40/80
909/909 [==============================] - 1s 1ms/sample - loss: 0.0059 - accuracy: 0.0187......
Epoch 50/80
909/909 [==============================] - 1s 1ms/sample - loss: 0.0067 - accuracy: 0.0187
lr changed to 0.00010000000474974513......
Epoch 60/80
909/909 [==============================] - 1s 1ms/sample - loss: 0.0047 - accuracy: 0.0187......
Epoch 70/80
909/909 [==============================] - 1s 1ms/sample - loss: 
......
Epoch 80/80
909/909 [==============================] - 1s 1ms/sample - loss: 0.0050 - accuracy: 0.0187
history.history.keys() #查看history中存储了哪些参数
plt.plot(history.epoch,history.history.get('loss')) #画出随着epoch增大loss的变化图
#plt.plot(history.epoch,history.history.get('acc'))#画出随着epoch增大准确率的变化图

在这里插入图片描述

预测

predict = tcn.predict(X_test)
real_predict=scaler.inverse_transform(np.concatenate((source_x_test,predict),axis=1))
real_y=scaler.inverse_transform(np.concatenate((source_x_test,Y_test),axis=1))
real_predict=real_predict[:,-1]
real_y=real_y[:,-1]

误差评估

plt.figure(figsize=(15,6))
bwith = 0.75 #边框宽度设置为2
ax = plt.gca()#获取边框
ax.spines['bottom'].set_linewidth(bwith)
ax.spines['left'].set_linewidth(bwith)
ax.spines['top'].set_linewidth(bwith)
ax.spines['right'].set_linewidth(bwith)
plt.plot(real_predict,label='real_predict')
plt.plot(real_y,label='real_y')
plt.plot(real_y*(1+0.15),label='15%上限',linestyle='--',color='green')
# plt.plot(real_y*(1+0.1),label='10%上限',linestyle='--')
# plt.plot(real_y*(1-0.1),label='10%下限',linestyle='--')
plt.plot(real_y*(1-0.15),label='15%下限',linestyle='--',color='green')
plt.fill_between(range(0,12),real_y*(1+0.15),real_y*(1-0.15),color='gray',alpha=0.2)
plt.legend()
plt.show()

在这里插入图片描述

round(mean_squared_error(Y_test,predict),4)
0.0012
from sklearn.metrics import r2_score
round(r2_score(real_y,real_predict),4)
0.5192
per_real_loss=(real_y-real_predict)/real_y
avg_per_real_loss=sum(abs(per_real_loss))/len(per_real_loss)
print(avg_per_real_loss)
0.13984217335814073
#计算指定置信水平下的预测准确率
#level为小数
def comput_acc(real,predict,level):num_error=0for i in range(len(real)):if abs(real[i]-predict[i])/real[i]>level:num_error+=1return 1-num_error/len(real)
comput_acc(real_y,real_predict,0.2),comput_acc(real_y,real_predict,0.15),comput_acc(real_y,real_predict,0.1)
(0.75, 0.6666666666666667, 0.33333333333333337)

http://chatgpt.dhexx.cn/article/ivv9g6OP.shtml

相关文章

TCN-时间卷积网络

目录 一、引言 二、时序卷积神经网络 2.1 因果卷积(Causal Convolution) 2.2 膨胀卷积(Dilated Convolution) 2.3 残差链接(Residual Connections) 三、讨论和总结 1. TCN的优点 2. TCN的缺点 参考…

时间卷积网络TCN:CNN也可以处理时序数据并且比LSTM更好

本文回顾了 Shaojie Bai、J. Zico Kolter 和 Vladlen Koltun 撰写的论文:An Empirical Evaluation of Generic Convolutional and Recurrent Networks for Sequence Modeling。 TCN源代码:https://github.com/locuslab/TCN 文章目录 1. 序列建模2. 因果…

TCN(Temporal Convolutional Network,时间卷积网络)

1 前言 实验表明,RNN 在几乎所有的序列问题上都有良好表现,包括语音/文本识别、机器翻译、手写体识别、序列数据分析(预测)等。 在实际应用中,RNN 在内部设计上存在一个严重的问题:由于网络一次只能处理一个…

机器学习进阶之 时域/时间卷积网络 TCN 概念+由来+原理+代码实现

TCN 从“阿巴阿巴”到“巴拉巴拉” TCN的概念(干嘛来的!能解决什么问题)TCN的父母(由来)TCN的原理介绍上代码! 1、TCN(时域卷积网络、时间卷积网络)是干嘛的,能干嘛 主…

htop与top的区别

总览: 什么是htop top和htop的区别 htop和top的比较 在centos7上安装htop 下载htop源码交叉编译安装 如何使用htop命令 更改htop刷新时间间隔 htop命令的快捷键 什么是htop? htop是一个交互式和实时监视进程查看器的linux编写的 它取代了Unix程序的top …

AIX的topas命令详解

说明 topas命令的说明可以直接执行man topas了解,或者直接看IBM给的 原始文档,路径为:https://www.ibm.com/support/knowledgecenter/en/ssw_aix_71/com.ibm.aix.cmds5/topas.htm 命令详解 先上在AIX服务器上执行topas命令后的图片 区域1&…

Linux中 top命令详解

一、基础概念 指令: top 作用: 查看服务器的进程占用资源 进入命令: top (动态显示) 推出命令: 按 q 键 二、输出结果 表头字段含义: PID: 进程id USER: 该进程对应的用户 PR: …

TOP用法详解

1、top命令:相当于Windows下的资源管理器,能够动态实时的显示系统中进程的资源占用情况。 2、在Linux终端上输入top命令出现的结果及其表示的含义如下图: 顺便说一下uptime命令 3、以上是默认的显示内容,可以通过快捷键来更改显示…

topas命令解析

topas命令解析 Posted on 2011-12-08 11:40 疯狂 阅读(984) 评论(1) 编辑 收藏 所属分类: unix <!----> 上一张我们测试机的topas的图(aix 5.3)&#xff1a;然后后面附上解释&#xff1a; topas命令用于监控各种系统资源&#xff0c;如CPU的使用情况&#xff0c;CPU…

Top-Down性能分析

2014年Ahmand Yasin在它的IEEE论文《A top-down method for performance analysis and counter architercture》中&#xff0c;革命性地给出了一个从CPU指令执行的顺畅程度来评估和发现瓶颈的方法&#xff0c;允许我们从黑盒的角度来看问题。 TMAM&#xff1a;自顶向下的微体系…

TOP-K

目录 TOP-K介绍 TOP-K实现 源码 TOP-K介绍 什么是TOP-K&#xff1f; 贴近生活来说&#xff0c;点外卖&#xff0c;打游戏。比如某团&#xff0c;你点一个美食&#xff0c;选你选在城市后&#xff0c;你选择按评分排序&#xff0c;那么它会将这个城市里所有美食店铺评分最高的…

AIX系统 topas查看系统各项指标性能

AIX系统 topas查看系统各项指标性能 topas命令默认2秒更新一次 一、topas命令以区域形式表现系统各项指标性能 如下图&#xff1a; 1、 CPU&#xff1a;反应CPU性能区域&#xff0c;如果有多个 CPU&#xff0c;按 c 键两次就可显示 CPU 列表。仅按 c 键一次会关闭此区域 Us…

top 与 htop

top 与 htop 区别 一、相同点 两者均是可以查看cpu使用情况的命令 二、不同点 top 在linux系统中&#xff0c;top 命令用来显示系统中正在运行的进程的实时状态&#xff0c;它显示了一些非常有用的信息&#xff0c;比如 CPU 利用情况、内存消耗情况&#xff0c;以及每个进…

top cpu

我们有时会把%CPU和us%搞晕&#xff0c;也就是下图所示在top的时候查看cpu的信息。 这时有人会问&#xff1a;这两个CPU到底哪个是对的。 其实都是对的&#xff0c;只是表达的意思不一样。 官方解释如下 Cpu(s)&#xff1a;34.0% us: 用户空间占用CPU百分比 %CPU&#xff1…

TOP TOPAS

在IBM的OS AIX中,root用户输入topas可以查看系统的运行情况(有的OS是使用top查看),如图: (此图截于IBM eServer p5 590)Kernel:内存使用百分率 Network:网络信息区User: 用户进程使用百分率 Disk: 存储信息区Wait: …

安装TOPAS RTion extension, 出现的问题及解决方法

TOPAS MC上有安装general extension的教程&#xff0c;在To add User Extensions部分中。GitHub dicom-interface的readme应该是由于长时间没有更新&#xff0c;所以有些错误。本文是在Linux系统下安装RTion extension&#xff0c;其他系统应该也能借鉴。计算机小白&#xff0c…

TOPAS详解

原文出处&#xff1a;http://www.blogjava.net/freeman1984/archive/2011/12/08/365848.html 上一张我们测试机的topas的图(aix 5.3)&#xff1a;然后后面附上解释&#xff1a; topas命令用于监控各种系统资源&#xff0c;如CPU的使用情况&#xff0c;CPU事件和队列&#xff0…

AIX之topas命令详解

AIX基本命令topas简介 Posted on 2015 年 11 月 11 日 by xiaoyu 由于最近工作需要涉及到AIX主机、存储层面&#xff0c;就对这方面的内容做个简要的笔记&#xff0c;以供后续参考。 topas命令利用System Performance Measurement Interface&#xff08;SPMI) API获得有关信…

AIX topas命令详解

topas命令默认2秒更新一次 一、topas命令以区域形式表现系统各项指标性能&#xff0c; 如下图&#xff1a; 1、 CPU&#xff1a;反应CPU性能区域&#xff0c;如果有多个 CPU&#xff0c;按 c 键两次就可显示 CPU 列表。仅按 c 键一次会关闭此区域 User%&#xff1a;用户进程占…

Topas——基于Geant4的放射治疗蒙特卡罗算法模拟工具

Topas——基于Geant4的放射治疗蒙特卡罗算法模拟工具 关于Topas学习前提 安装Topas获取topas.tar.gz获取方法一获取方法二 配置unix环境安装Topas安装Geant4设置Geant4环境 使用Topas一个简单的 HelloWorld 程序 OneBox.txtTopas中txt参数文件的编写规则&#xff08;1&#xff…