基于空洞卷积DCNN与长短期时间记忆模型LSTM的dcnn-lstm的回归预测模型

周末的时候有时间鼓捣的一个小实践,主要就是做的多因子回归预测的任务,关于时序数据建模和回归预测建模我的专栏和系列博文里面已经有了非常详细的介绍了,这里就不再多加赘述了,这里主要是一个模型融合的实践,这里的数据是仿真生成的领域数据集,典型的表格型数据集,首先看下数据样例:

 基础的数据处理实现如所示:

import pandas as pd

# 读取 "data" 工作表的内容
sheet_name = "data"
data = pd.read_excel("dataset.xlsx", sheet_name=sheet_name)

# 删除第一列日期列
data1= data.iloc[:, 1:]

print(data1.head(20))

接下来随机划分数据集,实现如下所示:

from sklearn.model_selection import train_test_split
X = data.drop(columns=['Y'])  # 这将删除名为'label'的列,并返回其余部分
y = data['Y']
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

接下来对数据进行归一化处理计算,如下所示:

# 创建特征标准化的对象
scaler = StandardScaler()  # 或者使用 MinMaxScaler() 来进行 Min-Max 缩放

# 训练标准化对象并转换训练特征
x_train_scaled = scaler.fit_transform(x_train)

# 假设你有测试数据 x_test 和 y_test,对测试特征进行相同的变换
x_test_scaled = scaler.transform(x_test)

# 输出尺寸
print("训练特征(标准化后)的尺寸:", x_train_scaled.shape)
print("测试特征(标准化后)的尺寸:", x_test_scaled.shape)
print("特征列(x_train)的尺寸:", x_train.shape)
print("标签列(y_train)的尺寸:", y_train.shape)
print("特征列(x_test)的尺寸:", x_test.shape)
print("标签列(y_test)的尺寸:", y_test.shape)

接下来是数据转化处理:

def reshape_to_window(data, window=window):
    """
    数据转化
    """
    n = data.shape[0]
    m = data.shape[1]
    result = np.zeros((n - window + 1, window, m))
    for i in range(n - window + 1):
        result[i] = data[i:i+window]
    return result


x_train = reshape_to_window(x_train, window)
y_train = y_train.iloc[window-1:]

x_test = reshape_to_window(x_test, window)
y_test = y_test.iloc[window-1:]

print("新的x_train形状:", x_train .shape )
print("新的y_train形状:", y_train .shape)
print("新的x_test形状:", x_test.shape)
print("新的y_test形状:", y_test.shape)

接下来基于keras框架初始化搭建模型,这里模型部分主要是运用了DCNN和LSTM,对其进行融合。首先来整体回归下DCNN和LSTM:

DCNN

空洞卷积(dilated convolution)是一种卷积神经网络(Convolutional Neural Network, CNN)中的卷积操作,它通过在卷积核上添加空洞(dilation)来扩展感受野(receptive field),从而提高模型的鲁棒性和泛化能力。

在传统的卷积操作中,卷积核只能覆盖一小部分特征图,但是通过在卷积核上添加空洞,可以让卷积核在相邻的特征图之间滑动,从而扩展了卷积核的感受野,增强了模型的表达能力。空洞卷积的基本原理是将传统卷积操作的滑动步长(stride)设置为1,然后将卷积核的大小(kernel size)除以2,使得卷积核中心点能够与特征图上任意位置的像素进行卷积运算。

在空洞卷积中,每个卷积层都具有不同数量的空洞率(dilation rate),表示在每个卷积层中添加的空洞数量。空洞率越高,则卷积核的感受野越大,能够提取更多的特征信息。但是,空洞率过高会导致特征图变得稀疏,难以捕捉到细节信息。因此,在空洞卷积中需要权衡空洞率和特征图的稀疏性。

空洞卷积在深度卷积神经网络中可以应用于多个任务,例如图像分类、目标检测、语义分割等。相比于传统的卷积操作,空洞卷积能够提高模型的鲁棒性和泛化能力,同时减少计算量和参数数量,使得模型更加轻量级和高效。

LSTM

LSTM(Long Short-Term Memory)是一种循环神经网络(RNN)的变体,特别适用于处理序列数据。相较于传统的RNN,LSTM在处理时间序列数据时具有更好的性能和稳定性。

