我正在努力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
答案 0 :(得分:1)
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]
...