RNN心脏病预测

  • 🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客
  • 🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)

运行代码为:

# 一、前期准备
# 1.1 导入所需包和设置GPU
import os
import torch
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
import matplotlib.pyplot as plt

# 检查是否有可用的GPU
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(f"Using device: {device}")

# 1.2 导入数据
df = pd.read_csv('D:/研究生课题/深度学习-代码/heart.csv')
print(df)
df.isnull().sum()  # 检查是否有空值

# 二、数据预处理
# 2.1 数据集划分
x = df.iloc[:, :-1].values
y = df.iloc[:, -1].values

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)

# 将每一列特征标准化为标准正态分布
sc = StandardScaler()
x_train = sc.fit_transform(x_train)
x_test = sc.transform(x_test)

# 转换为PyTorch张量,并且调整输入的维度
x_train = torch.tensor(x_train, dtype=torch.float32).to(device)
y_train = torch.tensor(y_train, dtype=torch.float32).to(device)
x_test = torch.tensor(x_test, dtype=torch.float32).to(device)
y_test = torch.tensor(y_test, dtype=torch.float32).to(device)

# 调整输入数据的维度
x_train = x_train.reshape(x_train.shape[0], 1, x_train.shape[1])
x_test = x_test.reshape(x_test.shape[0], 1, x_test.shape[1])

# 构建数据集和数据加载器
train_dataset = TensorDataset(x_train, y_train)
test_dataset = TensorDataset(x_test, y_test)

train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=128, shuffle=False)


# 三、构建RNN模型

class SimpleRNNModel(nn.Module):
    def __init__(self):
        super(SimpleRNNModel, self).__init__()
        self.rnn1 = nn.RNN(13, 128, batch_first=True, nonlinearity='relu')
        self.rnn2 = nn.RNN(128, 64, batch_first=True, nonlinearity='relu')
        self.rnn3 = nn.RNN(64, 32, batch_first=True, nonlinearity='relu')
        self.fc1 = nn.Linear(32, 64)
        self.fc2 = nn.Linear(64, 1)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        x, _ = self.rnn1(x)
        x, _ = self.rnn2(x)
        x, _ = self.rnn3(x)
        x = x[:, -1, :]  # 取最后一个时间步的输出
        x = self.fc1(x)
        x = self.fc2(x)
        x = self.sigmoid(x)
        return x


model = SimpleRNNModel().to(device)
print(model)

# 四、编译模型
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=1e-4)

# 五、训练模型
epochs = 100
train_losses = []
val_losses = []
train_accs = []
val_accs = []

for epoch in range(epochs):
    model.train()
    running_loss = 0.0
    correct = 0
    total = 0

    for inputs, labels in train_loader:
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs.squeeze(), labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        preds = (outputs.squeeze() >= 0.5).float()
        correct += (preds == labels).sum().item()
        total += labels.size(0)

    train_loss = running_loss / len(train_loader)
    train_acc = correct / total
    train_losses.append(train_loss)
    train_accs.append(train_acc)

    # 验证集
    model.eval()
    val_loss = 0.0
    correct = 0
    total = 0
    with torch.no_grad():
        for inputs, labels in test_loader:
            outputs = model(inputs)
            loss = criterion(outputs.squeeze(), labels)
            val_loss += loss.item()
            preds = (outputs.squeeze() >= 0.5).float()
            correct += (preds == labels).sum().item()
            total += labels.size(0)

    val_loss /= len(test_loader)
    val_acc = correct / total
    val_losses.append(val_loss)
    val_accs.append(val_acc)

    print(f"Epoch [{epoch + 1}/{epochs}], Train Loss: {train_loss:.4f}, Train Acc: {train_acc:.4f}, "
          f"Val Loss: {val_loss:.4f}, Val Acc: {val_acc:.4f}")

# 六、模型评估
epochs_range = range(epochs)

