Advertisement

365天深度学习训练营-第R1周:RNN-心脏病预测

阅读量:

我的环境:

  • 语言环境:Python3.11.2
  • 编译器:PyCharm Community Edition 2022.3
  • 深度学习环境:TensorFlow2

本次目标**:**

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

一、导入数据

本次学习使用二维数据进行模型的训练。使用pandas库导入数据。

复制代码
 import pandas as pd

    
  
    
 data = pd.read_csv('F:\ heart.csv')
    
 print(data)

查看是否含有空值。 使用pandas库的isnull方法检测是否含有空值。若为空则返回True,否则返回False。isnull方法返回的是布朗型的pandas.core.frame.DataFrame对象或或Series对象。

这样看在数据过多时无法确定是否含有空值。使用pandas库的sum方法将结果更直观的展现。sum方法方法用于计算数据中的元素之和,可以对DataFrame或Series中的每一列或每一行进行求和操作。True为1,False为0。

复制代码
 df = data.isnull().sum()

    
 print(df)

二、数据预处理

使用pandas库的iloc来选择数据。

复制代码
 X = data.iloc[:,:-1]

    
 Y = data.iloc[:,-1]

iloc方法是用于按照位置(整数索引)进行数据选择。第一个参数为选择的行,第二个参数为选择的列。其皆可以是整数、整数列表、整数切片、布尔数组或可调用函数。

X作为数据的来源,Y作为标签的来源。

使用sklearn库进行数据集配置。sklearn需要安装scikit_learn库,在命令行中使用pip install -U scikit_learn进行安装。使用sklearn库的model_selection模块的train_test_split函数进行数据集的设置。X和Y分别是特征和标签数据,test_size表示测试集所占比例,random_state是随机数种子,用于保证每次划分的结果相同。

复制代码
 from sklearn.model_selection import train_test_split

    
 X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size=0.1, random_state=1)
    
 print(X_train.shape)
    
 print(Y_train.shape)
    
  
    
 '''
    
 (272, 13)
    
 (272,)
    
 '''

将数据集标准化。使用sklearn库中的preprocessing模块进行处理。该模块用于数据预处理和特征工程。StandardScaler是sklearn.preprocessing中的一个类,用于将数据进行标准化处理,即将数据集按照均值为0,标准差为1的方式进行缩放。在使用时需要先对数据进行fit操作,而fit_transform便是对数据进行该操作。

fit_transform方法会先对数据进行拟合,计算出均值和方差,然后再进行标准化处理。

transform方法也是用于对数据进行标准化处理,但不会重新计算均值和方差,而是使用之前计算的均值和方差进行转换。

之后使用reshape方法为数据集添加一个维度。

复制代码
 from sklearn.preprocessing import StandardScaler

    
 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)
    
 X_test = X_test.reshape(X_test.shape[0],X_test.shape[1],1)
    
 print(X_train.shape)
    
  
    
 '''
    
 (272, 13, 1)
    
 '''

三、构建RNN模型

RNN是循环神经网络(Recurrent Neural Network)的缩写,是一种常用于处理序列数据的神经网络模型。因为其具有循环结构,可以在处理序列数据时保留先前的信息,其处理数据的长度也可以适当变化 。

复制代码
 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()

四、编译、训练模型

复制代码
 optimizer = tf.keras.optimizers.Adam(learning_rate=1e-4)

    
 model.compile(optimizer=optimizer,
    
           loss='binary_crossentropy',
    
           metrics=['accuracy'])
    
  
    
 history = model.fit(
    
     X_train,
    
     Y_train,
    
     epochs=100,
    
     batch_size=128,
    
     validation_data=(X_test,Y_test),
    
     verbose=1
    
 )

五、模型评估

复制代码
 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(100)
    
  
    
 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()
    
  
    
 s = model.evaluate(X_test,Y_test,verbose=0)
    
 print('%s:%.2f%%'%(model.metrics_names[1], s[1]*100))


六、总结

**** 本次学习了序列型数据如何配置数据集,使用sklearn库中的sklearn.preprocessing.StandardScaler与sklearn.model_selection.train_test_split进行数据集的配置及标准化;学习了RNN网络的构建,使用tensorflow库中的SimpleRNN进行构建,并使用add方法添加至模型中。

全部评论 (0)

还没有任何评论哟~