LSTM由遗忘门(forget gate)、输入门(input gate)、输出门(output gate)和存储单元(cell state)组成。遗忘门决定了前一时刻的记忆状态中哪些信息应该被遗忘,输入门决定了当前输入的信息中哪些应该被用于计算输出,输出门决定了当前时刻的输出,而存储单元则用于存储和输出当前时刻的记忆状态。

LSTM的核心思想是通过遗忘门和输入门来控制信息的流动,从而在长期依赖和短期依赖之间取得平衡。遗忘门和输入门都是由sigmoid函数和线性层组成的,而输出门则是由sigmoid函数、线性层和ReLU函数组成的。这些门控制了信息的流动方向和强度,使得LSTM能够处理长期依赖关系。

除了LSTM之外,还有GRU(Gated Recurrent Unit)和SRU(Simple Recurrent Unit)等循环神经网络变体,它们在结构和性能上与LSTM类似。LSTM在自然语言处理、语音识别、图像处理等领域都有广泛的应用。

模型部分代码实现如下所示:

from tensorflow.keras import backend as K

# # 输入参数

input_size = 176  # 你的输入尺寸
lstm_units =16# 你的LSTM单元数
dropout = 0.01    # 你的dropout率

# 定义模型结构
inputs = Input(shape=(window, input_size))

# 第一层空洞卷积
model = Conv1D(filters=lstm_units, kernel_size=1, dilation_rate=1, activation='relu')(inputs)
# model = MaxPooling1D(pool_size=1)(model)
# model = Dropout(dropout)(model)

# 第二层空洞卷积
model = Conv1D(filters=lstm_units, kernel_size=1, dilation_rate=2, activation='relu')(model)
# model = MaxPooling1D(pool_size=1)(model)

# 第三层空洞卷积
model = Conv1D(filters=lstm_units, kernel_size=1, dilation_rate=4, activation='relu')(model)
# model = MaxPooling1D(pool_size=1)(model)
# model = BatchNormalization()(model)

# LSTM层
model = LSTM(lstm_units, return_sequences=False)(model)

# 输出层
outputs = Dense(1)(model)

# 创建和编译模型
model = Model(inputs=inputs, outputs=outputs)

model.compile(loss='mse', optimizer='adam', metrics=['mse'])
model.summary()

摘要输出如下所示:

 接下来就可以启动模型训练,日志输出如下所示:

 接下来对模型整体训练过程中的loss进行可视化,如下所示:

plt.figure(figsize=(12, 6))
plt.plot(history.history['loss'], label='Training Loss')
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(loc='upper right')
plt.show()

结果如下所示:

 接下来对测试集进行预测对比分析,如下所示:

explained_variance_score:解释回归模型的方差得分,其值取值范围是[0,1],越接近于1说明自变量越能解释因变量
    的方差变化,值越小则说明效果越差。
    mean_absolute_error:平均绝对误差(Mean Absolute Error,MAE),用于评估预测结果和真实数据集的接近程度的程度
    ,其其值越小说明拟合效果越好。
    mean_squared_error:均方差(Mean squared error,MSE),该指标计算的是拟合数据和原始数据对应样本点的误差的
    平方和的均值,其值越小说明拟合效果越好。
    r2_score:判定系数,其含义是也是解释回归模型的方差得分,其值取值范围是[0,1],越接近于1说明自变量越能解释因
    变量的方差变化,值越小则说明效果越差。 

基于回归模型评测指标对模型进行评估计算,核心代码实现如下所示:

#!usr/bin/env python
#encoding:utf-8
from __future__ import division
 
 
'''
__Author__:沂水寒城
功能:计算回归分析模型中常用的四大评价指标
'''
 
from sklearn.metrics import explained_variance_score, mean_absolute_error, mean_squared_error, r2_score
 
 
 
def calPerformance(y_true,y_pred):
    '''
    模型效果指标评估
    y_true:真实的数据值
    y_pred:回归模型预测的数据值
    '''
    model_metrics_name=[explained_variance_score, mean_absolute_error, mean_squared_error, r2_score]  
    tmp_list=[]  
    for one in model_metrics_name:  
        tmp_score=one(y_true,y_pred)  
        tmp_list.append(tmp_score)  
    print ['explained_variance_score','mean_absolute_error','mean_squared_error','r2_score']
    print tmp_list
    return tmp_list
 

