深度学习实战41-基于LSTM-GRU模型搭建对糖尿病数据的预测与应用

大家好,我是微学AI,今天给大家介绍一下深度学习实战41-基于LSTM-GRU模型搭建对糖尿病数据的预测与应用,本文将向大家介绍一种基于LSTM-GRU的糖尿病预测模型,包括模型的原理、中文糖尿病csv数据样例、利用PyTorch框架进行模型训练与预测的实现、以及训练过程中准确率和损失值的打印的全流程。

文章目录:

  1. 介绍
  2. LSTM与GRU的原理
  3. 数据样例
  4. 数据加载
  5. 模型构建
  6. 模型训练与预测
  7. 结论

1. 介绍

随着糖尿病患者数量的上升,对糖尿病的预测和控制变得越来越重要。近年来,深度学习方法在时间序列数据的分析上取得了显著的进展,其中基于长短时记忆网络(LSTM)和门控循环单元(GRU)的模型在许多应用中表现优异。本文将介绍一种基于LSTM-GRU的糖尿病预测模型,通过对中文糖尿病csv数据进行分析,利用PyTorch框架进行模型的训练与预测。

2. LSTM与GRU的原理

2.1 LSTM

长短时记忆网络(LSTM)是一种特殊的循环神经网络(RNN),能够学习长序列数据中的依赖关系。LSTM通过引入门控机制解决了传统RNN在处理长序列时梯度消失和梯度爆炸的问题。

LSTM包含三个门:输入门、遗忘门和输出门。输入门决定输入的信息是否被加入到记忆细胞中,遗忘门决定记忆细胞中的过去信息是否被保留,输出门决定最终的输出值。

2.2 GRU

门控循环单元(GRU)是LSTM的一种变体,它将LSTM的遗忘门和输入门合并为一个更新门,同时将记忆细胞和隐藏状态合并。这样,GRU可以在减少参数数量的同时保持很好的性能。

LSTM与GRU模型结合的好处

将LSTM(长短期记忆网络)与GRU(门控循环单元)模型结合在一起可以带来以下好处:

1.更好的模型灵活性:LSTM和GRU是两种常见的循环神经网络架构,它们在建模时有不同的优势。LSTM通过输入、遗忘和输出门来控制信息的流动和存储,适用于需要长期记忆的序列建模任务。而GRU则通过更新门和重置门来实现信息的更新和选择性记忆,适用于对最近的输入更加敏感的任务。将两者结合在一起可以使模型具有更好的灵活性,能够同时捕捉长期依赖和短期变化。

2.更快的训练速度:由于GRU模型相对于LSTM模型参数更少,所以在一些情况下,使用LSTM和GRU的组合模型可以实现相对较快的训练速度。这对于大规模数据集或计算资源有限的环境下是非常有益的。

3.更好的泛化能力:通过结合LSTM和GRU模型,可以尽可能地充分利用两种模型的优势,并且可以根据具体任务进行调整和调优。这样可以提高模型的泛化能力,使其在不同的序列建模任务中表现得更好。

4.更强的表示能力:LSTM和GRU模型都具有良好的表示能力,通过将它们结合在一起,可以进一步增强模型的表示能力。这对于复杂的序列数据建模任务非常重要,可以提高模型对输入序列的抽象和理解能力。
在这里插入图片描述

3. 数据样例

以下是一些中文糖尿病csv数据样例:

年龄,性别,身高,体重,收缩压,舒张压,空腹血糖,糖尿病
45,男,175,83,130,85,5.6,否
58,女,162,62,140,90,7.2,是
32,男,180,90,120,80,5.2,否
67,女,155,72,150,95,8.1,是
51,男,168,75,135,88,6.5,是
39,女,170,63,122,78,4.9,否
62,男,176,85,148,92,6.0,是
56,女,160,70,142,93,7.9,是
29,男,182,92,116,78,4.6,否
58,女,168,68,130,85,6.2,是
43,男,177,80,124,80,5.4,否
63,女,157,74,148,91,7.6,是
35,男,181,87,118,76,6.2,否
53,女,165,67,137,88,6.8,是
46,男,173,78,132,86,6.0,否
61,女,163,71,145,92,8.3,是
28,男,179,88,114,74,4.4,否
50,女,166,65,134,87,6.6,是
38,男,174,82,126,81,5.7,否
59,女,161,69,144,94,7.8,是
31,男,178,84,120,77,4.9,否
55,女,159,73,139,90,7.4,是
40,男,175,81,130,84,5.9,否
64,女,156,76,147,94,8.0,是

4. 数据加载

首先,我们需要加载数据并对其进行预处理。这里,我们使用pandas库来处理csv数据:

import pandas as pd

