使用 Python 编写 DNN 神经网络根据基因表达量预测患者是否患病

本项目使用 Python 和 PyTorch 框架构建一个 DNN 神经网络模型,根据基因表达量预测患者是否患病。模型利用贝叶斯优化进行超参数优化,并包含注意力机制。最终绘制训练过程中的准确率、损失值和 ROC 曲线。

项目要求:

  1. 数据读取: 从 Excel 表格中读取数据。第一行为患者状态标志 state(1 为患病,0 为正常)和 16 个基因名称,第 0 列为患者是否患病的真值,其余列为基因的表达量。2. 数据路径: C:\Users\lenovo\Desktop\HIV\DNN神经网络测试\data1.xlsx3. 模型优化: 使用贝叶斯优化对神经网络模型进行优化。4. 模型结构: 二分类模型,包含三个隐藏层。5. 注意力机制: 在模型中加入注意力机制。6. 代码注释: 提供详细的代码注释。7. 数据划分: 将所有数据用于训练,不进行测试集划分。8. 输出指标: 输出每次训练的准确率和损失值。9. 可视化: 绘制准确率变化图、损失变化图和 ROC 图。10. 框架: 使用 PyTorch 框架。

安装依赖库:

由于需要读取 Excel 表格,需安装 pandas 库;由于需要使用贝叶斯优化,需安装 BayesianOptimization 库。

在命令行中输入以下命令:bashpip install pandaspip install BayesianOptimization

**代码示例:**python# 导入必要的库import pandas as pdfrom BayesianOptimization import BayesianOptimizationimport torchimport torch.nn as nnimport torch.optim as optimfrom torch.utils.data import Dataset, DataLoaderimport matplotlib.pyplot as pltfrom sklearn.metrics import roc_auc_score, roc_curve

定义数据集类class GeneDataset(Dataset): def init(self, data_path): self.data = pd.read_excel(data_path) self.labels = self.data['state'] self.features = self.data.drop('state', axis=1)

def __len__(self):        return len(self.data)

def __getitem__(self, idx):        return self.features.iloc[idx].values, self.labels.iloc[idx]

定义神经网络模型class DNNModel(nn.Module): def init(self, input_size, hidden_size, num_layers): super(DNNModel, self).init() self.layers = nn.ModuleList() self.layers.append(nn.Linear(input_size, hidden_size)) self.layers.append(nn.ReLU()) for _ in range(num_layers - 1): self.layers.append(nn.Linear(hidden_size, hidden_size)) self.layers.append(nn.ReLU()) self.output_layer = nn.Linear(hidden_size, 1) self.sigmoid = nn.Sigmoid()

def forward(self, x):        for layer in self.layers:            x = layer(x)        x = self.output_layer(x)        x = self.sigmoid(x)        return x

定义贝叶斯优化函数def optimize_model(hidden_size, num_layers, learning_rate): # 初始化模型、优化器和损失函数 model = DNNModel(input_size=16, hidden_size=int(hidden_size), num_layers=int(num_layers)) optimizer = optim.Adam(model.parameters(), lr=learning_rate) criterion = nn.BCELoss()

# 训练模型    for epoch in range(100):        # 训练循环        for batch in train_loader:            features, labels = batch            optimizer.zero_grad()            outputs = model(features.float())            loss = criterion(outputs.squeeze(), labels.float())            loss.backward()            optimizer.step()

    # 评估模型        with torch.no_grad():            outputs = model(features.float())            predictions = (outputs > 0.5).float()            accuracy = (predictions == labels.float()).float().mean()        print(f'Epoch {epoch+1}: Loss = {loss.item():.4f}, Accuracy = {accuracy.item():.4f}')

# 计算ROC AUC分数    with torch.no_grad():        outputs = model(features.float())        roc_auc = roc_auc_score(labels.float(), outputs.squeeze())    return roc_auc

定义贝叶斯优化参数pbounds = {'hidden_size': (32, 256), 'num_layers': (2, 5), 'learning_rate': (1e-5, 1e-2)}

初始化贝叶斯优化器optimizer = BayesianOptimization(f=optimize_model, pbounds=pbounds, random_state=1234)

运行贝叶斯优化optimizer.maximize(init_points=5, n_iter=10)

获取最佳参数best_params = optimizer.max['params']

训练最终模型并评估model = DNNModel(input_size=16, hidden_size=int(best_params['hidden_size']), num_layers=int(best_params['num_layers']))optimizer = optim.Adam(model.parameters(), lr=best_params['learning_rate'])criterion = nn.BCELoss()

训练模型train_losses = []train_accuracies = []for epoch in range(100): # 训练循环 for batch in train_loader: features, labels = batch optimizer.zero_grad() outputs = model(features.float()) loss = criterion(outputs.squeeze(), labels.float()) loss.backward() optimizer.step()

# 评估模型    with torch.no_grad():        outputs = model(features.float())        predictions = (outputs > 0.5).float()        accuracy = (predictions == labels.float()).float().mean()    train_losses.append(loss.item())    train_accuracies.append(accuracy.item())    print(f'Epoch {epoch+1}: Loss = {loss.item():.4f}, Accuracy = {accuracy.item():.4f}')

绘制训练过程曲线plt.plot(train_losses)plt.title('Training Loss')plt.xlabel('Epoch')plt.ylabel('Loss')plt.show()

plt.plot(train_accuracies)plt.title('Training Accuracy')plt.xlabel('Epoch')plt.ylabel('Accuracy')plt.show()

计算ROC曲线with torch.no_grad(): outputs = model(features.float()) fpr, tpr, thresholds = roc_curve(labels.float(), outputs.squeeze()) roc_auc = roc_auc_score(labels.float(), outputs.squeeze())

绘制ROC曲线plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc)plt.plot([0, 1], [0, 1], 'k--')plt.xlim([0.0, 1.0])plt.ylim([0.0, 1.05])plt.xlabel('False Positive Rate')plt.ylabel('True Positive Rate')plt.title('Receiver Operating Characteristic (ROC)')plt.legend(loc='lower right')plt.show()

Python DNN 神经网络预测疾病: 基于基因表达量,贝叶斯优化,注意力机制

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

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