基于基因表达量的患者疾病预测:使用 PyTorch 构建 DNN 神经网络
基于基因表达量的患者疾病预测:使用 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 层来防止过拟合。模型支持自定义参数并能输出每个样本对应的预测概率。该模型可用于帮助医疗工作者更准确地预测患者的疾病状态。
注意事项
- 本项目只使用了训练集,没有使用测试集,因此模型的泛化能力有待验证。
- 实际应用中需要根据具体情况调整模型参数和训练方法。
- 医疗数据分析需遵循相关伦理和法律法规。
原文地址: https://www.cveoy.top/t/topic/mC4z 著作权归作者所有。请勿转载和采集!