您的位置:首页 > 文旅 > 旅游 > Python基于TensorFlow实现卷积神经网络-双向长短时记忆循环神经网络回归模型(CNN-BiLSTM回归算法)项目实战

Python基于TensorFlow实现卷积神经网络-双向长短时记忆循环神经网络回归模型(CNN-BiLSTM回归算法)项目实战

2024/10/6 14:36:34 来源:https://blog.csdn.net/weixin_42163563/article/details/141056273  浏览:    关键词:Python基于TensorFlow实现卷积神经网络-双向长短时记忆循环神经网络回归模型(CNN-BiLSTM回归算法)项目实战

说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。

1.项目背景

随着深度学习技术的发展,尤其是卷积神经网络(Convolutional Neural Networks, CNNs)和循环神经网络(Recurrent Neural Networks, RNNs)的应用越来越广泛。CNNs 在处理图像数据方面表现出了强大的能力,而RNNs 特别是其变种如长短时记忆网络(Long Short-Term Memory, LSTM)则擅长处理序列数据。结合这两种模型的优势,可以有效地解决一些复杂的数据分析问题。

本项目旨在构建一种混合型深度学习模型——卷积神经网络与双向长短时记忆循环神经网络(CNN-BiLSTM)回归模型,用于解决特定领域中的预测任务。通过结合CNN对局部特征的有效提取能力和BiLSTM对时间序列数据的高效处理能力,我们期望能够提高模型对于复杂数据集的预测准确性。 

本项目通过基于TensorFlow实现卷积神经网络-双向长短时记忆循环神经网络回归模型(CNN-BiLSTM回归算法)项目实战。   

2.数据获取

本次建模数据来源于网络(本项目撰写人整理而成),数据项统计如下:

编号 

变量名称

描述

1

x1

2

x2

3

x3

4

x4

5

x5

6

x6

7

x7

8

x8

9

x9

10

x10

11

y

因变量

数据详情如下(部分展示):

3.数据预处理

3.1 用Pandas工具查看数据

使用Pandas工具的head()方法查看前五行数据:

关键代码:

3.2数据缺失查看

使用Pandas工具的info()方法查看数据信息:

从上图可以看到,总共有11个变量,数据中无缺失值,共2000条数据。

关键代码: 

3.3数据描述性统计

通过Pandas工具的describe()方法来查看数据的平均值、标准差、最小值、分位数、最大值。

关键代码如下:  

4.探索性数据分析

4.1 y变量分布直方图

用Matplotlib工具的hist()方法绘制直方图:

4.2 相关性分析

从上图中可以看到,数值越大相关性越强,正值是正相关、负值是负相关。

5.特征工程

5.1 建立特征数据和标签数据

关键代码如下:

5.2 数据集拆分

通过train_test_split()方法按照80%训练集、20%测试集进行划分,关键代码如下:

5.3 数据样本增维

数据样本增加维度后的数据形状:

6.构建卷积神经网络-双向长短时记忆循环神经网络回归模型  

主要使用CNN-BiLSTM回归算法,用于目标回归。  

6.1 构建模型  

编号

模型名称

参数

1

CNN-BiLSTM回归模型

units=200

2

epochs=150

3

filters=5

6.2 模型摘要信息

6.3 模型网络结构

6.4 模型训练集测试集损失曲线图

7.模型评估

7.1评估指标及结果 

评估指标主要包括R方、均方误差、解释性方差、绝对误差等等。

模型名称

指标名称

指标值

测试集

CNN-BiLSTM回归模型

R方

0.9628

均方误差

1265.2783

解释方差分

0.9634

绝对误差

25.5081

从上表可以看出,R方分值为0.9628,说明模型效果比较好。

关键代码如下:  

  

7.2 真实值与预测值对比图

从上图可以看出真实值和预测值波动基本一致,模型效果良好。  

8.结论与展望

综上所述,本文采用了CNN-BiLSTM回归算法来构建回归模型,最终证明了我们提出的模型效果良好。此模型可用于日常产品的预测。

# y变量分布直方图
fig = plt.figure(figsize=(8, 5))  # 设置画布大小
plt.rcParams['font.sans-serif'] = 'SimHei'  # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题
data_tmp = df['y']  # 过滤出y变量的样本
# 绘制直方图  bins:控制直方图中的区间个数 auto为自动填充个数  color:指定柱子的填充色
plt.hist(data_tmp, bins='auto', color='g')  # 绘图
plt.xlabel('y')  # 设置x轴名称
plt.ylabel('数量')  # 设置y轴名称
plt.title('y变量分布直方图')  # 设置标题名称
data_tmp = df['y']  # 过滤出y变量的样本
# 绘制直方图  bins:控制直方图中的区间个数 auto为自动填充个数  color:指定柱子的填充色
plt.hist(data_tmp, bins='auto', color='g')  # 绘图# 获取方式:# 项目实战合集导航:# https://docs.qq.com/sheet/DTVd0Y2NNQUlWcmd6?tab=BB08J2print('***********************查看训练集的形状**************************')
print(X_train.shape)  # 查看训练集的形状X_test = layers.Lambda(lambda X_test: K.expand_dims(X_test, axis=-1))(X_test)  # 增加维度
print('***********************查看测试集的形状**************************')
print(X_test.shape)  # 查看测试集的形状
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
plt.plot(range(len(y_test)), y_test, color="blue", linewidth=1.5, linestyle="-")  # 绘图
plt.plot(range(len(y_pred)), y_pred, color="red", linewidth=1.5, linestyle="-.")  # 绘图
plt.legend(['真实值', '预测值'])  # 设置图例

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com