基于基因表达量的疾病预测:使用 PyTorch 神经网络模型
基于基因表达量的疾病预测:使用 PyTorch 神经网络模型
本文使用 PyTorch 构建神经网络模型,根据基因表达量预测患者是否患病。模型采用二分类结构,并包含一个隐藏层。数据来自 Excel 表格,并进行了标准化处理。模型在训练过程中,将训练集和测试集同时使用,以优化模型参数。最后,输出每个样本的患病概率。
数据准备
-
读取数据:
- 训练集路径:'C:\Users\lenovo\Desktop\HIV\PAH三个数据集\selected_genes.xlsx'
- 测试集路径:'C:\Users\lenovo\Desktop\HIV\PAH三个数据集\GSE53408 对应lasso基因.xlsx'
-
数据格式:
- Excel 表格的第一行为患者状态标志 'state'(1 为患病,0 为正常)和 8 个基因名称。
- 第 0 列为患者是否患病的真值,其余列为基因的表达量。
-
数据预处理:
- 将 'state' 列和基因表达量转换为 PyTorch 张量。
- 使用
StandardScaler对基因表达量进行标准化处理。
模型构建
-
定义神经网络模型:
- 使用
nn.Linear创建输入层到隐藏层和隐藏层到输出层的连接。 - 使用
nn.Sigmoid作为激活函数。
- 使用
-
实例化模型:
- 创建
Net类的实例。
- 创建
-
定义损失函数和优化器:
- 使用
nn.BCELoss作为损失函数,用于计算二分类交叉熵损失。 - 使用
optim.SGD作为优化器,使用随机梯度下降法更新模型参数。
- 使用
模型训练
-
循环训练:
- 循环遍历 100 个 epoch。
- 将训练集的特征和标签传入模型并计算出模型的预测值。
- 计算损失。
- 梯度清零。
- 反向传播。
- 更新参数。
-
评估模型性能:
- 计算训练集和测试集的准确率和损失值。
- 输出每个 epoch 的训练过程中的损失和准确率。
模型评估
- 预测患病概率:
- 将测试集的特征传入模型,并使用
torch.sigmoid计算每个样本的患病概率。 - 输出每个样本的患病概率。
- 将测试集的特征传入模型,并使用
代码实现
import torch
import torch.nn as nn
import torch.optim as optim
import pandas as pd
from sklearn.preprocessing import StandardScaler
# 读取 Excel 表格
data_train = pd.read_excel(r'C:\Users\lenovo\Desktop\HIV\PAH三个数据集\selected_genes.xlsx')
data_test = pd.read_excel(r'C:\Users\lenovo\Desktop\HIV\PAH三个数据集\GSE53408 对应lasso基因.xlsx')
# 将 'state' 列转换为张量类型
train_labels = torch.tensor(data_train['state'].values)
test_labels = torch.tensor(data_test['state'].values)
# 将基因表达量转换为张量类型
train_features = torch.tensor(data_train.iloc[:, 1:].values)
test_features = torch.tensor(data_test.iloc[:, 1:].values)
# 数据标准化
scaler = StandardScaler()
train_features = scaler.fit_transform(train_features.numpy())
test_features = scaler.transform(test_features.numpy())
# 将标准化后的数据转换为张量类型
train_features = torch.tensor(train_features)
test_features = torch.tensor(test_features)
# 定义神经网络模型
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(8, 4) # 输入层到隐藏层
self.fc2 = nn.Linear(4, 1) # 隐藏层到输出层
self.sigmoid = nn.Sigmoid() # 激活函数
def forward(self, x):
x = self.fc1(x)
x = self.sigmoid(x)
x = self.fc2(x)
x = self.sigmoid(x)
return x
# 实例化模型
net = Net()
# 定义损失函数和优化器
criterion = nn.BCELoss()
optimizer = optim.SGD(net.parameters(), lr=0.1)
# 训练模型
for epoch in range(100):
# 将训练集的特征和标签传入模型并计算出模型的预测值
outputs = net(train_features.float())
# 计算损失
loss = criterion(outputs.squeeze(), train_labels.float())
# 梯度清零
optimizer.zero_grad()
# 反向传播
loss.backward()
# 更新参数
optimizer.step()
# 计算训练集准确率和损失值
train_outputs = net(train_features.float())
train_loss = criterion(train_outputs.squeeze(), train_labels.float())
train_acc = ((train_outputs > 0.5).float() == train_labels).float().mean()
# 计算测试集准确率和损失值
test_outputs = net(test_features.float())
test_loss = criterion(test_outputs.squeeze(), test_labels.float())
test_acc = ((test_outputs > 0.5).float() == test_labels).float().mean()
# 输出训练过程中的损失和准确率
print('Epoch [{}/{}], Train Loss: {:.4f}, Train Acc: {:.2f}%, Test Loss: {:.4f}, Test Acc: {:.2f}%'
.format(epoch + 1, 100, train_loss.item(), train_acc * 100, test_loss.item(), test_acc * 100))
# 输出每个样本的概率
outputs = net(test_features.float())
probabilities = torch.sigmoid(outputs)
print(probabilities)
总结
本文展示了使用 PyTorch 构建神经网络模型,根据基因表达量预测患者是否患病的完整流程。该模型简单易懂,并实现了良好的性能。希望本文能够为读者提供一些参考和启发。
原文地址: http://www.cveoy.top/t/topic/nfs6 著作权归作者所有。请勿转载和采集!