训练期间不同阈值的 Keras P/R 指标

数据挖掘 喀拉斯 张量流
2022-02-26 07:59:05

我正在训练一个二元分类器,我希望看到不同阈值的 Precision/Recall 指标。

Tensorflow 2.3 引入了tf.keras.metrics.Precisiontf.keras.metrics.Recall,它们带有一个thresholds参数,您可以在其中指定一个或多个要计算指标的阈值。这一切都像宣传的那样工作,即

m = tf.keras.metrics.Precision(thresholds=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6])
m.update_state([0, 1, 0, 1], [0.4, 0.5, 0.3, 0.8])
m.result().numpy()

[0.5, 0.5, 0.6666667, 1., 1., 1.]根据文档,返回每个阈值的精度值。

但是,当作为指标传递给Model.compile我时,无论我有多少阈值,我都会得到一个指标。


pr_thresholds = list(np.arange(0.05, 0.95, 0.05))
model.compile(
    'adam',
    'binary_crossentropy',
    metrics=[ 
        keras.metrics.Precision(thresholds=pr_thresholds),
        keras.metrics.Recall(thresholds=pr_thresholds),
    ]
)

我明白了

Epoch 34/50
395/395 [==============================] - 22s 54ms/step - loss: 0.4314 - precision: 0.7886 - recall: 0.9008 - val_loss: 0.5113 - val_precision: 0.7434 - val_recall: 0.8769

这里发生了什么事 ?在这种情况下,它总是使用默认阈值 0.5 吗?

有没有办法让它在训练期间显示多个阈值的值?

1个回答

如果您为每个阈值显式实例化相应的度量类,则可以在拟合过程中看到每个阈值的度量值,如下所示:

model.compile(
optimizer=keras.optimizers.Adam(learning_rate=1e-2),
loss='categorical_crossentropy',
metrics=[metrics.Recall(thresholds=0.6), 
         metrics.Recall(thresholds=0.9)])

model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))

正如您在下图中看到的那样,对于每个时期,您可以看到第一个召回值(阈值为 0.6)高于预期的第二个(阈值 0.9):

在此处输入图像描述

对于您的情况,以编程方式构建指标对象列表,您现在可以在其中看到每个时期 3 次召回:

thresholds = [0.6, 0.7, 0.9]
metrics_objs_list=[metrics.Recall(thresholds=thr) for thr in thresholds]

在此处输入图像描述