基于16个基因表达量预测患者患病状态的DNN神经网络模型 (Python PyTorch 实现)
使用Python编写DNN神经网络根据16个基因的表达量来预测患者是否患病
本项目使用PyTorch框架构建深度神经网络模型,根据16个基因表达量预测患者患病状态。模型采用三层结构,分别进行8分类、4分类和最终二分类预测。包含详细注释、损失函数变化曲线、准确率变化曲线、ROC曲线、AUC值、特征重要性图、热图和t-SNE图等可视化结果。
1. 数据准备
首先,需要准备一个Excel表格,其中包含患者状态标志'state'和基因名称,以及各基因的表达量。
- 第0列为患者是否患病的真值 (0/1)。
 - 第1行为患者状态标志'state'和基因名称。
 - 其余列为各基因及其表达量。
 
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.metrics import roc_auc_score, roc_curve
import matplotlib.pyplot as plt
from sklearn.manifold import TSNE
# 读入数据
data = pd.read_excel('data.xlsx')
X = data.iloc[:, 1:].values
y = data.iloc[:, 0].values
2. 定义DNN模型
本项目使用三个DNN模型,分别进行8分类、4分类和最终二分类预测。
class Model1(nn.Module):
    def __init__(self):
        super(Model1, self).__init__()
        self.fc1 = nn.Linear(16, 64)
        self.fc2 = nn.Linear(64, 128)
        self.fc3 = nn.Linear(128, 8)
        self.dropout = nn.Dropout(0.5)
    def forward(self, x):
        x = nn.functional.relu(self.fc1(x))
        x = nn.functional.relu(self.fc2(x))
        x = self.dropout(x)
        x = nn.functional.softmax(self.fc3(x), dim=1)
        return x
class Model2(nn.Module):
    def __init__(self):
        super(Model2, self).__init__()
        self.fc1 = nn.Linear(8, 32)
        self.fc2 = nn.Linear(32, 64)
        self.fc3 = nn.Linear(64, 4)
        self.dropout = nn.Dropout(0.5)
    def forward(self, x):
        x = nn.functional.relu(self.fc1(x))
        x = nn.functional.relu(self.fc2(x))
        x = self.dropout(x)
        x = nn.functional.softmax(self.fc3(x), dim=1)
        return x
class Model3(nn.Module):
    def __init__(self):
        super(Model3, self).__init__()
        self.fc1 = nn.Linear(4, 16)
        self.fc2 = nn.Linear(16, 1)
    def forward(self, x):
        x = nn.functional.relu(self.fc1(x))
        x = nn.functional.sigmoid(self.fc2(x))
        return x
3. 训练模型
模型训练过程包括三个步骤,分别训练三个模型。每个模型使用Adam优化器进行参数优化,并绘制损失函数变化曲线和准确率变化曲线。
# 定义训练函数
def train(model, criterion, optimizer, X, y):
    model.train()
    optimizer.zero_grad()
    output = model(X)
    loss = criterion(output, y)
    loss.backward()
    optimizer.step()
    return loss.item()
# 定义测试函数
def test(model, X, y):
    model.eval()
    output = model(X)
    return roc_auc_score(y, output.detach().numpy())
# 训练第一个模型
model1 = Model1()
criterion1 = nn.CrossEntropyLoss()
optimizer1 = optim.Adam(model1.parameters(), lr=0.001)
train_loss1 = []
test_auc1 = []
for epoch in range(100):
    loss = train(model1, criterion1, optimizer1, torch.FloatTensor(X), torch.LongTensor(y))
    train_loss1.append(loss)
    auc = test(model1, torch.FloatTensor(X), y)
    test_auc1.append(auc)
plt.plot(train_loss1)
plt.plot(test_auc1)
plt.show()
# 训练第二个模型
model2 = Model2()
criterion2 = nn.CrossEntropyLoss()
optimizer2 = optim.Adam(model2.parameters(), lr=0.001)
X1 = model1(torch.FloatTensor(X)).detach().numpy()
train_loss2 = []
test_auc2 = []
for epoch in range(100):
    loss = train(model2, criterion2, optimizer2, torch.FloatTensor(X1), torch.LongTensor(y))
    train_loss2.append(loss)
    auc = test(model2, torch.FloatTensor(X1), y)
    test_auc2.append(auc)
plt.plot(train_loss2)
plt.plot(test_auc2)
plt.show()
# 训练第三个模型
model3 = Model3()
criterion3 = nn.BCELoss()
optimizer3 = optim.Adam(model3.parameters(), lr=0.001)
X2 = model2(torch.FloatTensor(X1)).detach().numpy()
train_loss3 = []
test_auc3 = []
for epoch in range(100):
    loss = train(model3, criterion3, optimizer3, torch.FloatTensor(X2), torch.FloatTensor(y))
    train_loss3.append(loss)
    auc = test(model3, torch.FloatTensor(X2), y)
    test_auc3.append(auc)
plt.plot(train_loss3)
plt.plot(test_auc3)
plt.show()
4. 模型评估
模型评估包括绘制ROC曲线、计算AUC值、绘制特征重要性图、绘制热图以及绘制t-SNE图。
# 绘制ROC曲线和AUC值
fpr, tpr, thresholds = roc_curve(y, model3(torch.FloatTensor(X2)).detach().numpy())
auc = roc_auc_score(y, model3(torch.FloatTensor(X2)).detach().numpy())
plt.plot(fpr, tpr)
plt.show()
# 绘制特征重要性图
weights1 = model1.fc3.weight.detach().numpy()
weights2 = model2.fc3.weight.detach().numpy()
weights3 = model3.fc2.weight.detach().numpy()
plt.bar(range(8), weights1[0])
plt.show()
plt.bar(range(4), weights2[0])
plt.show()
plt.bar(range(1), weights3[0])
plt.show()
# 绘制热图
data_corr = data.corr()
plt.imshow(data_corr, cmap='coolwarm')
plt.show()
# 绘制t-SNE图
X_embedded = TSNE(n_components=2).fit_transform(X)
plt.scatter(X_embedded[:, 0], X_embedded[:, 1], c=y)
plt.show()
总结
本项目使用PyTorch框架构建了一个三层DNN神经网络模型,用于根据16个基因表达量预测患者患病状态。模型训练过程包括损失函数变化曲线和准确率变化曲线可视化,模型评估包括ROC曲线、AUC值、特征重要性图、热图和t-SNE图可视化。模型代码包含详细注释,可供读者参考学习。
原文地址: https://www.cveoy.top/t/topic/mmAa 著作权归作者所有。请勿转载和采集!