You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

训练阶段与后续评估的验证集AUROC数值为何存在差异?

问题原因分析

导致auroc_val与训练最后一轮val_AUROC数值不一致的核心原因有两个:

  • AUC指标的direction参数自动判断误差
    Keras的tf.keras.metrics.AUC默认使用direction="auto",会根据输入样本自动推断预测值与正样本的相关性方向(比如预测值越高是否对应正样本概率越大)。但model.fit的batch_size仅控制训练数据的批次大小,验证数据默认batch_size为32,若验证集被拆分后的某个batch内正负样本分布极端(比如全是正样本或全是负样本),direction的自动判断会出错,导致整个验证阶段的AUC累积计算结果偏差。而手动计算时使用完整的测试集,正负样本齐全,direction判断准确,因此结果不同。

  • 流式计算与一次性计算的偏差放大
    验证阶段的AUC是分batch流式累积计算的,每个batch更新指标状态后再合并结果;而手动计算是一次性用全量测试数据计算AUC。虽然理论上两种方式结果应一致,但如果batch内样本分布不均,加上direction判断错误,会放大这种差异,甚至出现明显的数值偏差。

解决方法

显式指定direction参数为"increasing"(你的模型用sigmoid输出,预测值越高对应正样本概率越大),消除自动判断的误差:

修改模型编译部分:

model.compile(optimizer=Adam(learning_rate=0.1),
              loss="binary_crossentropy",
              metrics=[tf.keras.metrics.AUC(curve="ROC", name="AUROC", direction="increasing")])

手动计算部分同步调整为标准的指标计算流程:

auroc_metric = tf.keras.metrics.AUC(curve="ROC", name="AUROC", direction="increasing")
auroc_metric.update_state(y_test, model.predict(x_test).flatten())
auroc_val = auroc_metric.result().numpy()

这样修改后,两次计算的AUC数值就会一致。

内容的提问来源于stack exchange,提问作者Tobias Hermann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:28:10