awslabs / dgl-lifesci

Python package for graph neural networks in chemistry and biology
Apache License 2.0
696 stars 144 forks source link

Question about the metric acc #194

Closed dywlkji closed 1 year ago

dywlkji commented 1 year ago

您好,我在使用examples/property_prediction/csv_data_configuration/classification_train.py时,在其中添加了关于指标acc的相关代码,片段如下:

`

  class AccScore(object):

      def __init__(self, mean=None, std=None):
          self.mask = []
          self.yp_list = []
          self.yt_list = []

          if (mean is not None) and (std is not None):
              self.mean = mean.cpu()
              self.std = std.cpu()
          else:
              self.mean = None
              self.std = None

      def update(self, yp, yt, mask):
          self.yp_list.append(yp.detach().cpu())
          self.yt_list.append(yt.detach().cpu())

      def acc_score(self):
          y_pr = torch.cat(self.yp_list, dim=0)
          y_pr = torch.sigmoid(y_pr)
          y_tr = torch.cat(self.yt_list, dim=0)
          scores = []
          output_pr = []
          for x in y_pr:
              if x > 0.5:
                  output_pr.append(1)
              else:
                  output_pr.append(0)
          scores.append(accuracy_score(y_tr,output_pr))
          return scores

      def compute_metric(self, metric_name, reduction='mean'):
          if metric_name == 'acc':
              return self.acc_score()

`

但是在看到指标结果时,数值不符合预期(明显偏低,有通过其他工具做对比),因为是偏生物的初学者,研究许久也无法定位问题所在,想请求您的帮助

调用语句:

**train_meter = Meter()**
acc_train_meter = AccScore()
...........
**train_meter.update(prediction, labels, masks)**
acc_train_meter.update(prediction, labels, masks)
...........
**prc_score = np.mean(train_meter.compute_metric('pr_auc_score'))** 
acc_score = np.mean(acc_train_meter.compute_metric('acc'))
mufeili commented 1 year ago
  1. accuracy_score是哪里来的?你自己写的吗?
  2. 会不会你的代码里有地方已经用过一遍torch.sigmoid了?
dywlkji commented 1 year ago

感谢您的答复 1、对的 因为修改Meter类不太便于后面迁移 我就直接写在外层了 2、应该是没有的,因为我是仿照train_meter = Meter() 该类的结构写的,然后我看到您的train_meter.compute_metric('pr_auc_score')里面是针对入参做了torch.sigmoid处理,我这边也是同样的入参,那应该也是要做torch.sigmoid处理。然后结果就是,我处理后acc的值反而是0.17或者0.3这种结果,不处理的话就是正常的0.8XX的指标值。

我也怀疑过是不是做了处理,然后打印了部分张量结果看了下,里面有负值,那应该是没有处理的,所以就很苦恼。如果您有空的话,可以调用这个类试试,结构是一致的。

dywlkji commented 1 year ago

感谢您的答复 1、对的 因为修改Meter类不太便于后面迁移 我就直接写在外层了 2、应该是没有的,因为我是仿照train_meter = Meter() 该类的结构写的,然后我看到您的train_meter.compute_metric('pr_auc_score')里面是针对入参做了torch.sigmoid处理,我这边也是同样的入参,那应该也是要做torch.sigmoid处理。然后结果就是,我处理后acc的值反而是0.17或者0.3这种结果,不处理的话就是正常的0.8XX的指标值。

我也怀疑过是不是做了处理,然后打印了部分张量结果看了下,里面有负值,那应该是没有处理的,所以就很苦恼。如果您有空的话,可以调用这个类试试,结构是一致的。 忘记补充了 accuracy_score:from sklearn.metrics import accuracy_score

dywlkji commented 1 year ago
  1. accuracy_score是哪里来的?你自己写的吗?
  2. 会不会你的代码里有地方已经用过一遍torch.sigmoid了? 已经解决了 感谢!
mufeili commented 1 year ago
  1. accuracy_score是哪里来的?你自己写的吗?
  2. 会不会你的代码里有地方已经用过一遍torch.sigmoid了? 已经解决了 感谢!

最后是什么问题呢?

dywlkji commented 1 year ago
  1. accuracy_score是哪里来的?你自己写的吗?
  2. 会不会你的代码里有地方已经用过一遍torch.sigmoid了? 已经解决了 感谢!

最后是什么问题呢? 这里利用sigmod得到的正例概率来判断二分类应该是有问题的,我就改写为您下面这个样例方式了 dgl-lifesci/examples/property_prediction/ogbg_ppa/main.py

mufeili commented 1 year ago
  1. accuracy_score是哪里来的?你自己写的吗?
  2. 会不会你的代码里有地方已经用过一遍torch.sigmoid了? 已经解决了 感谢!

最后是什么问题呢? 这里利用sigmod得到的正例概率来判断二分类应该是有问题的,我就改写为您下面这个样例方式了 dgl-lifesci/examples/property_prediction/ogbg_ppa/main.py

了解了,谢谢。

XueZhe-Zachary commented 1 year ago

请问一下最后您是怎么解决的呢?如果不用sigmod得到的正例概率来判断二分类,那应该用什么呢 ?

dywlkji commented 1 year ago

参考:https://github.com/iPFAS/fu/blob/main/Examples/GAT.ipynb sigmod可以处理,我之前写法有点问题