基于PyTorch的基因表达量预测模型构建与评估
该代码使用PyTorch构建一个简单的二分类神经网络模型,用于预测基因表达量与疾病状态之间的关系。
首先,代码从Excel表格中读取训练集和测试集数据,包括基因表达量和疾病状态标签。然后,将数据转换为PyTorch的tensor类型,并对基因表达量进行标准化处理。
接下来,定义了一个包含两个隐藏层和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列转换为tensor类型
train_labels = torch.tensor(data_train['state'].values)
test_labels = torch.tensor(data_test['state'].values)
# 将基因表达量转换为tensor类型
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())
# 将标准化后的数据转换为tensor类型
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)
代码中,训练集用于模型参数的更新,测试集用于评估模型的泛化能力。测试集没有参与模型训练,这有助于客观评估模型在从未见过的数据上的表现。
原文地址: https://www.cveoy.top/t/topic/nfta 著作权归作者所有。请勿转载和采集!