首页 > 解决方案 > 如何解释作为最后一层 sigmoid 激活输出的深度学习模型的概率预测?

问题描述

我已经训练了一个二元分类任务(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 相当高?

标签: pythontensorflowmachine-learningkerasdeep-learning

解决方案


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 -曲线-a46a9adc728


推荐阅读