【问题标题】:how to interpret a probability predictions of a deep learning model that is an output of a sigmoid activation of last layer?如何解释作为最后一层 sigmoid 激活输出的深度学习模型的概率预测?
【发布时间】:2020-06-25 09:51:40
【问题描述】:

我已经训练了一个二元分类任务(pos. vs. neg.)并且有一个.h5 模型。而且我有外部数据(从未用于培训或验证)。总共有 20 个样本属于这两个类别。

preds = model.predict(img)
y_classes = np.argmax(preds , axis=1)

如果使用 softmax 作为最后一个输出层进行训练,上面的代码应该计算概率(preds)和类标签(0 或 1)。但是,preds 只是 [0;1] 之间的单个数字,y_classes 始终为 0。

稍微回顾一下,该模型使用平均 AUC 进行评估,面积约为 0.75。 我可以看到这 20 个样本的概率大部分 (17) 介于 0 - 0.15 之间,其余的分别是 0.74、0.51 和 0.79。

我如何由此得出结论?

编辑: 用于测试模型的 20 个样本中有 10 个属于正类,另外 10 个属于负类。属于 pos 的所有 10 个。类的概率非常低(0 - 0.15)。 10 个负类中有 7 个具有相同的低概率,只有 3 个是(0.74、0.51 和 0.79)。

问题:为什么模型在 AUC 相当高的情况下以如此低的概率预测样本?

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    sigmoid 激活函数用于生成二进制分类问题的概率。在这种情况下,模型输出一个概率数组,其形状等于要预测的图像长度。我们可以简单地检查概率分数来检索预测的类......如果它高于 0.5(这是一种常见的做法,但你也可以根据需要更改它)图像属于 1 类,否则它属于 0 类。

    preds = model.predict(img) # (n_images, 1)
    y_classes = ((pred > 0.5)+0).ravel() # (n_images,)
    

    如果是 sigmoid,你的最后一个输出层必须是Dense(1, activation='sigmoid')

    在 softmax 的情况下(正如您刚刚所做的那样),使用 argmax 检索预测的类

    preds = model.predict(img) # (n_images, n_class)
    y_classes = np.argmax(preds , axis=1)  # (n_images,)
    

    如果是softmax,你的最后一个输出层必须是Dense(n_classes, activation='softmax')

    为什么 AUC 不是一个好的指标

    AUC 的值可能会产生误导,并可能导致我们有时高估有时低估模型的实际性能。 Average-Precision 的行为在了解模型的表现方面更具表现力,因为它在区分好模型和非常好的模型方面更明智。此外,它与精度直接相关:人类可以理解的指标 这里有一个很好的参考,可以解释你需要的所有主题:https://towardsdatascience.com/why-you-should-stop-using-the-roc-curve-a46a9adc728

    【讨论】:

      【解决方案2】:

      通过使用sigmoid function 作为激活函数,您基本上是在将先前层的输出“压缩”为从 0 到 1 的概率值。

      Softmax 函数只是采用一系列 sigmoid 函数,将它们聚合并显示特定类概率与所有类的所有聚合概率之间的比率。

      例如:如果我使用模型来预测图像是香蕉、苹果还是葡萄的图像,并且我的模型识别出某个图像是 0.75 个香蕉、0.20 个苹果和 0.15 个葡萄(每个概率是使用 sigmoid 函数生成),我的 softmax 层将进行此计算:

      香蕉:0.75 / (0.75 + 0.20 + 0.15) = 0.6818 && 苹果:0.20 / 1.1 = 0.1818 && 葡萄:0.15 / 1.1 = 0.1364。

      正如我们所见,由于我们的 softmax 层,该模型会将这张特定图片分类为香蕉图片。然而,为了进行这种分类,它事先使用了一系列 sigmoid 函数。

      所以,如果我们终于说到点子上了,我会说 sigmoid 函数输出的解释应该类似于你使用 softmax 层所做的解释,但是 softmax 层可以让你比较一个类到另一个类,sigmoid 函数只是告诉你这条信息属于正类的可能性有多大。

      为了做出最终决定并决定某个项目是否属于正类,您需要选择一个阈值(不一定是 0.5)。选择阈值是输出解释的最后一步。如果你想最大化模型的精度,你会选择一个高阈值,但如果你想最大化你的模型的召回率,你绝对可以选择一个较低的阈值。

      我希望它能回答你的问题,如果你想让我详细说明任何事情,请告诉我,因为这个答案很笼统。

      【讨论】:

      • 感谢您的反馈。 1. 你的概率分布是错误的。 2.我已经知道这两个函数是什么意思了。 3. 20 个样本中有 17 个表明概率甚至没有达到 0.2,这意味着它失败了。只有 3 个超过 0.5(例如,假设的阈值是 0.5),也就是说,就模糊准确度而言,准确率为 15%。平均 AUC 在 0.75 左右时怎么可能?
      猜你喜欢
      • 2020-12-30
      • 2021-09-28
      • 2019-05-04
      • 2017-03-15
      • 2019-11-30
      • 2017-08-09
      • 1970-01-01
      • 2018-09-16
      • 2020-05-27
      相关资源
      最近更新 更多