【问题标题】:Tensorflow 1.4 tf.metrics.auc for AUC calculationTensorflow 1.4 tf.metrics.auc 用于 AUC 计算
【发布时间】:2018-06-18 20:24:15
【问题描述】:

我正在尝试在模型的训练时间期间记录AUC

根据documentationtf.metric.auc需要labelpredictions,两者的形状相同。

但在我的二进制分类中,label 是一个一维张量,只包含类。 prediction二维,包含每个数据点的每个类别的概率。

这种情况下如何计算AUC

【问题讨论】:

  • 你没有试过用tf.argmax从概率中获取实际预测吗?
  • 据我了解,为了计算 AUC,您需要知道所有类的概率,而不仅仅是具有最大概率的类。正确的 ?在 Binary Classifier 中,你可以计算其他类的概率,但在 MultiClass 中不能。
  • 你是对的,我的错。您可能想要获取“正”类的概率:prob[:, 1]
  • 所以我没有只传递labels,而是将其转换为tf.one_hot,从而将其维度更改为[batch * n_classes]。现在概率也是[batch * n_classes]。 AUC 给出了一些价值,但不确定它是否正确:/
  • 这听起来不对。您是否尝试过转换二维概率张量?

标签: python tensorflow auc


【解决方案1】:

我们看一下函数tf.metrics.auc中的参数:

  • labels:形状与预测匹配的张量。将被转换为bool
  • predictions:任意形状的浮点张量,其值在[0, 1]范围内。

此操作已假定为二进制分类。也就是说,labels 中的每个元素都说明了该类对于单个样本是“正面”还是“负面”。它不是一个 1-hot 向量,它需要一个包含与独占类数量一样多的元素的向量。

同样,predictions 表示具有一定程度确定性(有些人可能称之为概率)的预测二元类,并且每个元素也应该引用一个样本。它不是一个 softmax 向量。

如果概率来自具有 2 个神经元的全连接层和网络头部的 softmax 激活的神经网络,请考虑将其替换为单个神经元和 sigmoid 激活。现在可以将输出直接馈送到tf.metrics.auc

否则,您可以只对预测张量进行切片以仅考虑正类,这将同样表示二元类:

auc_value, auc_op = tf.metrics.auc(labels, predictions[:, 1])

【讨论】:

  • 您是否建议始终传递Class==1 的概率,而不考虑标签?
  • @random_28 因为我们正在处理二进制分类,p(Class = 0) 的概率无论如何应该是1 - p(Class = 1)。这里不需要类为负的概率。
  • 我明白,但没有提到通过p(Class = 1)。 :/我们如何确认?因为如果我们将 p(Class= label[i]) 传递给 ith 数据点,这也会起作用。怎么说?
  • 那是因为接口已经假定预测是二元分类。 ROC 曲线是通过在这些值上应用多个阈值来构建混淆矩阵来计算的。除非您正在处理多类分类,否则使用p(Class = 1) 就可以了。另请注意,您可以改为使用tf.contrib.metrics.streaming_curve_points 构建整个 ROC 曲线并亲自查看结果。
猜你喜欢
  • 2012-05-11
  • 2021-09-18
  • 1970-01-01
  • 2021-10-07
  • 2019-12-29
  • 1970-01-01
  • 2019-06-16
  • 2011-06-21
  • 2014-08-07
相关资源
最近更新 更多