plt.figure(figsize=(14, 4))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, train_accs, label='Training Accuracy')
plt.plot(epochs_range, val_accs, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')

plt.subplot(1, 2, 2)
plt.plot(epochs_range, train_losses, label='Training Loss')
plt.plot(epochs_range, val_losses, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

# 评估模型
model.eval()
correct = 0
total = 0
with torch.no_grad():
    for inputs, labels in test_loader:
        outputs = model(inputs)
        preds = (outputs.squeeze() >= 0.5).float()
        correct += (preds == labels).sum().item()
        total += labels.size(0)

accuracy = correct / total
print(f'Accuracy: {accuracy:.2%}')

运行结果为:

C:\Users\dell\anaconda3\envs\pytorch-gpu\python.exe C:\Users\dell\PycharmProjects\pythonProject5\rnn.py 
Using device: cuda
     age  sex  cp  trestbps  chol  fbs  ...  exang  oldpeak  slope  ca  thal  target
0     63    1   3       145   233    1  ...      0      2.3      0   0     1       1
1     37    1   2       130   250    0  ...      0      3.5      0   0     2       1
2     41    0   1       130   204    0  ...      0      1.4      2   0     2       1
3     56    1   1       120   236    0  ...      0      0.8      2   0     2       1
4     57    0   0       120   354    0  ...      1      0.6      2   0     2       1
..   ...  ...  ..       ...   ...  ...  ...    ...      ...    ...  ..   ...     ...
298   57    0   0       140   241    0  ...      1      0.2      1   0     3       0
299   45    1   3       110   264    0  ...      0      1.2      1   0     3       0
300   68    1   0       144   193    1  ...      0      3.4      1   2     3       0
301   57    1   0       130   131    0  ...      1      1.2      1   1     3       0
302   57    0   1       130   236    0  ...      0      0.0      1   1     2       0

[303 rows x 14 columns]
(272, 13) (272,)
SimpleRNNModel(
  (rnn1): RNN(13, 128, batch_first=True)
  (rnn2): RNN(128, 64, batch_first=True)
  (rnn3): RNN(64, 32, batch_first=True)
  (fc1): Linear(in_features=32, out_features=64, bias=True)
  (fc2): Linear(in_features=64, out_features=1, bias=True)
  (sigmoid): Sigmoid()
)
Epoch [1/100], Train Loss: 0.7162, Train Acc: 0.4485, Val Loss: 0.6927, Val Acc: 0.5161
Epoch [2/100], Train Loss: 0.7116, Train Acc: 0.4485, Val Loss: 0.6921, Val Acc: 0.5161
Epoch [3/100], Train Loss: 0.7030, Train Acc: 0.4485, Val Loss: 0.6915, Val Acc: 0.5161
Epoch [4/100], Train Loss: 0.6955, Train Acc: 0.4485, Val Loss: 0.6909, Val Acc: 0.5161
Epoch [5/100], Train Loss: 0.7044, Train Acc: 0.4485, Val Loss: 0.6902, Val Acc: 0.5161
Epoch [6/100], Train Loss: 0.6974, Train Acc: 0.4485, Val Loss: 0.6895, Val Acc: 0.5161
Epoch [7/100], Train Loss: 0.7161, Train Acc: 0.4485, Val Loss: 0.6887, Val Acc: 0.5161
Epoch [8/100], Train Loss: 0.6897, Train Acc: 0.4485, Val Loss: 0.6879, Val Acc: 0.5161
Epoch [9/100], Train Loss: 0.6955, Train Acc: 0.4485, Val Loss: 0.6871, Val Acc: 0.5161
Epoch [10/100], Train Loss: 0.6951, Train Acc: 0.4485, Val Loss: 0.6863, Val Acc: 0.5161
Epoch [11/100], Train Loss: 0.6971, Train Acc: 0.4485, Val Loss: 0.6854, Val Acc: 0.5161
Epoch [12/100], Train Loss: 0.6983, Train Acc: 0.4485, Val Loss: 0.6844, Val Acc: 0.5161
Epoch [13/100], Train Loss: 0.6913, Train Acc: 0.4485, Val Loss: 0.6834, Val Acc: 0.5161
Epoch [14/100], Train Loss: 0.6956, Train Acc: 0.4485, Val Loss: 0.6822, Val Acc: 0.5161
Epoch [15/100], Train Loss: 0.6979, Train Acc: 0.4485, Val Loss: 0.6809, Val Acc: 0.5161
Epoch [16/100], Train Loss: 0.6917, Train Acc: 0.4485, Val Loss: 0.6795, Val Acc: 0.5161
Epoch [17/100], Train Loss: 0.6934, Train Acc: 0.4485, Val Loss: 0.6781, Val Acc: 0.5161
Epoch [18/100], Train Loss: 0.6904, Train Acc: 0.4485, Val Loss: 0.6765, Val Acc: 0.5161
Epoch [19/100], Train Loss: 0.6934, Train Acc: 0.4485, Val Loss: 0.6749, Val Acc: 0.5161
Epoch [20/100], Train Loss: 0.6866, Train Acc: 0.4485, Val Loss: 0.6731, Val Acc: 0.5161
Epoch [21/100], Train Loss: 0.6930, Train Acc: 0.4485, Val Loss: 0.6713, Val Acc: 0.5161
Epoch [22/100], Train Loss: 0.6854, Train Acc: 0.4485, Val Loss: 0.6693, Val Acc: 0.5161
Epoch [23/100], Train Loss: 0.6896, Train Acc: 0.4485, Val Loss: 0.6673, Val Acc: 0.5161
Epoch [24/100], Train Loss: 0.6880, Train Acc: 0.4485, Val Loss: 0.6651, Val Acc: 0.5161
Epoch [25/100], Train Loss: 0.6864, Train Acc: 0.4485, Val Loss: 0.6628, Val Acc: 0.5161
Epoch [26/100], Train Loss: 0.6852, Train Acc: 0.4485, Val Loss: 0.6604, Val Acc: 0.5161
Epoch [27/100], Train Loss: 0.6726, Train Acc: 0.4559, Val Loss: 0.6579, Val Acc: 0.5806
Epoch [28/100], Train Loss: 0.6680, Train Acc: 0.4596, Val Loss: 0.6551, Val Acc: 0.6129
Epoch [29/100], Train Loss: 0.6740, Train Acc: 0.4853, Val Loss: 0.6520, Val Acc: 0.6452
Epoch [30/100], Train Loss: 0.6706, Train Acc: 0.5184, Val Loss: 0.6487, Val Acc: 0.6774
Epoch [31/100], Train Loss: 0.6603, Train Acc: 0.5625, Val Loss: 0.6451, Val Acc: 0.7097
Epoch [32/100], Train Loss: 0.6662, Train Acc: 0.6066, Val Loss: 0.6411, Val Acc: 0.7742
Epoch [33/100], Train Loss: 0.6671, Train Acc: 0.6507, Val Loss: 0.6369, Val Acc: 0.7742
Epoch [34/100], Train Loss: 0.6536, Train Acc: 0.6985, Val Loss: 0.6325, Val Acc: 0.7742
Epoch [35/100], Train Loss: 0.6624, Train Acc: 0.7463, Val Loss: 0.6278, Val Acc: 0.7742
Epoch [36/100], Train Loss: 0.6555, Train Acc: 0.7500, Val Loss: 0.6232, Val Acc: 0.7742
Epoch [37/100], Train Loss: 0.6496, Train Acc: 0.7831, Val Loss: 0.6183, Val Acc: 0.8065
Epoch [38/100], Train Loss: 0.6469, Train Acc: 0.7868, Val Loss: 0.6130, Val Acc: 0.8065
Epoch [39/100], Train Loss: 0.6350, Train Acc: 0.7868, Val Loss: 0.6073, Val Acc: 0.8387
Epoch [40/100], Train Loss: 0.6267, Train Acc: 0.8015, Val Loss: 0.6011, Val Acc: 0.8387
Epoch [41/100], Train Loss: 0.6287, Train Acc: 0.8015, Val Loss: 0.5943, Val Acc: 0.8710
Epoch [42/100], Train Loss: 0.6220, Train Acc: 0.8199, Val Loss: 0.5873, Val Acc: 0.8710
Epoch [43/100], Train Loss: 0.6305, Train Acc: 0.8199, Val Loss: 0.5801, Val Acc: 0.8710
Epoch [44/100], Train Loss: 0.6167, Train Acc: 0.8309, Val Loss: 0.5730, Val Acc: 0.8387
Epoch [45/100], Train Loss: 0.6232, Train Acc: 0.8309, Val Loss: 0.5658, Val Acc: 0.8387
Epoch [46/100], Train Loss: 0.6110, Train Acc: 0.8346, Val Loss: 0.5586, Val Acc: 0.8387
Epoch [47/100], Train Loss: 0.6092, Train Acc: 0.8419, Val Loss: 0.5511, Val Acc: 0.8710
Epoch [48/100], Train Loss: 0.5939, Train Acc: 0.8456, Val Loss: 0.5433, Val Acc: 0.8710
Epoch [49/100], Train Loss: 0.5915, Train Acc: 0.8493, Val Loss: 0.5353, Val Acc: 0.8710
Epoch [50/100], Train Loss: 0.5743, Train Acc: 0.8529, Val Loss: 0.5267, Val Acc: 0.8710
Epoch [51/100], Train Loss: 0.5873, Train Acc: 0.8419, Val Loss: 0.5178, Val Acc: 0.8710
Epoch [52/100], Train Loss: 0.5656, Train Acc: 0.8382, Val Loss: 0.5087, Val Acc: 0.8710
Epoch [53/100], Train Loss: 0.5860, Train Acc: 0.8456, Val Loss: 0.4995, Val Acc: 0.8710
Epoch [54/100], Train Loss: 0.5626, Train Acc: 0.8529, Val Loss: 0.4907, Val Acc: 0.8710
Epoch [55/100], Train Loss: 0.5273, Train Acc: 0.8529, Val Loss: 0.4815, Val Acc: 0.8710
Epoch [56/100], Train Loss: 0.5473, Train Acc: 0.8529, Val Loss: 0.4718, Val Acc: 0.8710
Epoch [57/100], Train Loss: 0.4958, Train Acc: 0.8529, Val Loss: 0.4618, Val Acc: 0.8710
Epoch [58/100], Train Loss: 0.5281, Train Acc: 0.8529, Val Loss: 0.4515, Val Acc: 0.8710
Epoch [59/100], Train Loss: 0.5039, Train Acc: 0.8529, Val Loss: 0.4413, Val Acc: 0.8710
Epoch [60/100], Train Loss: 0.4875, Train Acc: 0.8529, Val Loss: 0.4311, Val Acc: 0.8710
Epoch [61/100], Train Loss: 0.4740, Train Acc: 0.8529, Val Loss: 0.4208, Val Acc: 0.8710
Epoch [62/100], Train Loss: 0.4801, Train Acc: 0.8529, Val Loss: 0.4106, Val Acc: 0.8710
Epoch [63/100], Train Loss: 0.4951, Train Acc: 0.8566, Val Loss: 0.4009, Val Acc: 0.8710
Epoch [64/100], Train Loss: 0.4613, Train Acc: 0.8566, Val Loss: 0.3919, Val Acc: 0.8710
Epoch [65/100], Train Loss: 0.4372, Train Acc: 0.8566, Val Loss: 0.3831, Val Acc: 0.8710
Epoch [66/100], Train Loss: 0.4354, Train Acc: 0.8566, Val Loss: 0.3745, Val Acc: 0.8710
Epoch [67/100], Train Loss: 0.4409, Train Acc: 0.8529, Val Loss: 0.3665, Val Acc: 0.9032
Epoch [68/100], Train Loss: 0.4356, Train Acc: 0.8529, Val Loss: 0.3593, Val Acc: 0.9032
Epoch [69/100], Train Loss: 0.4179, Train Acc: 0.8529, Val Loss: 0.3528, Val Acc: 0.9032
Epoch [70/100], Train Loss: 0.4368, Train Acc: 0.8493, Val Loss: 0.3467, Val Acc: 0.9032
Epoch [71/100], Train Loss: 0.4249, Train Acc: 0.8456, Val Loss: 0.3412, Val Acc: 0.9032
Epoch [72/100], Train Loss: 0.3705, Train Acc: 0.8456, Val Loss: 0.3358, Val Acc: 0.9032
Epoch [73/100], Train Loss: 0.4140, Train Acc: 0.8456, Val Loss: 0.3310, Val Acc: 0.9032
Epoch [74/100], Train Loss: 0.3580, Train Acc: 0.8382, Val Loss: 0.3268, Val Acc: 0.9032
Epoch [75/100], Train Loss: 0.4012, Train Acc: 0.8382, Val Loss: 0.3228, Val Acc: 0.9032
Epoch [76/100], Train Loss: 0.3408, Train Acc: 0.8419, Val Loss: 0.3194, Val Acc: 0.9032
Epoch [77/100], Train Loss: 0.4313, Train Acc: 0.8419, Val Loss: 0.3161, Val Acc: 0.9032
Epoch [78/100], Train Loss: 0.3920, Train Acc: 0.8456, Val Loss: 0.3134, Val Acc: 0.9032
Epoch [79/100], Train Loss: 0.4273, Train Acc: 0.8456, Val Loss: 0.3113, Val Acc: 0.9032
Epoch [80/100], Train Loss: 0.4027, Train Acc: 0.8456, Val Loss: 0.3100, Val Acc: 0.9032
Epoch [81/100], Train Loss: 0.3329, Train Acc: 0.8456, Val Loss: 0.3089, Val Acc: 0.9032
Epoch [82/100], Train Loss: 0.3454, Train Acc: 0.8456, Val Loss: 0.3074, Val Acc: 0.9032
Epoch [83/100], Train Loss: 0.3247, Train Acc: 0.8456, Val Loss: 0.3061, Val Acc: 0.9032
Epoch [84/100], Train Loss: 0.4069, Train Acc: 0.8456, Val Loss: 0.3049, Val Acc: 0.9032
Epoch [85/100], Train Loss: 0.3228, Train Acc: 0.8456, Val Loss: 0.3044, Val Acc: 0.9032
Epoch [86/100], Train Loss: 0.3383, Train Acc: 0.8456, Val Loss: 0.3036, Val Acc: 0.9032
Epoch [87/100], Train Loss: 0.3300, Train Acc: 0.8456, Val Loss: 0.3026, Val Acc: 0.9032
Epoch [88/100], Train Loss: 0.2983, Train Acc: 0.8529, Val Loss: 0.3015, Val Acc: 0.9032
Epoch [89/100], Train Loss: 0.3488, Train Acc: 0.8566, Val Loss: 0.3007, Val Acc: 0.9032
Epoch [90/100], Train Loss: 0.3353, Train Acc: 0.8566, Val Loss: 0.3003, Val Acc: 0.9032
Epoch [91/100], Train Loss: 0.3324, Train Acc: 0.8566, Val Loss: 0.2999, Val Acc: 0.9032
Epoch [92/100], Train Loss: 0.3730, Train Acc: 0.8566, Val Loss: 0.2995, Val Acc: 0.9032
Epoch [93/100], Train Loss: 0.3356, Train Acc: 0.8566, Val Loss: 0.2990, Val Acc: 0.9032
Epoch [94/100], Train Loss: 0.3115, Train Acc: 0.8603, Val Loss: 0.2991, Val Acc: 0.9032
Epoch [95/100], Train Loss: 0.3469, Train Acc: 0.8603, Val Loss: 0.2994, Val Acc: 0.9032
Epoch [96/100], Train Loss: 0.3202, Train Acc: 0.8603, Val Loss: 0.2999, Val Acc: 0.9032
Epoch [97/100], Train Loss: 0.3344, Train Acc: 0.8603, Val Loss: 0.3004, Val Acc: 0.9032
Epoch [98/100], Train Loss: 0.2741, Train Acc: 0.8640, Val Loss: 0.3013, Val Acc: 0.9032
Epoch [99/100], Train Loss: 0.3008, Train Acc: 0.8640, Val Loss: 0.3023, Val Acc: 0.9032
Epoch [100/100], Train Loss: 0.2924, Train Acc: 0.8676, Val Loss: 0.3034, Val Acc: 0.9032
Accuracy: 90.32%

进程已结束,退出代码为 0

 

总结心得:通过这次 RNN 模型识别心脏病的实战,我学到了数据预处理的重要性,尤其是标准化和调整数据形状对模型性能的影响。RNN 模型擅长处理时间序列数据,但需注意梯度消失问题。模型调优、训练和评估中,选择合适的优化器和参数,以及监控训练过程中的指标至关重要。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值