tf.keras.metrics.SpecificityAtSensitivity num_thresholds 解释

Dom*_*ack 4 python keras tensorflow

我正在尝试了解tf.keras.metrics.SensitivityAtSpecificity。我对单独的敏感性和特异性的概念很满意,但我不确定这两者在这个单一指标中是如何相关的。

更具体地说,我不确定如何解释这个num_thresholds论点。文档中的示例有num_thresholds=1. 使用相同的输入数据设置num_thresholds大于 1 似乎总是返回指标值 1.0。

def print_metric_value(num_thresholds):
    # other values based on docs example
    m = tf.keras.metrics.SensitivityAtSpecificity(
        0.4, num_thresholds=num_thresholds)
    m.update_state([0, 0, 1, 1], [0, 0.5, 0.3, 0.9])
    print('Result with num_thresholds = %d: %.1f' %
          (num_thresholds, m.result().numpy()))

print_metric_value(1)    # 0.5 - same as docs
print_metric_value(2)    # 1.0
print_metric_value(200)  # 1.0
Run Code Online (Sandbox Code Playgroud)

tod*_*day 5

num_thresholds的是阈值的数量。但您可能会问:(在这种情况下)阈值是什么?答案是,阈值在 [0,1] 范围内,实际上是所有大于该阈值的预测将被视为正值(即 1),所有低于该阈值的预测将被视为正值。负数(即0)。

例如,考虑预测向量,[0, 0.5, 0.3, 0.9]它实际上是置信度分数(例如概率)。现在,如果我们应用 的阈值0.1,我们会得到[0, 1, 1, 1];或者如果我们应用0.6我们得到的阈值[0, 0, 0, 1](即只有最后预测的置信度高于0.6)。

现在假设您想要以固定的灵敏度监测特异性的变化。指标的SensitivityAtSpecificity作用是,为了计算灵敏度的值,它首先计算不同阈值的特异性,然后选择与您提供的特异性值最接近的特异性的阈值(例如,在您给出的问题中0.4)特异性值)。然后在该阈值计算灵敏度并将作为该指标的值返回。同样的事情也适用于SpecificityAtSensitivity度量,只需交换本段中的“特异性”和“敏感性”即可。

您可能还会问:阈值是多少?答案是如果num_thresholds=1那么唯一的阈值是 0.5。那么num_thresholds > 1,除了0和1作为阈值之外,还将区间(0,1)分割成num_thresholds - 1相等的子区间,并选择分割点作为附加阈值。例如:

num_threshold  |  thresholds
=============================
1              | [0.5]
2              | [0, 1]
3              | [0, 0.5, 1]
4              | [0, 0.33, 0.66, 1]
5              | [0, 0.25, 0.5, 0.75, 1]
...
Run Code Online (Sandbox Code Playgroud)