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

Keras model.evaluate与sklearn roc_auc_score结果差异原因咨询

Keras AUC与sklearn roc_auc_score结果差异的原因及解决方法

1. 错误使用硬分类标签计算ROC AUC

sklearn的roc_auc_score在二分类任务中,需要输入模型输出的连续概率值(即sigmoid层输出的0-1区间数值),而不是通过np.round(pred)得到的离散0/1分类标签。

硬分类标签丢失了ROC曲线所需的阈值信息,会导致计算出的AUC失去统计意义,甚至出现低于0.5的不合理结果(本质是模型预测方向与标签不匹配,或信息丢失)。

正确的sklearn计算方式:

from sklearn.metrics import roc_auc_score

pred = model.predict(test_generator, verbose=0)
# 直接使用模型输出的概率值,无需round处理
roc_auc_score(test_generator.classes, pred)

2. 测试生成器样本顺序与标签不匹配

若测试生成器开启了shuffle=True,即便调用test_generator.reset(),model.predict返回的预测结果顺序也可能与test_generator.classes的原始标签顺序不一致——因为生成器迭代时会打乱样本,而test_generator.classes存储的是数据集的原始标签顺序。

解决方式:

  • 创建测试生成器时设置shuffle=False(评估阶段无需打乱样本);
  • 或手动遍历生成器,同步收集标签与预测结果:
true_labels = []
predictions = []
test_generator.reset()
for _ in range(len(test_generator)):
    x_batch, y_batch = next(test_generator)
    pred_batch = model.predict(x_batch, verbose=0)
    true_labels.extend(y_batch)
    predictions.extend(pred_batch)

roc_auc_score(true_labels, predictions)

3. 验证预测与标签的方向一致性

若修正后结果仍异常,需确认模型输出概率对应的类别是否与标签一致。比如模型输出的是“类别0”的概率,但test_generator.classes中1对应目标类别,此时会导致AUC反转(低于0.5)。可尝试反转预测值后计算:

roc_auc_score(test_generator.classes, 1 - pred)

补充说明

Keras内置的AUC指标与sklearn的roc_auc_score逻辑一致,均基于预测概率和真实标签计算。只要输入格式、样本顺序匹配,两者结果应基本一致。

内容的提问来源于stack exchange,提问作者Mario Lozano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:05:16