Advertisement

【深度学习——RNN心脏病预测】

阅读量:

🍨 本文为🔗365天深度学习训练营中的学习记录博客
🍦 参考文章:🔗深度学习100例-循环神经网络(RNN)心脏病预测
🍖 原作者:K同学啊|接辅导、项目定制

  • 难度:新手入门⭐

🍺要求:

  1. 本地读取并加载数据。
  2. 了解循环神经网络(RNN)的构建过程
  3. 测试集accuracy到达87%

🍻拔高:

  • 测试集accuracy到达89%

🍺我的环境:

  • 语言环境:Python3.7
  • 编译器:Spyder
  • 深度学习框架:TensorFlow2.4.1
  • 数据地址:🔗百度网盘

代码流程图如下所示:

一、前期准备

1、设置GRU

在实际应用中,大规模的RNN模型通常需要大量的训练时间才能收敛,而GPU可以大大减少训练时间并提高学习效率。此外,GPU还能够在部署和推理阶段中提高RNN模型的速度和性能,因为GPU对于较大的并行计算具有天然的优势。

复制代码
    import tensorflow as tf
    
    gpus=tf.config.list_physical_devices("GPU")
    
    if gpus:
    gpu0=gpus[0] # 如果有多个GPU,仅使用第0个GPU
    tf.config.experimental.set_memory_growth(gpu0, True)# 设置GPU显存用量按需使用
    tf.config.set_visible_devices([gpu0],"GPU")
    
    print(gpus)

2、导入数据

下面是对数据的介绍:

age:1) 年龄
sex:2) 性别
cp:3) 胸痛类型 (4 values)
trestbps:4) 静息血压
chol:5) 血清胆甾醇 (mg/dl
fbs:6) 空腹血糖 > 120 mg/dl
restecg:7) 静息心电图结果 (值 0,1 ,2)
thalach:8) 达到的最大心率
exang:9) 运动诱发的心绞痛
oldpeak:10) 相对于静止状态,运动引起的ST段压低
slope:11) 运动峰值 ST 段的斜率
ca:12) 荧光透视着色的主要血管数量 (0-3)
thal:13) 0 = 正常;1 = 固定缺陷;2 = 可逆转的缺陷
target:14) 0 = 心脏病发作的几率较小 1 = 心脏病发作的几率更大

读取数据

复制代码
    import pandas as pd
    import numpy as np
    
    df=pd.read_csv("D:/桌面/深度学习数据/heart.csv")
    
    print(df)
在这里插入图片描述

3、检查数据是否有空值

复制代码
    print(df.isnull().sum())

在这里插入图片描述
由结果可知每个数据空值的个数为0,数据正常。

二、数据预处理

1、划分训练集和测试集

🍺训练集、验证集和测试集之间的关系:
在机器学习中,通常将数据集划分为三个部分:训练集、验证集和测试集。训练集用于在模型训练期间进行模型参数的调整,而验证集则用于选择模型,并根据验证集结果进行超参数调整,最后,测试集用于评估模型在未知数据上的性能。验证集和测试集是相互独立的数据集,在进行模型选择和超参数调整时,它们起着不同的作用。

复制代码
    from sklearn.preprocessing import StandardScaler
    from sklearn.model_selection import train_test_split
    
    X=df.iloc[:,:-1]
    y=df.iloc[:,-1]
    
    X_train,X_test,y_train,y_test=train_test_split(X, y,test_size=0.1,random_state=1)
    print(X_train.shape,y_train.shape)

🍺代码解释:
这段代码是用于对数据进行预处理、划分训练集和测试集,并输出训练数据和测试数据的样本数。
拆解一下:

X=df.iloc[:,:-1]y=df.iloc[:,-1]:表示将特征数据和标签数据分别赋值给变量Xy,其中iloc是Pandas中的索引函数,:表示取所有行,,:-1表示取除最后一列外的所有列,[:,-1]表示取第最后一列。

X_train,X_test,y_train,y_test=train_test_split(X, y,test_size=0.1,random_state=1):表示将数据集划分为训练集和测试集,并将划分好的数据分别赋值给变量X_trainX_testy_trainy_test,其中:

