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

基于Keras的CNN模型无法获取准确率及绘制ROC曲线求助

错误原因
  • 直接原因:roc_curve 要求输入数组类型的真实标签,你传入的 test_set 是Keras的DirectoryIterator迭代器对象,不符合输入要求
  • 次要问题:你的模型用2类softmax输出,返回的预测结果是形状为(样本数, 2)的概率矩阵,无法直接输入roc_curve计算,需要提取正类的单维概率
修复方案

1. 提取真实标签与正类预测概率

确保测试集生成器的shuffle参数为默认值False(否则预测结果顺序和标签顺序不匹配),执行以下代码:

import numpy as np
from sklearn.metrics import roc_curve, auc, accuracy_score

# 提取测试集真实标签数组
y_true = test_set.classes
# 提取正类(类别索引为1的类别)预测概率
y_pred_pos = classifier.predict(test_set)[:, 1]

2. 计算ROC曲线与AUC值

# 计算ROC曲线的假阳性率、真阳性率、阈值
fpr, tpr, thresholds = roc_curve(y_true, y_pred_pos)
# 计算AUC指标
roc_auc = auc(fpr, tpr)

3. 获取模型准确率

方法一:直接调用模型内置评估方法

# 返回值依次为测试集损失、测试集准确率
test_loss, test_acc = classifier.evaluate(test_set, verbose=0)
print(f"测试集准确率:{test_acc:.4f}")

方法二:手动基于预测结果计算

# 把概率转为预测类别
y_pred = np.argmax(classifier.predict(test_set), axis=1)
# 计算准确率
acc = accuracy_score(y_true, y_pred)
print(f"手动计算测试集准确率:{acc:.4f}")
优化建议

你当前是二分类任务,可以调整模型配置简化后续处理:

  • 输出层改为Dense(units = 1, activation = 'sigmoid')
  • 损失函数改为binary_crossentropy
  • 训练/测试生成器的class_mode改为'binary'
    调整后预测结果直接返回正类概率,无需额外切分维度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 07:09:03