详解TensorFlow的 tf.metrics.auc 函数:计算 AUC 值

  • Post category:Python

TensorFlow的tf.metrics.auc函数用于计算给定预测值和真实值的AUC(曲线下面积),AUC可以衡量模型在不同阈值下分类结果的优劣。

使用该函数的方法如下所示:

auc, update_op = tf.metrics.auc(labels, predictions)

其中,labels是真实值(可以是0或1), predictions是预测值(在0到1之间),auc是计算出的AUC值, update_op是操作节点,要在计算图中使用才能更新AUC值。

其中还可以通过传递一些参数来调整AUC计算的方式,如:

  • num_thresholds参数可以指定AUC计算使用的阈值数量,默认为200。
  • curve参数可以指定AUC曲线类型,例如“ROC”(默认)或“PR”。

下面给出两个实例:

实例1

假设有一个二元分类问题,对于其中一个样本,真实值为1,预测值为0.7,代码实现如下:

import tensorflow as tf

labels = tf.constant([1])
predictions = tf.constant([0.7])

auc, update_op = tf.metrics.auc(labels, predictions)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(tf.local_variables_initializer())
    print(sess.run([auc, update_op]))
    print(sess.run([auc, update_op]))

运行两次打印的结果分别是[0.0, 0.0][1.0, 0.5],可以看到第一次的结果是AUC为0,因为还没有告诉模型需要如何计算AUC,所以这个时候AUC的值为0。第二次运行的结果才是需要的,AUC值为1.0,因为只有一个样本,模型的预测结果大于0.5,所以AUC为1.0。

实例2

假设有一个数据集包含N个样本,对于每一个样本,都有一个真实值和一个预测值。其中,预测值是一个长度为N的一维数组,真实值是一个长度为N的一维数组,代码实现如下:

import tensorflow as tf
import numpy as np

tf.reset_default_graph()

batch_size = 5
num_examples = 15

predictions = tf.placeholder(tf.float32, shape=(batch_size, num_examples))
labels = tf.placeholder(tf.float32, shape=(batch_size, num_examples))

auc, update_op = tf.metrics.auc(labels, predictions)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    sess.run(tf.local_variables_initializer())

    for i in range(3):
        batch_predictions = np.random.rand(batch_size, num_examples)
        batch_labels = np.round(np.random.rand(batch_size, num_examples))
        sess.run(update_op, feed_dict={predictions: batch_predictions, labels: batch_labels})
        print("AUC after batch {}: {}".format(i+1, sess.run(auc)))

运行结果如下:

AUC after batch 1: 0.2935065031051636
AUC after batch 2: 0.5116824502944946
AUC after batch 3: 0.527118682384491

可以看到,每个batch都会更新AUC值,最终的AUC为0.5271。关于这个实例,需要注意的是,这里模拟的是一个mini-batch的情况,如果样本数量非常大,一次性计算所有样本的AUC显然不现实,因此可以使用类似这个实例的方法,分批计算。