python - 如何解释作为最后一层 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 相当高?
解决方案
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
推荐阅读
- java - 休眠一对多关系:删除父级后无法删除子级
- sql - SQL Server:基于 JSON 更新表
- reverse-engineering - 为什么 'axt' 和 'aaa' 在 Radare 2 中不起作用?
- html - 如何使用 CSS Grid 布局获取带有粘性页眉和页脚的内容的滚动条?
- sass - 如何在 windows10 中使用“vscode live sass 编译器扩展”设置编译后的 css 文件的输出路径?
- django - 更新配置文件 Django 中所有用户的属性
- validation - 在单元格中使用动态范围和 Vlookup 公式进行数据验证以创建半自动列表
- javascript - jQuery / JS - 创建动态变量名
- javascript - 我想调用 data.json 文件中的对象
- ios - 错误线程 1:致命错误:在展开可选值时意外发现 nil?