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

本项目使用Python和PyTorch框架构建深度神经网络模型,根据基因表达量预测患者是否患病。模型包含两个阶段,分别进行4分类和2分类,并提供模型参数调整、Dropout层、训练结果输出和概率输出等功能。

项目需求

  1. 读入Excel表格,第一行为患者状态标志'state'(1为患病,0为正常)和基因名称,第0列为患者是否患病的真值,其余列为各基因及其表达量
  2. 定义两个模型
  3. 模型的各项参数可调
  4. 模型调用分为两次,第一次调用第一个模型,输入为基因的个数,输出为4分类
  5. 第二次调用第二个模型,第二个模型为二分类模型即患者是否患病,输入为第一个模型的输出
  6. 同时将第二个模型的最后一次训练得到每个样本所对应的概率输出
  7. 给出详细注释
  8. 模型加入Dropout层
  9. 能在JetBrains PyCharm 2018.3.7 x64上面运行
  10. Excel路径为'C:\Users\lenovo\Desktop\HIV\DNN神经网络测试\data1.xlsx'
  11. 数据全部作为训练集,没有测试集。即全部把数据拿去训练
  12. 将每次训练的准确率和损失值输出
  13. 使用pytorch框架
  14. 数据进行标准化

代码实现

import torch
import torch.nn as nn
import torch.optim as optim
import pandas as pd
from sklearn.preprocessing import StandardScaler

# 读入Excel表格
data = pd.read_excel('C:\Users\lenovo\Desktop\HIV\DNN神经网络测试\data1.xlsx')

# 获取基因数量
gene_num = len(data.columns) - 1

# 数据标准化
scaler = StandardScaler()
data.iloc[:, 1:] = scaler.fit_transform(data.iloc[:, 1:])

# 定义第一个模型
class Model1(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(gene_num, 32)
        self.fc2 = nn.Linear(32, 16)
        self.fc3 = nn.Linear(16, 4)
        self.dropout = nn.Dropout(p=0.5)  # 加入Dropout层

    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.dropout(x)  # 使用Dropout层
        x = torch.relu(self.fc2(x))
        x = self.dropout(x)  # 使用Dropout层
        x = self.fc3(x)
        return x

# 定义第二个模型
class Model2(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(4, 2)
        self.dropout = nn.Dropout(p=0.5)  # 加入Dropout层

    def forward(self, x):
        x = self.fc1(x)
        x = self.dropout(x)  # 使用Dropout层
        return x

# 定义损失函数和优化器
criterion1 = nn.CrossEntropyLoss()
criterion2 = nn.CrossEntropyLoss()
optimizer1 = optim.Adam(model1.parameters(), lr=0.001)
optimizer2 = optim.Adam(model2.parameters(), lr=0.001)

# 训练第一个模型
model1 = Model1()
for epoch in range(50):
    inputs = torch.tensor(data.iloc[:, 1:].values, dtype=torch.float32)
    labels = torch.tensor(data.iloc[:, 0].values, dtype=torch.long)

    optimizer1.zero_grad()
    outputs1 = model1(inputs)
    loss1 = criterion1(outputs1, labels)
    loss1.backward()
    optimizer1.step()

    # 输出训练结果
    with torch.no_grad():
        _, predicted1 = torch.max(outputs1, 1)
        correct1 = (predicted1 == labels).sum().item()
        accuracy1 = correct1 / len(labels)
        print(f'Epoch {epoch+1}: Loss={loss1.item()}, Accuracy={accuracy1}')

    # 将第一个模型的输出作为第二个模型的输入
    inputs2 = outputs1
    labels2 = labels % 2  # 将患病状态转化为二分类问题

    # 训练第二个模型
    model2 = Model2()
    for epoch2 in range(50):
        optimizer2.zero_grad()
        outputs2 = model2(inputs2)
        loss2 = criterion2(outputs2, labels2)
        loss2.backward()
        optimizer2.step()

        # 输出训练结果
        with torch.no_grad():
            _, predicted2 = torch.max(outputs2, 1)
            correct2 = (predicted2 == labels2).sum().item()
            accuracy2 = correct2 / len(labels2)
            print(f'Epoch {epoch+1}_{epoch2+1}: Loss={loss2.item()}, Accuracy={accuracy2}')

    # 输出每个样本的概率
    with torch.no_grad():
        prob = nn.functional.softmax(outputs2, dim=1)
        print(f'Probabilities: {prob}')

模型说明

  1. 数据预处理: 读取Excel数据,进行数据标准化,将数据转换为PyTorch张量。
  2. 模型定义: 定义两个神经网络模型,分别用于4分类和2分类,并加入Dropout层以防止过拟合。
  3. 训练过程: 训练两个模型,并分别输出每个epoch的损失值和准确率。
  4. 概率输出: 输出第二个模型训练结束后的每个样本的概率值。

运行环境

  • Python 3.6+
  • PyTorch 1.0+
  • pandas
  • scikit-learn

注意事项

  • 本项目仅使用训练集,没有测试集。
  • 可以根据实际情况调整模型参数和训练参数。
  • 模型结构和参数可以进一步优化,以提高预测精度。
基于基因表达量的DNN神经网络疾病预测模型

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

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