训练阶段与后续评估的验证集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
相关产品推荐
相关产品推荐

