基于基因表达量的DNN神经网络疾病预测模型
基于基因表达量的DNN神经网络疾病预测模型
本项目使用Python和PyTorch框架构建深度神经网络模型,根据基因表达量预测患者是否患病。模型包含两个阶段,分别进行4分类和2分类,并提供模型参数调整、Dropout层、训练结果输出和概率输出等功能。
项目需求
- 读入Excel表格,第一行为患者状态标志'state'(1为患病,0为正常)和基因名称,第0列为患者是否患病的真值,其余列为各基因及其表达量
- 定义两个模型
- 模型的各项参数可调
- 模型调用分为两次,第一次调用第一个模型,输入为基因的个数,输出为4分类
- 第二次调用第二个模型,第二个模型为二分类模型即患者是否患病,输入为第一个模型的输出
- 同时将第二个模型的最后一次训练得到每个样本所对应的概率输出
- 给出详细注释
- 模型加入Dropout层
- 能在JetBrains PyCharm 2018.3.7 x64上面运行
- Excel路径为'C:\Users\lenovo\Desktop\HIV\DNN神经网络测试\data1.xlsx'
- 数据全部作为训练集,没有测试集。即全部把数据拿去训练
- 将每次训练的准确率和损失值输出
- 使用pytorch框架
- 数据进行标准化
代码实现
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}')
模型说明
- 数据预处理: 读取Excel数据,进行数据标准化,将数据转换为PyTorch张量。
- 模型定义: 定义两个神经网络模型,分别用于4分类和2分类,并加入Dropout层以防止过拟合。
- 训练过程: 训练两个模型,并分别输出每个epoch的损失值和准确率。
- 概率输出: 输出第二个模型训练结束后的每个样本的概率值。
运行环境
- Python 3.6+
- PyTorch 1.0+
- pandas
- scikit-learn
注意事项
- 本项目仅使用训练集,没有测试集。
- 可以根据实际情况调整模型参数和训练参数。
- 模型结构和参数可以进一步优化,以提高预测精度。
原文地址: https://www.cveoy.top/t/topic/mC6R 著作权归作者所有。请勿转载和采集!