使用 Python 构建 DNN 神经网络根据基因表达量预测患者疾病状态
使用 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.CrossEntropyLoss或nn.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/
原文地址: https://www.cveoy.top/t/topic/myF6 著作权归作者所有。请勿转载和采集!