基于基因表达量的疾病预测:使用 PyTorch 神经网络模型

本文使用 PyTorch 构建神经网络模型,根据基因表达量预测患者是否患病。模型采用二分类结构,并包含一个隐藏层。数据来自 Excel 表格,并进行了标准化处理。模型在训练过程中,将训练集和测试集同时使用,以优化模型参数。最后,输出每个样本的患病概率。

数据准备

  1. 读取数据:

    • 训练集路径:'C:\Users\lenovo\Desktop\HIV\PAH三个数据集\selected_genes.xlsx'
    • 测试集路径:'C:\Users\lenovo\Desktop\HIV\PAH三个数据集\GSE53408 对应lasso基因.xlsx'
  2. 数据格式:

    • Excel 表格的第一行为患者状态标志 'state'(1 为患病,0 为正常)和 8 个基因名称。
    • 第 0 列为患者是否患病的真值,其余列为基因的表达量。
  3. 数据预处理:

    • 将 'state' 列和基因表达量转换为 PyTorch 张量。
    • 使用 StandardScaler 对基因表达量进行标准化处理。

模型构建

  1. 定义神经网络模型:

    • 使用 nn.Linear 创建输入层到隐藏层和隐藏层到输出层的连接。
    • 使用 nn.Sigmoid 作为激活函数。
  2. 实例化模型:

    • 创建 Net 类的实例。
  3. 定义损失函数和优化器:

    • 使用 nn.BCELoss 作为损失函数,用于计算二分类交叉熵损失。
    • 使用 optim.SGD 作为优化器,使用随机梯度下降法更新模型参数。

模型训练

  1. 循环训练:

    • 循环遍历 100 个 epoch。
    • 将训练集的特征和标签传入模型并计算出模型的预测值。
    • 计算损失。
    • 梯度清零。
    • 反向传播。
    • 更新参数。
  2. 评估模型性能:

    • 计算训练集和测试集的准确率和损失值。
    • 输出每个 epoch 的训练过程中的损失和准确率。

模型评估

  1. 预测患病概率:
    • 将测试集的特征传入模型,并使用 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 构建神经网络模型,根据基因表达量预测患者是否患病的完整流程。该模型简单易懂,并实现了良好的性能。希望本文能够为读者提供一些参考和启发。

基于基因表达量的疾病预测:使用 PyTorch 神经网络模型

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

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