# 读取csv数据
data = pd.read_csv("diabetes.csv")

# 将性别和糖尿病标签转为数值
data["性别"] = data["性别"].map({
    
    "男": 0, "女": 1})
data["糖尿病"] = data["糖尿病"].map({
    
    "否": 0, "是": 1})

# 数据归一化处理
for column in ["年龄", "身高", "体重", "收缩压", "舒张压", "空腹血糖"]:
    data[column] = (data[column] - data[column].min()) / (data[column].max() - data[column].min())

# 划分训练集和测试集
from sklearn.model_selection import train_test_split

X = data.drop(columns=["性别","糖尿病"])
y = data["糖尿病"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 转换为PyTorch张量
import torch
from torch.utils.data import TensorDataset, DataLoader

train_data = TensorDataset(torch.tensor(X_train.values, dtype=torch.float), torch.tensor(y_train.values, dtype=torch.float))
test_data = TensorDataset(torch.tensor(X_test.values, dtype=torch.float), torch.tensor(y_test.values, dtype=torch.float))

train_loader = DataLoader(train_data, batch_size=2, shuffle=True)
test_loader = DataLoader(test_data, batch_size=2, shuffle=True)

5. 模型构建

接下来,我们构建基于LSTM-GRU的预测模型:

import torch.nn as nn

class DiabetesPredictor(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size):
        super(DiabetesPredictor, self).__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
        self.gru = nn.GRU(hidden_size, hidden_size, num_layers, batch_first=True)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        # LSTM层
        out, _ = self.lstm(x)
        # GRU层
        out, _ = self.gru(out)
        # 全连接层
        out = self.fc(out[:, -1, :])
        return out

input_size = X_train.shape[1]
hidden_size = 64
num_layers = 2
output_size = 1

model = DiabetesPredictor(input_size, hidden_size, num_layers, output_size)

6. 模型训练与预测

现在我们可以使用PyTorch框架对模型进行训练和预测:

import torch.optim as optim

# 设置损失函数和优化器
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 训练模型
num_epochs = 50

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

    for inputs, labels in train_loader:
        inputs = inputs.unsqueeze(1)
        labels = labels.view(-1, 1)

        optimizer.zero_grad()

        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        preds = torch.round(torch.sigmoid(outputs))
        total += labels.size(0)
        correct += (preds == labels).sum().item()

    # 计算训练集准确率和损失值
    train_acc = correct / total
    train_loss = running_loss / len(train_loader)

    print(f"Epoch [{epoch + 1}/{num_epochs}] - Loss: {train_loss:.4f}, Accuracy: {train_acc:.4f}")

# 测试模型
model.eval()
correct = 0
total = 0

with torch.no_grad():
    for inputs, labels in test_loader:
        inputs = inputs.unsqueeze(1)
        labels = labels.view(-1, 1)

        outputs = model(inputs)
        preds = torch.round(torch.sigmoid(outputs))
        total += labels.size(0)
        correct += (preds == labels).sum().item()

    # 计算测试集准确率
    test_acc = correct / total
    print(f"Test Accuracy: {test_acc:.4f}")

运行结果:

Epoch [36/50] - Loss: 0.0031, Accuracy: 1.0000
Epoch [37/50] - Loss: 0.0030, Accuracy: 1.0000
Epoch [38/50] - Loss: 0.0030, Accuracy: 1.0000
Epoch [39/50] - Loss: 0.0025, Accuracy: 1.0000
Epoch [40/50] - Loss: 0.0025, Accuracy: 1.0000
Epoch [41/50] - Loss: 0.0022, Accuracy: 1.0000
Epoch [42/50] - Loss: 0.0022, Accuracy: 1.0000
Epoch [43/50] - Loss: 0.0019, Accuracy: 1.0000
Epoch [44/50] - Loss: 0.0018, Accuracy: 1.0000
Epoch [45/50] - Loss: 0.0018, Accuracy: 1.0000
Epoch [46/50] - Loss: 0.0016, Accuracy: 1.0000
Epoch [47/50] - Loss: 0.0016, Accuracy: 1.0000
Epoch [48/50] - Loss: 0.0015, Accuracy: 1.0000
Epoch [49/50] - Loss: 0.0014, Accuracy: 1.0000
Epoch [50/50] - Loss: 0.0014, Accuracy: 1.0000
Test Accuracy: 1.0000

7. 结论

本文介绍了一种基于LSTM-GRU的糖尿病预测模型,以及如何使用PyTorch框架对其进行训练和预测。通过对中文糖尿病csv数据的分析,我们可以发现该模型在预测糖尿病方面具有较好的性能。

猜你喜欢

转载自blog.csdn.net/weixin_42878111/article/details/131540984