设置multi_label=True时,tf.keras.metrics.AUC为何返回0?
tf.keras.metrics.AUC(multi_label=True)为何返回0.0而非1.0?
我在研究tf.keras.metrics.AUC(multi_label=True)的工作机制,根据文档,它会单独计算每个类别的AUC再取平均值。但在下面的测试案例中,当预测值和真实值完全相同时,结果却是0.0,而不是预期的1.0:
y_true = [ [1, 0, 0, 0, 1], ] acc = tf.keras.metrics.AUC(multi_label=True, num_labels=5) acc.reset_state() acc.update_state(tf.constant(y_true), tf.constant(y_true)) acc.result().numpy() >>> 0.0
问题原因
问题出在单个样本无法有效计算AUC。AUC的核心是衡量模型对正负样本的排序能力,它要求每个类别至少同时存在正例和负例,或者有多个样本能形成排序对比。
在你的测试中,每个类别仅对应1个样本:
- 类别0和类别4是正样本(标签1),但没有对应的负样本;
- 类别1、2、3是负样本(标签0),但没有对应的正样本。
对于这类只有单一样本的类别,TensorFlow无法计算出有效的AUC值,会默认将该类别的AUC贡献设为0。5个类别的AUC平均值自然就是0.0。
修正后的测试案例
如果添加多组样本,让每个类别都包含正例和负例,就能得到预期的1.0结果:
y_true = [ [1, 0, 0, 0, 1], [0, 1, 0, 1, 0] ] acc = tf.keras.metrics.AUC(multi_label=True, num_labels=5) acc.reset_state() acc.update_state(tf.constant(y_true), tf.constant(y_true)) print(acc.result().numpy()) >>> 1.0
内容的提问来源于stack exchange,提问作者rodrigo-silveira
相关产品推荐
相关产品推荐

