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显然不现实,因此可以使用类似这个实例的方法,分批计算。