如何在 TensorFlow 中计算 f1

数据挖掘 机器学习 张量流 准确性 公制 f1score
2021-10-11 03:00:54

我有一个计算准确性的代码,但现在我想计算 F1 分数。

accuracy_1 = tf.reduce_mean(tf.cast(tf.equal(
    tf.argmax(output_1, axis=-1),
    tf.argmax(y_1, axis=-1)), tf.float32), name="accuracy_1")
accuracy_2 = tf.reduce_mean(tf.cast(tf.equal(
    tf.argmax(output_2, axis=-1),
    tf.argmax(y_2, axis=-1)), tf.float32), name="accuracy_2")

如何计算上述代码的 F1 等效项?我发现这很困难,因为我对 TensorFlow 很陌生。

4个回答

TF Addons 计算F1 分数,更一般地计算FBeta 分数

在 tf 2.0+ 中:

f1 = 2*(tf.compat.v1.metrics.recall(labels, predictions) * tf.compat.v1.metrics.precision(labels, predictions)) / ( tf.compat.v1.metrics.recall(labels, predictions) + tf.compat.v1.metrics.precision(labels, predictions))

在以前的版本中,您可以使用 contrib.metrics 子模块(在 1.14 中已弃用):

tf.contrib.metrics.f1_score(labels, predictions)

F1 分数可以定义为自定义指标。Keras 将在适用的情况下在每个批次/时期评估此指标。

import keras.backend as K

def f1_metric(y_true, y_pred):
    true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))
    possible_positives = K.sum(K.round(K.clip(y_true, 0, 1)))
    predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1)))
    precision = true_positives / (predicted_positives + K.epsilon())
    recall = true_positives / (possible_positives + K.epsilon())
    f1_val = 2*(precision*recall)/(precision+recall+K.epsilon())
    return f1_val
    
    
model.compile(...,metrics=['accuracy', f1_metric])

要计算f1_score,首先,使用 python sklearn库的这个函数来生成混淆矩阵。之后,从混淆矩阵中,生成TPTNFPFN然后用它们计算:

Recall = TP/TP+FNPrecision = TP/TP+FP

然后从以上两个指标,你可以很容易地计算出:

f1_score = 2 * (precision * recall) / (precision + recall)

或者

你可以在这里使用同一个库的另一个函数来f1_score直接从生成的计算y_truey_pred如下所示:

F1 = f1_score(y_true, y_pred, average = 'binary')

最后,图书馆链接包含一个有用的解释。你应该仔细阅读它们。