复制代码
* `X`和`y`:表示原始的特征数据和标签数据。
* `test_size=0.1`:表示划分为测试集的比例为10%。
* `random_state=1`:表示随机种子,保证每次划分的结果一致。

因此,这段代码的作用是将原始的特征数据和标签数据进行划分,分别得到训练集和测试集,并输出训练数据和测试数据的样本数。这样划分预处理好的数据集,能够用来训练和评估机器学习模型。
在这里插入图片描述

2、数据标准化

复制代码
    # 将每一列特征标准化为标准正太分布,注意,标准化是针对每一列而言的
    sc=StandardScaler()
    X_train=sc.fit_transform(X_train)
    X_test=sc.transform(X_test)
    
    X_train=X_train.reshape(X_train.shape[0],X_train.shape[1],1)
    # 指定了变换后的数组的形状,其分别为(样本数量,特征数量,1),其中1表示数据的通道数。
    X_test=X_test.reshape(X_test.shape[0],X_test.shape[1],1)
    #同样指定了变换后的测试集数组的形状,其也为(样本数量,特征数量,1)。
    print(X_train,y_train)

🍺代码解释:
这段代码是用于对特征数据进行标准化处理,并将将特征数据调整为合适的形状以适应模型的输入要求,并最终输出训练数据和标签数据。
拆解一下:

sc=StandardScaler():表示创建一个StandardScaler的对象sc,用于数据的标准化处理。

X_train=sc.fit_transform(X_train)X_test=sc.transform(X_test):分别表示对训练数据和测试数据进行标准化处理。其中fit_transform表示训练和转换,即计算训练数据的均值和标准差并调整数据,transform表示使用训练数据的均值和标准差调整测试数据。这里是为了保证训练数据和测试数据基于相同的均值和标准差进行标准化处理。

X_train=X_train.reshape(X_train.shape[0],X_train.shape[1],1)X_test=X_test.reshape(X_test.shape[0],X_test.shape[1],1):分别表示将训练数据和测试数据进行形状调整,以适应模型的输入要求,其中reshape函数用于调整形状。这里是将每个样本数据的特征数量、通道数从1个调整为3个,以便于输入到神经网络模型中进行训练和测试。

print(X_train,y_train):表示输出最终的训练数据和标签数据。

因此,这段代码的作用是对原始的训练数据和测试数据进行标准化处理,并将训练数据和测试数据的形状调整为合适的形式,以便于适应神经网络模型的输入要求,并最终输出最终的训练数据和标签数据。这样处理后的数据可以用于训练和评估机器学习模型。

三、构建RNN模型

⭐函数原型

tf.keras.layers.SimpleRNN(units,activation=‘tanh’,use_bias=True,kernel_initializer=‘glorot_uniform’,
recurrent_initializer=‘orthogonal’,bias_initializer=‘zeros’,kernel_regularizer=None,recurrent_regularizer=None,bias_regularizer=None,activity_regularizer=None,kernel_constraint=None,recurrent_constraint=None,
bias_constraint=None,dropout=0.0,recurrent_dropout=0.0,return_sequences=False,return_state=False,
go_backwards=False,stateful=False,unroll=False,**kwargs)

⭐关键参数说明

units: 正整数,输出空间的维度。
activation: 要使用的激活函数。 默认:双曲正切(tanh)。 如果传入 None,则不使用激活函数 (即 线性激活:a(x) = x)。
use_bias: 布尔值,该层是否使用偏置向量。
kernel_initializer: kernel 权值矩阵的初始化器, 用于输入的线性转换 (详见 initializers)。
recurrent_initializer: recurrent_kernel 权值矩阵 的初始化器,用于循环层状态的线性转换 (详见 initializers)。
bias_initializer:偏置向量的初始化器 (详见initializers).
dropout: 在 0 和 1 之间的浮点数。 单元的丢弃比例,用于输入的线性转换。

复制代码
    import tensorflow
    from tensorflow.keras.models import Sequential
    from tensorflow.keras.layers import Dense,LSTM,SimpleRNN
    
    model=Sequential()
    model.add( SimpleRNN(200, input_shape=(13,1),activation='relu'))
    model.add(Dense(100, activation='relu'))
    model.add(Dense(1, activation='sigmoid'))
    model.summary()

