使用 Python 构建 DNN 神经网络根据基因表达量预测患者疾病状态

本文介绍如何使用 Python 构建 DNN 神经网络模型,根据基因表达量预测患者是否患病。该模型包含三个子模型,并利用 PyTorch 框架实现。模型可调整参数,并在 JetBrains PyCharm 上运行,并输出训练过程中的准确率和损失值。

1. 数据准备

  • 读取 Excel 表格,第一行为患者状态标志 'state'(1 为患病,0 为正常)和基因名称,第 0 列为患者是否患病的真值,其余列为各基因及其表达量。
  • 使用 pandas 库读取 Excel 表格:
import pandas as pd

data = pd.read_excel(r'C:\Users\lenovo\Desktop\HIV\DNN神经网络测试\data1.xlsx')
  • 获取基因名称和状态标志:
gene_names = data.columns[1:]
state = data['state'].values
  • 获取基因表达量:
gene_expression = data.iloc[:, 1:].values
  • 将数据全部作为训练集:
from sklearn.model_selection import train_test_split

X_train, _, y_train, _ = train_test_split(gene_expression, state, test_size=0)

2. 模型定义

  • 定义三个模型,分别为 Model1、Model2 和 Model3。
  • Model1 为 8 分类模型,输入为基因表达量,输出为 8 个分类结果。
  • Model2 为 4 分类模型,输入为 Model1 的输出,输出为 4 个分类结果。
  • Model3 为二分类模型,输入为 Model2 的输出,输出为预测结果(1 为患病,0 为正常)。
  • 模型包含 Dropout 层,以防止过拟合。
import torch
import torch.nn as nn

# 定义第一个模型
class Model1(nn.Module):
    def __init__(self):
        super(Model1, self).__init__()
        self.fc1 = nn.Linear(len(gene_names), 32)
        self.fc2 = nn.Linear(32, 16)
        self.fc3 = nn.Linear(16, 8)
        self.dropout = nn.Dropout(p=0.2)
        self.relu = nn.ReLU()

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

# 定义第二个模型
class Model2(nn.Module):
    def __init__(self):
        super(Model2, self).__init__()
        self.fc1 = nn.Linear(8, 4)
        self.relu = nn.ReLU()

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

# 定义第三个模型
class Model3(nn.Module):
    def __init__(self):
        super(Model3, self).__init__()
        self.fc1 = nn.Linear(4, 1)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        x = self.sigmoid(self.fc1(x))
        return x

3. 训练过程

  • 定义训练函数,用于训练模型并计算损失值和准确率。
  • 使用 torch.optim.SGD 优化器进行优化。
  • 使用 nn.CrossEntropyLossnn.BCELoss 作为损失函数。
  • 训练过程分为三次,分别训练三个模型。
  • 输出每次训练的准确率和损失值。
# 定义训练函数
def train(model, optimizer, criterion, X_train, y_train):
    model.train()
    running_loss = 0.0
    running_corrects = 0
    for i in range(len(X_train)):
        optimizer.zero_grad()
        X = torch.tensor(X_train[i], dtype=torch.float32)
        y = torch.tensor(y_train[i], dtype=torch.float32)
        y = torch.unsqueeze(y, dim=0)
        y_pred = model(X)
        loss = criterion(y_pred, y)
        loss.backward()
        optimizer.step()
        running_loss += loss.item() * X.size(0)
        if y_pred[0].item() >= 0.5 and y.item() == 1.0:
            running_corrects += 1
        elif y_pred[0].item() < 0.5 and y.item() == 0.0:
            running_corrects += 1
    epoch_loss = running_loss / len(X_train)
    epoch_acc = running_corrects / len(X_train)
    return epoch_loss, epoch_acc

# 定义参数
lr1 = 0.01
lr2 = 0.001
lr3 = 0.0001
epochs1 = 50
epochs2 = 50
epochs3 = 100
batch_size = 32

