基于基因表达量的患者疾病预测:使用 PyTorch 构建 DNN 神经网络

本项目使用 Python 和 PyTorch 框架构建一个深度神经网络 (DNN) 模型,根据基因表达量来预测患者是否患病。模型包含两个子网络,并使用 Dropout 层来防止过拟合。该模型支持自定义参数,并能输出每个样本对应的预测概率。

1. 数据准备

1.1 读取 Excel 表格

import torch
import torch.nn as nn
import torch.optim as optim
import pandas as pd
from sklearn.preprocessing import StandardScaler

# 读取 Excel 表格
data = pd.read_excel('C:\Users\lenovo\Desktop\HIV\DNN神经网络测试\data1.xlsx')
x = data.iloc[:, 1:].values    # 获取基因表达量
y = data.iloc[:, 0].values    # 获取患者状态标志

1.2 数据标准化

# 数据标准化
scaler = StandardScaler()
x = scaler.fit_transform(x)

2. 定义模型

2.1 第一个模型:基因分类

# 定义第一个模型
class FirstModel(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(FirstModel, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.fc2 = nn.Linear(hidden_size, hidden_size)
        self.fc3 = nn.Linear(hidden_size, output_size)
        self.dropout = nn.Dropout(p=0.5)
        self.relu = nn.ReLU()

    def forward(self, x):
        x = self.dropout(self.relu(self.fc1(x)))
        x = self.dropout(self.relu(self.fc2(x)))
        x = self.fc3(x)
        return x

2.2 第二个模型:疾病预测

# 定义第二个模型
class SecondModel(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(SecondModel, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.fc2 = nn.Linear(hidden_size, hidden_size)
        self.fc3 = nn.Linear(hidden_size, output_size)
        self.dropout = nn.Dropout(p=0.5)
        self.relu = nn.ReLU()

    def forward(self, x):
        x = self.dropout(self.relu(self.fc1(x)))
        x = self.dropout(self.relu(self.fc2(x)))
        x = self.fc3(x)
        return x

3. 训练模型

3.1 定义训练函数

# 定义训练函数
def train(model, criterion, optimizer, x, y):
    model.train()
    running_loss = 0.0
    running_corrects = 0

    for inputs, labels in zip(x, y):
        inputs = torch.from_numpy(inputs).float()
        labels = torch.tensor(labels).long()

        optimizer.zero_grad()

        outputs = model(inputs)
        loss = criterion(outputs, labels)
        _, preds = torch.max(outputs, 1)

        loss.backward()
        optimizer.step()

        running_loss += loss.item() * inputs.size(0)
        running_corrects += torch.sum(preds == labels)

    epoch_loss = running_loss / len(y)
    epoch_acc = running_corrects.double() / len(y)

    return epoch_loss, epoch_acc

3.2 设置参数

# 定义参数
input_size = len(data.columns) - 1    # 输入大小为基因个数
hidden_size = 64
output_size = 4
lr = 0.01
num_epochs = 100

3.3 训练第一个模型

# 训练第一个模型
first_model = FirstModel(input_size, hidden_size, output_size)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(first_model.parameters(), lr=lr, momentum=0.9)

for epoch in range(num_epochs):
    epoch_loss, epoch_acc = train(first_model, criterion, optimizer, x, y)
    print('First Model: Epoch [{}/{}], Loss: {:.4f}, Acc: {:.4f}'.format(epoch+1, num_epochs, epoch_loss, epoch_acc))

3.4 获取第一个模型输出

# 获取第一个模型的输出
output1 = []
for inputs in x:
    inputs = torch.from_numpy(inputs).float()
    outputs = first_model(inputs)
    output1.append(outputs)

# 将第一个模型的输出作为第二个模型的输入
input2 = torch.stack(output1).detach().numpy()

3.5 设置第二个模型参数

# 定义参数
input_size = output_size
hidden_size = 32
output_size = 2
lr = 0.01
num_epochs = 100

3.6 训练第二个模型

# 训练第二个模型
second_model = SecondModel(input_size, hidden_size, output_size)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(second_model.parameters(), lr=lr, momentum=0.9)

for epoch in range(num_epochs):
    epoch_loss, epoch_acc = train(second_model, criterion, optimizer, input2, y)
    print('Second Model: Epoch [{}/{}], Loss: {:.4f}, Acc: {:.4f}'.format(epoch+1, num_epochs, epoch_loss, epoch_acc))

4. 获取预测概率

# 获取第二个模型的输出
output2 = []
for inputs in input2:
    inputs = torch.from_numpy(inputs).float()
    outputs = second_model(inputs)
    output2.append(outputs)

# 将第二个模型的输出作为每个样本所对应的概率输出
prob = nn.functional.softmax(torch.stack(output2), dim=1).detach().numpy()

总结

本项目构建了一个基于基因表达量的患者疾病预测模型,该模型包含两个子网络,并使用 Dropout 层来防止过拟合。模型支持自定义参数并能输出每个样本对应的预测概率。该模型可用于帮助医疗工作者更准确地预测患者的疾病状态。

注意事项

  • 本项目只使用了训练集,没有使用测试集,因此模型的泛化能力有待验证。
  • 实际应用中需要根据具体情况调整模型参数和训练方法。
  • 医疗数据分析需遵循相关伦理和法律法规。
基于基因表达量的患者疾病预测:使用 PyTorch 构建 DNN 神经网络

原文地址: https://www.cveoy.top/t/topic/mC4z 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录