3 回答
TA贡献1784条经验 获得超7个赞
我让它工作了。我所要做的就是将获得的 preds 的数据类型preds = classifier.predict(test_set)
与我获得的 true_labels 相匹配labels = test_set
。Preds 基本上是一个 numpy.ndarray 包含具有 np.float32 值的单个元素列表。将标签转换为相同的格式和形状使 roc_curve 正常工作。
此外,我必须添加第三个变量阈值,fpr, tpr, threshold = roc_curve(true_labels, preds)
因此不会弹出 ValueError: too many values to unpack 错误。
TA贡献1843条经验 获得超7个赞
实际上,如果查看 sklearn.metrics.roc_curve 的文档(以及几乎每个 sklearn 指标),他们不会将模型(图像)的输入作为参数,它只需要真实标签和预测标签。因此,在您对测试集进行推断之后,在 keras 中(这里我只是猜测)类似于
preds = classifier.predict(batch)
您将 roc_curve 称为
fpr, tpr = roc_curve(true_labels,preds)
可能你必须改变类型,因为它们是张量。
编辑:我已经检查了 keras 文档flow_from_directory
并产生了一个迭代器,(x,y) = (images,labels)
所以如果你想做某种训练后分析,你应该使用这样的东西来获取标签:
labels = [] for _,y in test_set: labels.extend(list(y))
如果您只有两个类,请将 class_mode 更改为binary
TA贡献2037条经验 获得超6个赞
要计算 ROC AUC,您需要分数,而不是最终分类/决策的结果。
classifier.add(Dense(units = 2, activation = 'softmax'))
由于您的模型有一个以两个神经元( 所以,你不能将它与 softmax 一起使用。
您可以用一个神经元和 sigmoid 替换您的 2 个神经元和 softmax。然后,roc_curve
在二元分类问题中使用是安全的。
还有另一个名为roc_auc_score
的函数,它具有multi_class
将多类分类问题转换为多个二元问题的参数。例如,auc_roc = roc_auc_score(labels, classifier.predict(...), multi_class='ovr')
。但是,这只会返回 AUC 分数,它不能帮助您绘制 ROC 曲线。
添加回答
举报