🍻代码解释
这段代码是用于构建一个基于SimpleRNN的神经网络模型。
拆解一下:

Sequential():是Keras中一种新建序列化神经网络模型的方法。它可以让我们快速构建一个神经网络,从而专注于神经网络的设计和特征工程。

model.add( SimpleRNN(200, input_shape=(13,1),activation='relu')):是向Sequential模型中添加SimpleRNN层的操作,其中:

复制代码
* `SimpleRNN(200)`表示添加的SimpleRNN层具有200个神经元。
* `input_shape=(13,1)`表示输入数据的形状为(13,1),即13个时间步的单通道数据。
* `activation='relu'`表示使用ReLU激活函数进行非线性变换。

model.add(Dense(100, activation='relu')):是向Sequential模型中添加一个全连接层的操作,其中:

复制代码
* `Dense(100)`表示添加的全连接层具有100个神经元。
* `activation='relu'`表示使用ReLU激活函数进行非线性变换。

model.add(Dense(1, activation='sigmoid')):是向Sequential模型中添加一个全连接层的操作,其中:

复制代码
* `Dense(1)`表示添加的全连接层具有1个神经元,因为这个模型的输出是一个二分类结果。
* `activation='sigmoid'`表示使用sigmoid激活函数进行非线性变换。

model.summary():是Keras中的一个方法,用于输出构建的模型的结构概览。

因此,这段代码的作用是建立一个基于SimpleRNN的神经网络模型,并指定了输入数据的形状,以及隐藏层和输出层的结构和激活函数。通过输出模型的概览结构,可以更好地了解神经网络的设计和参数数量,为后续的训练和优化提供帮助。
在这里插入图片描述

四、编译模型

复制代码
    opt=tf.keras.optimizers.Adam(learning_rate=1e-4)
    
    model.compile(loss='binary_crossentropy',
              optimizer=opt,
              metrics="accuracy")

🍻代码解释:
这段代码是用于编译神经网络模型的代码,包括损失函数、优化器和评估指标。
拆解一下:

opt=tf.keras.optimizers.Adam(learning_rate=1e-4):是指定优化器为Adam,并指定学习率为0.0001。

model.compile(loss='binary_crossentropy', optimizer=opt, metrics="accuracy"):是将神经网络的相关参数与优化器进行绑定,其中:

复制代码
* `loss='binary_crossentropy'`:表示损失函数使用的是二分类交叉熵损失函数。
* `optimizer=opt`:表示优化器使用上一步中定义的Adam优化器。
* `metrics="accuracy"`:表示使用准确率(accuracy)作为评估指标。

因此,这段代码的作用是将Adam优化器与二分类交叉熵损失函数进行绑定,并使用准确率作为评估指标。在编译之后,模型就可以进行训练和预测操作。

五、训练模型

复制代码
    epochs=100
    history=model.fit(X_train,y_train,
                  epochs=epochs,
                  batch_size=128,
                  validation_data=(X_test,y_test),
                  verbose=1)

🍻代码解释:
这段代码是用于训练神经网络模型的代码,包括训练轮数、训练数据、批大小、验证数据和输出等。
拆解一下:

epochs=100:是指定训练轮数为100次。

history=model.fit(X_train,y_train, epochs=epochs, batch_size=128, validation_data=(X_test,y_test), verbose=1):是将训练数据、训练轮数、批大小、验证数据和输出的相关参数与编译好的神经网络模型进行绑定,其中:

复制代码
* `X_train`和`y_train`:表示训练数据,即自变量和因变量。
* `epochs=epochs`:表示训练轮数,即整个训练数据集被训练多少次。
* `batch_size=128`:表示每次训练时使用的样本数,即批大小。
* `validation_data=(X_test,y_test)`:表示验证数据,即用来评估模型性能的数据集,一般取自训练数据集之外。
* `verbose=1`:表示输出训练过程中的信息,1表示输出详细信息。

因此,这段代码的作用是将训练数据、训练轮数、批大小、验证数据和输出的相关参数与已编译好的神经网络模型进行绑定,并让模型进行训练。在训练过程中,模型每个epoch都会对训练数据进行一轮的训练,并使用验证数据评估模型性能。同时,训练过程中的详细信息会被输出。训练完成后,该函数会返回一个history对象,其中包含了训练过程中的损失值、准确率等信息。
在这里插入图片描述

