365天深度学习训练营-第R1周:RNN-心脏病预测
- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
我的环境:
- 语言环境: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方法添加至模型中。
