基于基因表达量预测疾病的DNN神经网络模型

本项目使用Python和PyTorch构建一个DNN神经网络模型,用于根据基因表达量数据预测患者是否患病。模型包含三个隐藏层,并使用贝叶斯优化进行参数优化,同时引入了注意力机制。

数据准备

  1. 数据来源:Excel表格,路径为'C:\Users\lenovo\Desktop\HIV\DNN神经网络测试\data1.xlsx'。
  2. 数据格式:
    • 第一行:患者状态标志'state'(1为患病,0为正常)和16个基因名称。
    • 第零列:患者是否患病的真值。
    • 其余列:基因的表达量。
  3. 数据划分:全部数据作为训练集,无测试集。

模型构建

  1. 框架:PyTorch。
  2. 结构:三层隐藏层,包含注意力机制。
  3. 优化器:使用贝叶斯优化进行参数优化。
  4. 损失函数:二分类交叉熵损失函数。

训练过程

  1. 使用全部数据进行训练。
  2. 每次训练后输出准确率和损失值。
  3. 使用贝叶斯优化调整模型参数,以获得最佳性能。

结果展示

  1. 绘制最佳参数下的准确率变化曲线。
  2. 绘制最佳参数下的损失值变化曲线。
  3. 绘制最佳参数下模型的ROC曲线。

代码实现

# 导入必要的库
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader
from bayes_opt import BayesianOptimization
import matplotlib.pyplot as plt
from 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'].values
        self.features = self.data.drop(['state'], axis=1).values

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

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

# 定义神经网络模型
class DNN(nn.Module):
    def __init__(self, input_size, hidden_size1, hidden_size2, hidden_size3, 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, 1)
        self.attention = nn.Linear(hidden_size3, attention_size)
        self.softmax = nn.Softmax(dim=1)

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = torch.relu(self.fc2(x))
        x = torch.relu(self.fc3(x))
        attention_weights = self.softmax(self.attention(x))
        x = torch.mul(x, attention_weights)
        x = torch.sigmoid(self.fc4(x))
        return x

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

    # 训练模型
    train_data = GeneDataset('C:\Users\lenovo\Desktop\HIV\DNN神经网络测试\data1.xlsx')
    train_loader = DataLoader(train_data, batch_size=32, shuffle=True)

    for epoch in range(100):
        running_loss = 0.0
        running_acc = 0.0
        for i, (inputs, labels) in enumerate(train_loader):
            inputs = inputs.float()
            labels = labels.float()
            optimizer.zero_grad()
            outputs = model(inputs)
            loss = criterion(outputs.squeeze(), labels)
            loss.backward()
            optimizer.step()
            running_loss += loss.item()
            running_acc += (outputs.squeeze() > 0.5).float().eq(labels).sum().item() / len(labels)
        print('Epoch [{}/100], Loss: {:.4f}, Acc: {:.4f}'.format(epoch + 1, running_loss / len(train_loader), running_acc / len(train_loader)))

    # 计算并返回AUC值
    with torch.no_grad():
        outputs = model(train_data.features.float())
        auc = roc_auc_score(train_data.labels, outputs.squeeze())
    return auc

# 执行贝叶斯优化
optimizer = BayesianOptimization(
    f=optimize_model,
    pbounds={'hidden_size1': (10, 100), 'hidden_size2': (10, 100), 'hidden_size3': (10, 100), 'attention_size': (1, 10), 'learning_rate': (0.0001, 0.01)},
    random_state=1
)
optimizer.maximize(init_points=5, n_iter=10)

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

# 使用最佳参数训练模型
model = DNN(input_size=16, hidden_size1=int(best_params['hidden_size1']), hidden_size2=int(best_params['hidden_size2']),
           hidden_size3=int(best_params['hidden_size3']), attention_size=int(best_params['attention_size']))
optimizer = optim.Adam(model.parameters(), lr=best_params['learning_rate'])
criterion = nn.BCELoss()

# 训练模型并记录训练过程中的指标
train_data = GeneDataset('C:\Users\lenovo\Desktop\HIV\DNN神经网络测试\data1.xlsx')
train_loader = DataLoader(train_data, batch_size=32, shuffle=True)
losses = []
accuracies = []
for epoch in range(100):
    running_loss = 0.0
    running_acc = 0.0
    for i, (inputs, labels) in enumerate(train_loader):
        inputs = inputs.float()
        labels = labels.float()
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs.squeeze(), labels)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
        running_acc += (outputs.squeeze() > 0.5).float().eq(labels).sum().item() / len(labels)
    losses.append(running_loss / len(train_loader))
    accuracies.append(running_acc / len(train_loader))
    print('Epoch [{}/100], Loss: {:.4f}, Acc: {:.4f}'.format(epoch + 1, running_loss / len(train_loader), running_acc / len(train_loader)))

# 绘制训练过程中的准确率变化曲线
plt.plot(accuracies)
plt.title('Accuracy Changes during Training')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.show()

# 绘制训练过程中的损失值变化曲线
plt.plot(losses)
plt.title('Loss Changes during Training')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.show()

# 绘制模型的ROC曲线
with torch.no_grad():
    outputs = model(train_data.features.float())
    fpr, tpr, thresholds = roc_curve(train_data.labels, outputs.squeeze())
    auc = roc_auc_score(train_data.labels, outputs.squeeze())

plt.plot(fpr, tpr, label='ROC curve (AUC = {:.2f})'.format(auc))
plt.plot([0, 1], [0, 1], 'k--', label='Random')
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) Curve')
plt.legend(loc='lower right')
plt.show()

说明:

  • 以上代码仅供参考,实际使用时可能需要根据具体情况进行调整。
  • 代码中包含了详细的注释,方便理解。
  • 数据集路径需要根据实际情况进行修改。
  • 贝叶斯优化参数和训练参数需要根据实际情况进行调整,以获得最佳性能。

结论:

通过使用DNN神经网络模型和贝叶斯优化,我们可以有效地预测患者是否患病。注意力机制的加入可以提高模型的准确性和鲁棒性。该项目展示了深度学习技术在疾病预测中的应用潜力。

使用Python和PyTorch构建DNN神经网络模型预测疾病,基于基因表达量和贝叶斯优化

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

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