RNN模型预测心脏病
- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
在机器学习领域,循环神经网络(RNNs, Recurrent Neural Networks)因其处理序列数据的强大能力而广泛应用于时间序列分析、自然语言处理等任务。在这篇博客中,这周学习如何使用RNN来预测心脏病,并逐步讲解代码实现。
1. 项目背景
使用RNN模型来预测心脏病的发病情况。数据集包含了多种影响心脏病的特征,如年龄、性别、血压等。我们的目标是训练一个模型,根据这些特征预测患者是否患有心脏病。
2. 数据预处理
在开始构建模型之前,首先需要对数据进行处理。以下是主要的步骤:
- 加载并检查数据: 使用Pandas加载数据集,查看数据的基本信息。
- 特征与标签分离: 我们将数据集中的特征(X)和标签(y)分开。标签是我们要预测的目标,而特征则是模型的输入。
- 数据集划分: 将数据集划分为训练集和测试集。
- 标准化处理: 对特征进行标准化,使其符合标准正态分布。这一步非常重要,因为它能帮助模型更快地收敛。
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
df = pd.read_csv("heart.csv")
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)
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)
3. 构建RNN模型
接下来构建RNN模型,并使用它来预测心脏病。
3.1 模型结构
我们使用Keras中的Sequential
模型,逐层添加模型的各个部分:
- SimpleRNN层: RNN的基本单元,具有200个神经元。
input_shape
参数指定输入的形状,激活函数使用ReLU
。 - 全连接层: 添加一个具有100个神经元的全连接层,同样使用
ReLU
激活函数。 - 输出层: 最后是一个输出层,使用
sigmoid
激活函数输出二分类结果。
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, 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()
3.2 编译与训练模型
在编译模型时,我们选择使用Adam
优化器,学习率为1e-4。损失函数选择binary_crossentropy
,因为这是一个二分类问题。我们在训练过程中还会监控模型在训练集和验证集上的表现。
import tensorflow as tf
opt = tf.keras.optimizers.Adam(learning_rate=1e-4)
model.compile(loss='binary_crossentropy',
optimizer=opt,
metrics=['accuracy'])
history = model.fit(X_train, y_train,
epochs=100,
batch_size=128,
validation_data=(X_test, y_test),
verbose=1)
4. 训练结果与可视化
训练完成后,我们可以使用Matplotlib将训练过程中的准确率和损失函数进行可视化。
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()
结果
5. 总结
这周学习了如何使用RNN模型来预测心脏病,构建了一个简单但有效的RNN模型,并对训练过程进行了可视化展示。为后续学习更复杂的网络结构(如LSTM或GRU)打下基础。