def mape(y_true, y_pred):
    return np.mean(np.abs((y_pred - y_true) / y_true)) * 100
from sklearn.metrics import r2_score
RMSE = mean_squared_error(y_train_predict, y_train)**0.5
print('训练集上的/RMSE/MAE/MSE/MAPE/R^2')
print(RMSE)
print(mean_absolute_error(y_train_predict, y_train))
print(mean_squared_error(y_train_predict, y_train) )
print(mape(y_train_predict, y_train) )
print(r2_score(y_train_predict, y_train) )


RMSE2 = mean_squared_error(y_test_predict, y_test)**0.5
print('测试集上的/RMSE/MAE/MSE/MAPE/R^2')
print(RMSE2)
print(mean_absolute_error(y_test_predict, y_test))
print(mean_squared_error(y_test_predict, y_test))
print(mape(y_test_predict,  y_test))
print(r2_score(y_test_predict, y_test))

结果输出如下所示:

训练集上的/RMSE/MAE/MSE/MAPE/R^2
0.011460134959888058
0.00918032687965506
0.00013133469329884847
4.304916429848429
0.9907179432442654
测试集上的/RMSE/MAE/MSE/MAPE/R^2
0.08477191056357428
0.06885029105374023
0.007186276820598636
24.05688263657184
0.4264760739398442

关于回归建模相关的内容感兴趣的话可以参考我前面的文章:

《常用数据回归建模算法总结记录》

《sklearn实践之——计算回归模型的四大评价指标(explained_variance_score、mean_absolute_error、mean_squared_error、r2_score)》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

面试题——网络IO模型

一、socket socket是在应用层和传输层中间的抽象层,它把传输层(TCP/UDP)的复杂操作抽象成一些简单的接口,供应用层调用实现进程在网络中的通信。Socket起源于UNIX,在Unix一切皆文件的思想下,进程间通信就被…

【Tkinter界面:练习-01】窗口-部件-布局

一、说明 python在用户界面开发中,其中有QT5,和Tkinter;对于实际项目,界面需要高大上,因此用QT5,对于开发人员的演示程序,或简单程序中,不建议QT5;用Tkinter已经足够。本…

VMware Aria Operations SSH 身份验证绕过漏洞 (CVE-2023-34039)

zhi.oscs1024.com​​​​​ 漏洞类型身份验证不当发现时间2023-08-30漏洞等级严重MPS编号MPS-d9wr-56qmCVE编号CVE-2023-34039漏洞影响广度广 漏洞危害 OSCS 描述VMware Aria Operations for Networks 是 VMware 公司提供的一款网络可视性和分析工具,用于优化网络…

USB fastboot

1 Samsung fastboot flashing unlock 2 bootloader增加解锁密码 diff --git a/app/aboot/aboot.c b/app/aboot/aboot.c index e4d46e4..1b4b450 100755 --- a/app/aboot/aboot.c b/app/aboot/aboot.c -2613,6 2613,20 void cmd_oem_unlock(const char *arg, void *data,…

群晖DS923+扩展ECC 64G内存

1 有必要上64G吗? 如果你不运行大型应用以及安装的套件不多,并且不使用虚拟机,确实没有太大必要。 但是大内存除了这些用处,还会被系统作为缓存使用。在资源监控中查看内存结构,虽然内存利用率只有4%,但缓存…

matlab 计算点云协方差矩阵

目录 一、概述1、算法概述2、主要函数二、代码示例三、结果展示四、参数解析输入参数输出参数五、参考链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述

科研无人机平台P600进阶版,突破科研难题!

随着无人机技术日益成熟,无人机的应用领域不断扩大,对无人机研发的需求也在不断增加。然而,许多开发人员面临着无法从零开始构建无人机的时间和精力压力,同时也缺乏适合的软件平台来支持他们的开发工作。为了解决这个问题&#xf…

Django实现音乐网站 ⒂

使用Python Django框架制作一个音乐网站, 本篇主要是歌手详情页-基本信息、单曲列表功能开发实现内容。 目录 歌手基本信息 增加路由 显示视图 模板显示 推荐歌手跳转详情 歌手增加基本信息 表模型增加字段 数据表更新 基本信息增加内容渲染 歌手单曲列表…

详解排序算法(附带Java/Python/Js源码)

冒泡算法 依次比较两个相邻的子元素,如果他们的顺序错误就把他们交换过来,重复地进行此过程直到没有相邻元素需要交换,即完成整个冒泡,时间复杂度。 比较相邻的元素。如果第一个比第二个大,就交换它们两个;…

RSA算法与错误敏感攻击

参见《RSA 算法的错误敏感攻击研究与实践》 RSA 算法简介 RSA 算法原理: 1) RSA 算法密钥产生过程 (1)系统随机产生两个大素数 p p p 和 q q q,对这两个数据保密; (2)计算 n p …

