导入必要的库

import torch import torch.nn as nn import torch.optim as optim import pandas as pd from hyperopt import hp, fmin, tpe, Trials

读取Excel表格

data = pd.read_excel('C:\Users\lenovo\Desktop\HIV\GSE6740GSE50011基因降低\output_data.xlsx')

数据标准化

data.iloc[:, 1:] = (data.iloc[:, 1:] - data.iloc[:, 1:].mean()) / data.iloc[:, 1:].std()

划分数据集

x_train = torch.tensor(data.iloc[:, 1:].values, dtype=torch.float32) y_train = torch.tensor(data.iloc[:, 0].values, dtype=torch.long) num_features = x_train.shape[1]

定义第一个模型

class Model1(nn.Module): def init(self, input_dim, hidden_dim, output_dim): super(Model1, self).init() self.fc1 = nn.Linear(input_dim, hidden_dim) self.fc2 = nn.Linear(hidden_dim, hidden_dim) self.fc3 = nn.Linear(hidden_dim, output_dim) self.dropout = nn.Dropout(p=0.5)

def forward(self, x):
    out = nn.functional.relu(self.fc1(x))
    out = self.dropout(out)
    out = nn.functional.relu(self.fc2(out))
    out = self.dropout(out)
    out = self.fc3(out)
    return out

定义第二个模型

class Model2(nn.Module): def init(self, input_dim, hidden_dim, output_dim): super(Model2, self).init() self.fc1 = nn.Linear(input_dim, hidden_dim) self.fc2 = nn.Linear(hidden_dim, output_dim) self.dropout = nn.Dropout(p=0.5)

def forward(self, x):
    out = nn.functional.relu(self.fc1(x))
    out = self.dropout(out)
    out = self.fc2(out)
    return out

定义损失函数和优化器

criterion1 = nn.CrossEntropyLoss() criterion2 = nn.BCEWithLogitsLoss() optimizer1 = optim.Adam optimizer2 = optim.Adam

定义超参数搜索空间

space = { 'hidden_dim1': hp.quniform('hidden_dim1', 64, 256, 1), 'hidden_dim2': hp.quniform('hidden_dim2', 32, 128, 1), 'lr1': hp.loguniform('lr1', -5, -2), 'lr2': hp.loguniform('lr2', -5, -2) }

定义目标函数

def objective(params): # 初始化模型 input_dim = num_features hidden_dim1 = int(params['hidden_dim1']) hidden_dim2 = int(params['hidden_dim2']) output_dim1 = 4 output_dim2 = 1 model1 = Model1(input_dim, hidden_dim1, output_dim1) model2 = Model2(output_dim1, hidden_dim2, output_dim2)

# 定义优化器
optimizer1 = optim.Adam(model1.parameters(), lr=params['lr1'])
optimizer2 = optim.Adam(model2.parameters(), lr=params['lr2'])

# 训练第一个模型
num_epochs1 = 2000
for epoch in range(num_epochs1):
    model1.train()
    optimizer1.zero_grad()
    outputs = model1(x_train)
    loss = criterion1(outputs, y_train)
    loss.backward()
    optimizer1.step()

# 训练第二个模型
num_epochs2 = 1000
for epoch in range(num_epochs2):
    model2.train()
    optimizer2.zero_grad()
    inputs = model1(x_train)
    outputs = model2(inputs)
    loss = criterion2(outputs, y_train.float().unsqueeze(1))
    loss.backward()
    optimizer2.step()

# 计算准确率
model1.eval()
model2.eval()
inputs = model1(x_train)
outputs = model2(inputs)
predicted = outputs.ge(0.5).view(-1).long()
accuracy = (predicted == y_train).sum().item() / y_train.size(0)

return -accuracy

进行超参数优化

trials = Trials() best = fmin(fn=objective, space=space, algo=tpe.suggest, max_evals=100, trials=trials) print(best)

HIV 预测模型:基于贝叶斯优化的神经网络模型

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

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