import numpy as np
import pandas as pd
import tensorflow as tf
import datetime
import csv
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras import layers
from sklearn.preprocessing import StandardScaler
from collections import deque
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
# 数据库获取
filepath = r'C:\Users\hmzjb\PycharmProjects\pythonProject7\CNN-LSTM\processData\try111.csv'
dataset = pd.read_csv(filepath)
print(dataset.head()) # 查看前五行数据
#时间数据处理
# 将数据中的时间数据组合并转换成datetime数据
# 提取数据中的时间信息
years = dataset['year']
months = dataset['month']
days = dataset['day']
hours = dataset['hour']
minutes = dataset['minute']
seconds = dataset['second']
dates = [] # 存放组合后的时间信息
# 遍历一一对应的年月日信息
for year, month, day,hour,minute,second in zip(years, months, days,hours,minutes,seconds):
# 时间数据之间使用字符串拼接在一起
date = str(year) + '-' + str(month) + '-' + str(day) +'-'+ str(hour) +'-'+ str(minute) +'-'+ str(second)
# 将每个时间(字符串类型)保存
dates.append(date)
#字符串类型的时间转为datetime类型的时间
times = []
# 遍历所有的字符串类型的时间
for date in dates:
# 转为datetime类型
time = datetime.datetime.strptime(date, '%Y-%m-%d-%H-%M-%S')
# 逐一保存转变类型后的时间数据
times.append(time)
# 查看转换后的时间数据
print(times[:3])
# 特征可视化
# 指定绘图风格
plt.style.use('fivethirtyeight')
#设置画布,2行2列的画图窗口,第一行画x1和x2,第二行画x3和x4
fig, ((x1, x2), (x3, x4)) = plt.subplots(2, 2, figsize=(20, 10))
# REAL列
x1.plot(dataset['REAL'],color='red', linewidth=0.8)
# 设置x轴y轴标签和title标题
x1.set_xlabel('');x1.set_ylabel('GAS');x1.set_title('REAL')
# TP1711温度列
x2.plot(dataset['TP1711'],color='blue', linewidth=0.8)
# 设置x轴y轴标签和title标题
x2.set_xlabel('');x2.set_ylabel('Temperature');x2.set_title('TP1711')
# RH1712湿度列
x3.plot(dataset['RH1712'],color='purple', linewidth=0.8)
# 设置x轴y轴标签和title标题
x3.set_xlabel('');x3.set_ylabel('Humidity');x3.set_title('RH1712')
# BA1713气压列
x4.plot(dataset['BA1713'],color='pink', linewidth=0.8)
# 设置x轴y轴标签和title标题
x4.set_xlabel('');x4.set_ylabel('Pressure');x4.set_title('BA1713')
# 轻量化布局调整绘图
fig.patch.set_facecolor('xkcd:mint green')
plt.tight_layout(pad=2)
plt.show()
#数据预处理
# 从第7列开始选择特征
feats = dataset.iloc[:, 6:]
# 增加四项特征列
print(feats.shape) # (5000,4)
#选择特征数据中的真实气体数据'REAL'在最后4秒的气体浓度数据作为标签数据
pre_seconds =5
targets = feats['REAL'].shift(-pre_seconds)
# 查看标签信息
print(targets.shape) # (5000,)
# 由于特征值最后4行对应的标签是空值nan,将最后4行特征及标签删除
feats = feats[:-pre_seconds]
targets = targets[:-pre_seconds]
print('feats.shape:', feats.shape, 'targets.shape:', targets.shape) # (4996,4) (4996,)
# 特征数据标准化处理
# 接收标准化方法
scaler = StandardScaler()
# 对特征数据中所有的数值类型的数据进行标准化
feats.iloc[:, :] = scaler.fit_transform(feats.iloc[:, :])
# 展示标准化后的信息
print(feats)
#(5)时间序列处理
# 将特征数据从df类型转为numpy类型
feats = np.array(feats)
# 定义时间序列窗口是连续14秒的特征数据
max_series_seconds = 14
# 建立队列,队列的最大长度固定为14
deq = deque(maxlen=max_series_seconds) # 如果长度超出了14,先从队列头部开始删除
# 创建一个列表,保存处理后的特征序列
x = []
# 遍历每一行数据,包含4项特征
for i in feats:
# 将每一行数据存入队列中, numpy类型转为list类型
deq.append(list(i))
# 如果队列长度等于指定的序列长度,就保存这个序列
# 如果队列长度大于序列长度,队列会自动删除头端元素,在尾端追加新元素
if len(deq) == max_series_seconds:
# 保存每一组时间序列, 队列类型转为list类型
x.append(list(deq))
# 保存与特征对应的标签值
y = targets[max_series_seconds - 1:].values
# 保证序列长度和标签长度相同
print(len(x)) # 4983
print(len(y)) # 4983
# 将list类型转为numpy类型
x, y = np.array(x), np.array(y)
#数据集划分
total_num = len(x) # 一共有多少组序列
train_num = int(total_num*0.9) # 前80%的数据用来训练
val_num = int(total_num*0.95) # 前80%-90%的数据用来训练验证
# 剩余数据用来测试
x_train, y_train = x[:train_num], y[:train_num] # 训练集
x_val, y_val = x[train_num: val_num], y[train_num: val_num] # 验证集
x_test, y_test = x[val_num:], y[val_num:] # 测试集
# 构造数据集
batch_size =128 # 一次迭代处理128个序列
# 训练集
train_ds = tf.data.Dataset.from_tensor_slices((x_train, y_train))
train_ds = train_ds.cache().shuffle(10000).batch(batch_size).prefetch(tf.data.AUTOTUNE)
# 验证集
val_ds = tf.data.Dataset.from_tensor_slices((x_val, y_val))
val_ds = val_ds.batch(batch_size).cache().prefetch(tf.data.AUTOTUNE)
# 测试集
test_ds = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_ds = test_ds.batch(batch_size).cache().prefetch(tf.data.AUTOTUNE)
# 查看数据集信息
sample = next(iter(train_ds)) # 取出一个batch的数据
print('x_train.shape:', sample[0].shape) # (128, 14, 4)
print('y_train.shape:', sample[1].shape) # (128,)
#构建CNN-LSTM网络模型
# 输入层要和x_train的shape一致,但注意不要batch维度
input_shape = sample[0].shape[1:] # [14,4]
# 构造输入层
inputs = keras.Input(shape=input_shape) # [None, 14, 4]
# 调整维度 [None,14,4]==>[None,14,4,1]
x = layers.Reshape(target_shape=(inputs.shape[1], inputs.shape[2], 1))(inputs)
# 卷积+BN+Relu [None,14,4,1]==>[None,14,4,128]
x = layers.Conv2D(128, kernel_size=(3,3), strides=1, padding='same', use_bias=False,
kernel_regularizer=keras.regularizers.l2(0.01))(x)
x = layers.BatchNormalization()(x) # 批标准化
x = layers.Activation('relu')(x) # relu激活函数
# 池化下采样 [None,14,4,128]==>[None,14,4,128]
x = layers.MaxPool2D(pool_size=2, strides=1, padding="same")(x)
# 1*1卷积调整通道数 [None,14,4,128]==>[None,14,4,1]
x = layers.Conv2D(1, kernel_size=(3,3), strides=1, padding='same', use_bias=False,
kernel_regularizer=keras.regularizers.l2(0.01))(x)
# 把最后一个维度挤压掉 [None,14,4,1]==>[None,14,4]
x = tf.squeeze(x, axis=-1)
# [None,14,4] ==> [None,14,256] ==> [None,128]
# 第一个LSTM层, 如果下一层还是LSTM层就需要return_sequences=True, 否则就是False
x = layers.Bidirectional(layers.LSTM(128, activation='relu',return_sequences=True,
kernel_regularizer=keras.regularizers.l2(0.01)))(x)
# 添加第二个LSTM层
x = layers.Bidirectional(layers.LSTM(64, activation='relu',return_sequences=False,
kernel_regularizer=keras.regularizers.l2(0.01)))(x)
# 添加全连接层[None,64]
x = layers.Dense(64, activation='relu')(x)
# 添加输出层[None,1]
outputs = layers.Dense(1, activation='sigmoid')(x)
# 构建模型
model = keras.Model(inputs=inputs, outputs=outputs, name='cnn_lstm_model')
model.summary()
# 编译模型
model.compile(optimizer=keras.optimizers.Adam(0.001), # adam优化器学习率0.001
loss=tf.keras.losses.MeanAbsoluteError(), # 标签和预测之间绝对差异的平均值
metrics=tf.keras.losses.MeanSquaredLogarithmicError()) # 计算标签和预测之间的对数误差均方值。
epochs = 20
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
瓦斯浓度预测源码.zip (65个子文件)
瓦斯浓度预测源码
CNN-LSTM
data
try.csv.baiduyun.uploading.cfg 11KB
try.csv 56.52MB
原数据展示
RH1712原数据展示.py.baiduyun.uploading.cfg 3KB
RH1712原数据展示.py 329B
BA1713原数据展示.py.baiduyun.uploading.cfg 3KB
TP1711原数据展示.py 329B
TP1711原数据展示.py.baiduyun.uploading.cfg 3KB
BA1713原数据展示.py 326B
瓦斯MM264数据展示.py.baiduyun.uploading.cfg 3KB
瓦斯MM264数据展示.py 380B
processData
try2.csv 24KB
try11.csv 185KB
try1.csv 584KB
try11.csv.baiduyun.uploading.cfg 3KB
try111.csv 185KB
try111.csv.baiduyun.uploading.cfg 3KB
try1.csv.baiduyun.uploading.cfg 3KB
try2.csv.baiduyun.uploading.cfg 3KB
数据清洗
定义REAL值.py 443B
数据清洗.py.baiduyun.uploading.cfg 3KB
清洗后的数据展示.py.baiduyun.uploading.cfg 3KB
数据清洗.py 861B
pandas_excel.py.baiduyun.uploading.cfg 3KB
pandas_excel.py 1KB
try.csv.baiduyun.uploading.cfg 13KB
try.csv 69.96MB
定义REAL值.py.baiduyun.uploading.cfg 3KB
清洗后的数据展示.py 949B
预测指标对比
CNN.csv.baiduyun.uploading.cfg 3KB
CNN-LSTM.csv.baiduyun.uploading.cfg 3KB
预测指标可视化.py.baiduyun.uploading.cfg 3KB
LSTM.csv 72B
CNN-LSTM.csv 74B
预测指标可视化.py 1KB
LSTM.csv.baiduyun.uploading.cfg 3KB
CNN.csv 77B
查询TensorFlow版本
查询TensorFlow版本.py 474B
查询TensorFlow版本.py.baiduyun.uploading.cfg 3KB
CNN-LSTM网络预测
CNN-LSTM-GAS.py.baiduyun.uploading.cfg 3KB
CNN-LSTM-GAS.py 10KB
CNN-GAS.py 4KB
LSTM-GAS.py 4KB
LSTM-GAS.py.baiduyun.uploading.cfg 3KB
CNN-GAS.py.baiduyun.uploading.cfg 3KB
methane_data
methane_data.csv 1.03GB
.idea
.name 6B
misc.xml.baiduyun.uploading.cfg 3KB
vcs.xml.baiduyun.uploading.cfg 3KB
pythonProject7.iml.baiduyun.uploading.cfg 3KB
.name.baiduyun.uploading.cfg 3KB
libraries
R_User_Library.xml.baiduyun.uploading.cfg 3KB
R_User_Library.xml 128B
vcs.xml 241B
workspace.xml 59KB
misc.xml 196B
inspectionProfiles
Project_Default.xml 270B
profiles_settings.xml 228B
Project_Default.xml.baiduyun.uploading.cfg 3KB
profiles_settings.xml.baiduyun.uploading.cfg 3KB
modules.xml 287B
.gitignore 50B
pythonProject7.iml 438B
modules.xml.baiduyun.uploading.cfg 3KB
.gitignore.baiduyun.uploading.cfg 3KB
workspace.xml.baiduyun.uploading.cfg 3KB
共 65 条
- 1
资源评论
NURBS.
- 粉丝: 131
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功