# 第一次训练
model1 = Model1()
criterion1 = nn.CrossEntropyLoss()
optimizer1 = torch.optim.SGD(model1.parameters(), lr=lr1)
for epoch in range(epochs1):
    permutation = torch.randperm(X_train.shape[0])
    for i in range(0, X_train.shape[0], batch_size):
        indices = permutation[i:i+batch_size]
        batch_x, batch_y = X_train[indices], y_train[indices]
        optimizer1.zero_grad()
        outputs = model1(torch.tensor(batch_x, dtype=torch.float32))
        loss = criterion1(outputs, torch.tensor(batch_y, dtype=torch.long))
        loss.backward()
        optimizer1.step()
    epoch_loss, epoch_acc = train(model1, optimizer1, criterion1, X_train, y_train)
    print('Epoch [{}/{}], Loss: {:.4f}, Accuracy: {:.4f}'.format(epoch+1, epochs1, epoch_loss, epoch_acc))

# 第二次训练
model2 = Model2()
criterion2 = nn.CrossEntropyLoss()
optimizer2 = torch.optim.SGD(model2.parameters(), lr=lr2)
outputs1 = model1(torch.tensor(X_train, dtype=torch.float32))
_, preds1 = torch.max(outputs1, 1)
for epoch in range(epochs2):
    optimizer2.zero_grad()
    outputs2 = model2(preds1)
    loss = criterion2(outputs2, torch.tensor(y_train, dtype=torch.long))
    loss.backward()
    optimizer2.step()
    running_loss += loss.item() * X_train.size(0)
    running_corrects += torch.sum(preds2 == torch.tensor(y_train, dtype=torch.long))
    epoch_loss = running_loss / len(X_train)
    epoch_acc = running_corrects.double() / len(X_train)
    print('Epoch [{}/{}], Loss: {:.4f}, Accuracy: {:.4f}'.format(epoch+1, epochs2, epoch_loss, epoch_acc))

# 第三次训练
model3 = Model3()
criterion3 = nn.BCELoss()
optimizer3 = torch.optim.SGD(model3.parameters(), lr=lr3)
outputs2 = model2(preds1)
_, preds2 = torch.max(outputs2, 1)
for epoch in range(epochs3):
    optimizer3.zero_grad()
    outputs3 = model3(preds2.float())
    loss = criterion3(outputs3, torch.tensor(y_train, dtype=torch.float32))
    loss.backward()
    optimizer3.step()
    running_loss += loss.item() * X_train.size(0)
    running_corrects += torch.sum(torch.round(outputs3) == torch.tensor(y_train, dtype=torch.float32))
    epoch_loss = running_loss / len(X_train)
    epoch_acc = running_corrects.double() / len(X_train)
    print('Epoch [{}/{}], Loss: {:.4f}, Accuracy: {:.4f}'.format(epoch+1, epochs3, epoch_loss, epoch_acc))

4. 模型调用

  • 将训练好的模型加载到 PyCharm 中,并使用测试数据进行测试。
  • 预测结果将输出为 1 或 0,分别代表患病和正常。

5. 总结

本文介绍了如何使用 Python 构建 DNN 神经网络模型,根据基因表达量预测患者疾病状态。该模型包含三个子模型,并利用 PyTorch 框架实现。模型可调整参数,并在 JetBrains PyCharm 上运行,并输出训练过程中的准确率和损失值。

注意:

  • 代码中使用了 train_test_split 函数,但实际中将所有数据用作训练集。
  • 训练过程中,可以根据实际情况调整学习率、迭代次数和批次大小等参数,以达到最佳效果。
  • 模型的准确率和损失值与数据质量和模型结构有关,需要根据实际情况进行调整和优化。

参考链接:

  • PyTorch 官方文档:https://pytorch.org/docs/stable/
  • Scikit-learn 官方文档:https://scikit-learn.org/stable/
使用 Python 构建 DNN 神经网络根据基因表达量预测患者疾病状态

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

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