springboot集成es 插入和查询的简单使用

第一步&#xff1a;引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId><version>2.2.5.RELEASE</version></dependency>第二步&#xff1a;…

uniapp微信小程序使用stomp.js实现STOMP传输协议的实时聊天

简介&#xff1a; 原生微信小程序中使用 本来使用websocket&#xff0c;后端同事使用了stomp协议&#xff0c;导致前端也需要对应修改。 如何使用 1.yarn add stompjs 2.版本 “stompjs”: “^2.3.3” 3.在static/js中新建stomp.js和websocket.js&#xff0c;然后在需要使用…

Nginx详解 三:高级配置

文章目录 1. 网页的状态页2. Nginx第三方模块2.1 echo模块 3. 变量3.1 内置变量3.1.1 示例 3.2 自定义变量3.2.1 自定义访问日志3.2.2 自定义json 格式日志 3.4 Nginx压缩功能 4. HTTPS4.1 Nginx的HTTPS工作原理4.2 启用功能模块的配置过程 5、自定义图标 1. 网页的状态页 基于…

深度学习在自然语言处理中的十大应用领域

文章目录 1. 机器翻译2. 文本分类3. 命名实体识别4. 问答系统5. 文本生成6. 情感分析7. 语言生成与处理8. 信息检索与摘要9. 文本纠错与修复10. 智能对话系统总结 &#x1f389;欢迎来到AIGC人工智能专栏~深度学习在自然语言处理中的十大应用领域 ☆* o(≧▽≦)o *☆嗨~我是IT陈…

【Kali Linux高级渗透测试】深入剖析Kali Linux:高级渗透测试技术与实践

&#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于恒川的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初阶、C…

NPM 常用命令(一)

目录 1、npm 1.1 简介 1.2 依赖性 1.3 安装方式 2、npm access 2.1 命令描述 2.2 详情 3、npm adduser 3.1 描述 4、npm audit 4.1 简介 4.2 审计签名 4.3 操作示例 4.4 配置 audit-level dry-run force json package-lock-only omit foreground-scripts …

Ubuntu 下安装Qt5.12.12无法输入中文解决方法

Ubuntu 下安装Qt5.12.12无法输入中文解决方法 一&#xff0c;环境&#xff1a; &#xff08;1&#xff09;VMware Workstation 15 Pro &#xff08;2&#xff09;Ubuntu 20.04 &#xff08;3&#xff09;Qt 5.12.12 64bits &#xff08;4&#xff09;Qt Creator 5.0.2 &#…

浅析Redis(1)

一.Redis的含义 Redis可以用来作数据库&#xff0c;缓存&#xff0c;流引擎&#xff0c;消息队列。redis只有在分布式系统中才能充分的发挥作用&#xff0c;如果是单机程序&#xff0c;直接通过变量来存储数据是更优的选择。那我们知道进程之间是有隔离性的&#xff0c;那么re…

[第七届蓝帽杯全国大学生网络安全技能大赛 蓝帽杯 2023]——Web方向部分题 详细Writeup

Web LovePHP 你真的熟悉PHP吗&#xff1f; 源码如下 <?php class Saferman{public $check True;public function __destruct(){if($this->check True){file($_GET[secret]);}}public function __wakeup(){$this->checkFalse;} } if(isset($_GET[my_secret.flag]…

用AI + Milvus Cloud搭建着装搭配推荐系统教程

以下函数定义了如何将图像转换为向量并插入到 Milvus Cloud 向量数据库中。代码会循环遍历所有图像。(注意:如果需要开启 Milvus Cloud 全新特性动态 Schema,需要修改代码。) 查询向量数据库 以下代码演示了如何使用输入图像查询 Milvus Cloud 向量数据库,以检索和上传…