import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc

# 读入数据
data = pd.read_excel('C:\Users\lenovo\Desktop\HIV\DNN神经网络测试\data1.xlsx')
X = data.iloc[:, 1:].values
y = data.iloc[:, 0].values

# 构建模型
class DNN(nn.Module):
    def __init__(self):
        super(DNN, self).__init__()
        self.fc1 = nn.Linear(16, 32)
        self.fc2 = nn.Linear(32, 64)
        self.fc3 = nn.Linear(64, 128)
        self.fc4 = nn.Linear(128, 1)
        self.dropout = nn.Dropout(0.5)
        self.attention = nn.MultiheadAttention(128, 2)

    def forward(self, x):
        x = torch.sigmoid(self.fc1(x))
        x = self.dropout(x)
        x = torch.sigmoid(self.fc2(x))
        x = self.dropout(x)
        x = torch.sigmoid(self.fc3(x))
        x = self.dropout(x)
        x = x.transpose(0, 1)
        x, _ = self.attention(x, x, x)
        x = x.transpose(0, 1)
        x = torch.sigmoid(self.fc4(x))
        return x

# 训练模型
model = DNN()
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
accuracies = []
losses = []
for epoch in range(1000):
    optimizer.zero_grad()
    inputs = torch.tensor(X, dtype=torch.float32)
    targets = torch.tensor(y, dtype=torch.float32)
    outputs = model(inputs)
    loss = criterion(outputs, targets.unsqueeze(1))
    loss.backward()
    optimizer.step()
    # 计算准确率
    predictions = (outputs > 0.5).float()
    accuracy = (predictions == targets.unsqueeze(1)).float().mean()
    accuracies.append(accuracy)
    losses.append(loss.item())
    if epoch % 100 == 0:
        print('Epoch [{}/{}], Loss: {:.4f}, Accuracy: {:.4f}'.format(epoch+1, 1000, loss.item(), accuracy))

# 输出每个样本的概率
probabilities = model(torch.tensor(X, dtype=torch.float32)).detach().numpy().squeeze()
print(probabilities)

# 绘制准确率变化的图
plt.plot(accuracies)
plt.title('Accuracy over Epochs')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.show()

# 绘制损失变化的图
plt.plot(losses)
plt.title('Loss over Epochs')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.show()

# 绘制ROC图
fpr, tpr, _ = roc_curve(y, probabilities)
roc_auc = auc(fpr, tpr)
plt.plot(fpr, tpr, lw=2, label='ROC curve (area = {:.2f})'.format(roc_auc))
plt.plot([0, 1], [0, 1], linestyle='--', lw=2, color='r', alpha=.8)
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')
plt.legend(loc='lower right')
plt.show()

代码解释:

  1. 数据读取: 使用pandas库读取名为'data1.xlsx'的Excel表格,并分别提取基因表达量数据和患者状态标签。
  2. 模型构建: 定义一个名为DNN的深度神经网络模型,包含三个全连接层 (fc1, fc2, fc3)、一个输出层 (fc4)、Dropout层和注意力机制 (MultiheadAttention)。
  3. 模型训练: 使用Adam优化器和二元交叉熵损失函数训练模型。代码记录了每个epoch的准确率和损失值,并每100个epoch打印一次训练进度。
  4. 输出概率: 训练完成后,使用模型预测每个样本的患病概率,并输出预测结果。
  5. 性能评估: 绘制准确率变化图、损失变化图和ROC曲线,用于评估模型的性能。

优化说明:

  • 标题: 将标题改为更具体、更吸引人的标题,例如“使用PyTorch构建DNN神经网络预测患者患病状态: 基于基因表达量的二分类模型”。
  • 描述: 编写一个简洁、清晰的描述,概述代码的功能和模型的特点。
  • 关键词: 添加与代码相关的关键词,例如'DNN神经网络', 'PyTorch', '基因表达量', '患者患病', '二分类模型'等。
  • 代码格式: 将代码块用python包裹,并添加必要的注释。
  • 解释: 补充代码的解释,使其更容易理解。
  • 内容: 除了代码,还应添加一些相关信息,例如模型的结构、训练参数、性能评估指标等。

通过以上优化,可以提高代码的可读性和搜索排名。

使用PyTorch构建DNN神经网络预测患者患病状态: 基于基因表达量的二分类模型

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

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