六、模型评估

复制代码
    import matplotlib.pyplot as plt
    
    acc=history.history['accuracy']
    val_acc=history.history['val_accuracy']
    
    loss=history.history['loss']
    val_loss=history.history['val_loss']
    
    epochs_range=range(epochs)
    
    plt.figure(figsize=(14,4))
    plt.subplot(1,2,1)
    
    plt.plot(epochs_range, acc,label='Training Accuracy')
    plt.plot(epochs_range, val_acc,label='Validation Accuracy')
    plt.legend(loc='lower right')
    plt.title('Training and Validation Accuracy')
    
    plt.subplot(1,2,2)
    plt.plot(epochs_range, loss,label='Training Loss')
    plt.plot(epochs_range, val_loss,label='Validation Loss')
    plt.legend(loc='upper right')
    plt.title('Training and Validation Loss')
    plt.show()

🍻代码的解释:
这段代码是用于绘制和输出神经网络模型在训练中的准确率和损失值变化趋势图,以便于我们进一步分析模型性能。
拆解一下:

acc=history.history['accuracy']val_acc=history.history['val_accuracy']loss=history.history['loss']val_loss=history.history['val_loss']:表示从历史训练数据中获取训练准确率、验证准确率、训练损失值、验证损失值。

epochs_range=range(epochs):表示将训练轮数范围赋值给变量epochs_range

plt.figure(figsize=(14,4)):表示创建一个新的画布,并设置其大小为14*4。

plt.subplot(1,2,1)plt.subplot(1,2,2):表示在画布中创建两个子图,或者说是图片的两个区域。(1, 2, 1)表示两个子图在行列中的位置,即第一个子图在第一行第一列,(1, 2, 2)表示第二个子图在第一行第二列。

plt.plot:是用于制图的函数,其中:

epochs_range, accepochs_range, val_accepochs_range, lossepochs_range, val_loss:表示数据点的x轴坐标和y轴坐标。

label='Training Accuracy'label='Validation Accuracy'label='Training Loss'label='Validation Loss':表示为不同的曲线命名并增加图例,以便于查看。

plt.legend(loc='lower right'):表示在子图中添加图例,图例位置在右下角。

plt.title('Training and Validation Accuracy')plt.title('Training and Validation Loss'):表示为子图添加标题。

plt.show():表示将绘制好的图显示出来。

因此,这段代码的作用是将训练过程中每epoch的训练准确率、验证准确率、训练损失值、验证损失值分别绘制为两张子图,并以图形化的形式显示出来。通过这些图表,我们可以更加直观地了解模型的性能表现。
在这里插入图片描述
最后输出准确率:

复制代码
    scores=model.evaluate(X_test,y_test,verbose=0)
    print("%s: %.2f%%" % (model.metrics_names[1],scores[1]*100))

代码解释:
这段代码是用于对训练好的神经网络模型进行测试的代码,包括输入测试数据、输出测试结果和输出测试准确率等。
拆解一下:

scores=model.evaluate(X_test,y_test,verbose=0):是将测试数据和已训练好的模型进行绑定,并对模型进行测试,其中:

复制代码
* `X_test`和`y_test`:表示测试数据,即自变量和因变量。
* `verbose=0`:表示输出测试过程中的信息,0表示不输出详细信息。

执行完这行代码后,scores将会得到一个包含损失值和评估指标(准确率)的数组对象。

print("%s: %.2f%%" % (model.metrics_names[1],scores[1]*100)):是输出测试准确率的代码,其中:

复制代码
* `model.metrics_names[1]`:表示取得模型使用的评估指标,这里是准确率。
* `scores[1]*100`:表示取得测试结果中准确率的值并乘以100,即转化为百分数。
* `%.2f%%`:是格式化字符串的一种方式,表示输出的数字保留2位小数,并且加上百分号。

因此,这段代码的作用是将测试数据和已训练好的神经网络模型进行绑定,并输出测试准确率的结果。在执行完这段代码后,我们可以看到神经网络模型在测试数据上的准确率。
在这里插入图片描述

全部评论 (0)

还没有任何评论哟~