accuracy = (torch.abs(output[test_mask].float() - drug_graph_label[test_mask].float()) < eps).sum() / (drug_graph_label[test_mask].shape[0]) print("Epoch [{}/{}], train loss: {:.4f}, test accuracy: {:.4f}".format(epoch + 1, epochs, loss.item(), accuracy))调用sklearn.metrics 中的 r2_score 将这段代码的accuracy的指标改写成R平方
时间: 2023-12-03 08:44:26 浏览: 116
可以将代码改写如下:
```
from sklearn.metrics import r2_score
...
preds = output[test_mask].float().detach().numpy()
labels = drug_graph_label[test_mask].float().detach().numpy()
r2 = r2_score(labels, preds)
print("Epoch [{}/{}], train loss: {:.4f}, test R2 score: {:.4f}".format(epoch + 1, epochs, loss.item(), r2))
```
这里使用了 `detach()` 方法将输出张量从计算图中分离,然后使用 `.numpy()` 将其转换为 NumPy 数组。然后可以使用 `r2_score()` 函数计算 R 平方,最后输出结果。
相关问题
accuracy = (torch.abs(output[test_mask].float() - drug_graph_label[test_mask].float()) < eps).sum() / (drug_graph_label[test_mask].shape[0])解释一下
这段代码计算了一个分类任务的准确率,具体解释如下:
首先,`output` 是模型的预测结果,`drug_graph_label` 是对应的真实标签。 `test_mask` 是一个布尔类型的向量,用于选择测试集中的样本。`eps` 是一个非负数,用于控制误差的大小。
`torch.abs(output[test_mask].float() - drug_graph_label[test_mask].float()) < eps` 计算了预测值与真实标签之差的绝对值是否小于 `eps`,返回的结果是一个布尔类型的向量。然后,`.sum()` 操作对这个向量中为 `True` 的元素进行计数,得到了预测正确的样本数。最后,除以测试集中样本的总数,得到了准确率。
model = HetGraphSAGE(nfeat1=drug_feat_dim, nfeat2=protein_feat_dim, nhid=hidden_size, out_dim=drug_node, gamma=gamma) criterion = nn.MSELoss() # MSE损失函数 optimizer = optim.Adam(model.parameters(), lr=0.001, weight_decay=0.0001) # 优化器 drug_graph = (torch.ones_like(drug_graph.to_dense())).to_sparse() data = (drug_feat.float(), protein_feat.float(), drug_graph.float(), drug_protein_graph.float()) for epoch in range(epochs): model.train() # 模型在train模式 optimizer.zero_grad() # zero_grad 清除上一次的一些梯度 output = model(data) # forward loss = criterion(output[train_mask].float(), drug_graph_label[train_mask].float()) # 只计算Train节点的损失 # 测试模型准确率 accuracy = (torch.abs(output[test_mask].float() - drug_graph_label[test_mask].float()) < eps).sum() / (drug_graph_label[test_mask].shape[0]) r2_score = stats.linregress(output[test_mask].tolist(), drug_graph_label[test_mask].tolist()).rvalue ** 2 print("Epoch [{}/{}], train loss: {:.4f}, test accuracy: {:.4f}, r2_score: {:.4f}".format(epoch + 1, epochs, loss.item(), accuracy,r2_score)) loss.backward() optimizer.step() # test阶段 model.eval() # 不进行梯度优化 output = model(data) 把它改成用optuna调参,在valid_mask上调参,在test_mask上检验结果
好的,你可以使用 Optuna 进行参数调优。具体来说,你可以将 train_mask 划分为 train_mask 和 valid_mask,然后在 valid_mask 上进行调参,最后使用 test_mask 进行结果的检验。
首先,你需要安装 optuna:
```
pip install optuna
```
接下来,你需要定义一个函数,该函数将会被 Optuna 优化器调用,该函数的输入为 Optuna 的 Trial 对象,输出为一个 float 类型的值,表示该模型的性能。
```python
import optuna
def objective(trial):
hidden_size = trial.suggest_int('hidden_size', 32, 128)
gamma = trial.suggest_float('gamma', 0.1, 1.0)
lr = trial.suggest_float('lr', 1e-5, 1e-3, log=True)
weight_decay = trial.suggest_float('weight_decay', 1e-6, 1e-3, log=True)
model = HetGraphSAGE(nfeat1=drug_feat_dim, nfeat2=protein_feat_dim, nhid=hidden_size, out_dim=drug_node, gamma=gamma)
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=lr, weight_decay=weight_decay)
drug_graph = (torch.ones_like(drug_graph.to_dense())).to_sparse()
data = (drug_feat.float(), protein_feat.float(), drug_graph.float(), drug_protein_graph.float())
for epoch in range(epochs):
model.train()
optimizer.zero_grad()
output = model(data)
loss = criterion(output[train_mask].float(), drug_graph_label[train_mask].float())
# 只计算Train节点的损失
accuracy = (torch.abs(output[valid_mask].float() - drug_graph_label[valid_mask].float()) < eps).sum() / (drug_graph_label[valid_mask].shape[0])
loss.backward()
optimizer.step()
model.eval()
output = model(data)
# 在 test_mask 上计算 r2_score
r2_score = stats.linregress(output[test_mask].tolist(), drug_graph_label[test_mask].tolist()).rvalue ** 2
return r2_score
```
在定义好 objective 函数之后,你需要使用 Optuna 的 study 对象进行优化。这里我使用 TPE 算法进行优化。
```python
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)
```
最后,你可以打印出最佳参数和对应的 r2_score。
```python
print('Best trial:')
trial = study.best_trial
print(' Value: {:.4f}'.format(trial.value))
print(' Params: ')
for key, value in trial.params.items():
print(' {}: {}'.format(key, value))
```
注意,由于你需要将 train_mask 划分为 train_mask 和 valid_mask,因此训练集的大小会相应减小。因此,你需要考虑增加 epochs 的数量来保证模型的性能。
阅读全文