如何选择区分不同类别的最佳阈值?

数据挖掘 Python 分类 喀拉斯 评估 混淆矩阵
2022-02-19 13:36:08

我已经训练了一个网络来查找两个图像之间的相似性。测试数据集包含相同数量的相似和不相似样本。每个班级大约有。13822 个样本。

我尝试了不同的阈值,例如,在网络的最后一层我使用了 sigmoid 激活函数,因此输出在 [0,1] 之间。

我测试了阈值,例如从 0.5 到 0.9(例如,如果预测分数大于 0.5/0.6/,....,/0.9,则将其视为正样本,否则视为负样本)。

基于这个策略,我得到了以下结果:

Threshold   TP  TN  FP  FN  Accuracy    Precision   Recall  F1
0.5 --> 12570   13804   18  1252    0.95    1.00    0.91    0.95
0.6 --> 12115   13813   9   1707    0.94    1.00    0.88    0.93
0.7 --> 11451   13819   3   2371    0.91    1.00    0.83    0.91
0.8 --> 10124   13822   0   3698    0.87    1.00    0.73    0.85
0.9 --> 5132    13822   0   8690    0.69    1.00    0.37    0.54

我感兴趣的是根据某种区分正负类的方法找到最佳阈值。

1个回答

按输出值对所有实例进行排名。然后对于每个实例(或者对于每个不同的输出值,如果许多实例具有相同的值),考虑阈值是该实例的输出值,计算性能(精度、召回率、f-score)。为所有实例完成此操作后,您可以绘制 f 分数图作为阈值的函数以获得良好的视觉效果,或者简单地选择与最大性能相对应的阈值。

作为记录,这也是手动构建ROC 曲线的方式。

顺便说一句,您的最佳阈值肯定低于 0.5,因为您的精度在 0.5 时为 1.0,但您可能仍然可以增加召回率。