使用 Python 编写 DNN 神经网络根据基因表达量预测患者患病状态
本项目使用 Python 编写深度神经网络 (DNN) 模型,根据基因表达量数据预测患者是否患病。代码实现以下功能:
- 读取 Excel 表格数据,其中第一行为患者状态标志 (1 为患病,0 为正常) 和 16 个基因名称,第 0 列为患者是否患病的真值,其余列为基因的表达量。
- 数据路径为 'C:\Users\lenovo\Desktop\HIV\DNN\data1.xlsx'。
- 使用贝叶斯优化库 BayesianOptimization 对神经网络模型进行参数优化。
- 模型为二分类模型,包含三个隐藏层。
- 加入注意力机制以提高模型的预测准确率。
- 代码提供详细的注释。
- 数据全部作为训练集,没有测试集,即使用全部数据进行训练。
- 输出每次训练的准确率和损失值。
- 使用 PyTorch 框架构建神经网络模型。
代码实现
import pandas as pd
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
from sklearn.preprocessing import StandardScaler
from bayes_opt import BayesianOptimization
# 读取 Excel 表格中的数据
data = pd.read_excel('C:\Users\lenovo\Desktop\HIV\DNN\data1.xlsx')
# 数据预处理
X = data.iloc[:, 1:].values
y = data.iloc[:, 0].values
scaler = StandardScaler()
X = scaler.fit_transform(X)
y = np.array(y)
# 定义数据集类
class GeneDataset(Dataset):
def __init__(self, data, target):
self.data = data
self.target = target
def __getitem__(self, index):
x = self.data[index]
y = self.target[index]
return x, y
def __len__(self):
return len(self.target)
# 定义神经网络模型
class DNN(nn.Module):
def __init__(self, input_size, output_size, hidden_size1, hidden_size2, hidden_size3, dropout_rate, attention_size):
super(DNN, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size1)
self.fc2 = nn.Linear(hidden_size1, hidden_size2)
self.fc3 = nn.Linear(hidden_size2, hidden_size3)
self.fc4 = nn.Linear(hidden_size3, output_size)
self.dropout = nn.Dropout(dropout_rate)
self.attention = nn.Sequential(
nn.Linear(hidden_size3, attention_size),
nn.Tanh(),
nn.Linear(attention_size, 1),
nn.Softmax(dim=1)
)
def forward(self, x):
x = self.fc1(x)
x = nn.functional.relu(x)
x = self.dropout(x)
x = self.fc2(x)
x = nn.functional.relu(x)
x = self.dropout(x)
x = self.fc3(x)
x = nn.functional.relu(x)
x = self.dropout(x)
attention_weight = self.attention(x)
x = attention_weight * x
x = self.fc4(x)
return x
# 定义训练函数
def train(epoch, lr, hidden_size1, hidden_size2, hidden_size3, dropout_rate, attention_size):
model = DNN(input_size=X.shape[1], output_size=1, hidden_size1=int(hidden_size1), hidden_size2=int(hidden_size2), hidden_size3=int(hidden_size3), dropout_rate=dropout_rate, attention_size=int(attention_size))
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.Adam(model.parameters(), lr=lr)
trainset = GeneDataset(X, y)
trainloader = DataLoader(trainset, batch_size=32)
total_loss = 0.0
total_correct = 0
for i in range(epoch):
for batch_idx, (data, target) in enumerate(trainloader):
optimizer.zero_grad()
output = model(data.float())
loss = criterion(output.squeeze(), target.float())
loss.backward()
optimizer.step()
total_loss += loss.item()
pred = (output > 0).float()
total_correct += pred.eq(target.float()).sum().item()
accuracy = total_correct / len(trainset)
loss = total_loss / len(trainset)
print('Accuracy: {:.4f}, Loss: {:.4f}'.format(accuracy, loss))
return accuracy
# 定义贝叶斯优化的参数范围
pbounds = {'epoch': (10, 100),
'lr': (0.0001, 0.01),
'hidden_size1': (16, 256),
'hidden_size2': (16, 256),
'hidden_size3': (16, 256),
'dropout_rate': (0, 0.5),
'attention_size': (8, 32)}
# 进行贝叶斯优化
optimizer = BayesianOptimization(f=train, pbounds=pbounds)
optimizer.maximize(init_points=5, n_iter=20)
# 输出最优参数
print(optimizer.max)
# 训练模型并输出准确率和损失值
model = DNN(input_size=X.shape[1], output_size=1, hidden_size1=int(optimizer.max['params']['hidden_size1']), hidden_size2=int(optimizer.max['params']['hidden_size2']), hidden_size3=int(optimizer.max['params']['hidden_size3']), dropout_rate=optimizer.max['params']['dropout_rate'], attention_size=int(optimizer.max['params']['attention_size']))
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.Adam(model.parameters(), lr=optimizer.max['params']['lr'])
trainset = GeneDataset(X, y)
trainloader = DataLoader(trainset, batch_size=32)
total_loss = 0.0
total_correct = 0
for i in range(optimizer.max['params']['epoch']):
for batch_idx, (data, target) in enumerate(trainloader):
optimizer.zero_grad()
output = model(data.float())
loss = criterion(output.squeeze(), target.float())
loss.backward()
optimizer.step()
total_loss += loss.item()
pred = (output > 0).float()
total_correct += pred.eq(target.float()).sum().item()
accuracy = total_correct / len(trainset)
loss = total_loss / len(trainset)
print('Epoch {:d}: Accuracy: {:.4f}, Loss: {:.4f}'.format(i+1, accuracy, loss))
说明
- 该代码使用
pandas读取 Excel 表格数据,并使用StandardScaler进行数据预处理,使其符合神经网络模型的输入要求。 - 代码定义了
GeneDataset类,用于将数据转换为 PyTorch 可以使用的Dataset对象。 DNN类定义了深度神经网络模型,包含三个隐藏层和注意力机制。train函数用于训练模型并返回训练集上的准确率和损失值。BayesianOptimization库用于对模型参数进行贝叶斯优化,找到最优参数组合。- 最后,代码使用找到的最优参数重新训练模型并输出每次训练的准确率和损失值。
运行方式
- 安装必要的库:
pip install pandas numpy torch scikit-learn bayesian-optimization
-
将 Excel 表格文件
data1.xlsx放置在代码所在目录下。 -
运行 Python 代码文件。
注意事项
- 该代码中的数据路径需要根据实际情况进行修改。
- 贝叶斯优化是一个随机搜索过程,每次运行的结果可能略有不同。
- 可以根据需要调整代码中的参数范围和迭代次数。
其他
本项目只是一个简单的示例,可以根据实际需求进行扩展和改进。例如,可以尝试使用其他类型的注意力机制,或者添加其他层级结构。
参考
原文地址: https://www.cveoy.top/t/topic/nc9W 著作权归作者所有。请勿转载和采集!