调用Keras/TensorFlow的model.predict_classes()后如何获取预测准确率?
嘿,作为从ML.NET转过来的新手,我完全懂你想要直接拿到每个预测样本置信度的需求——那边的体验确实很直观!
首先得说:model.predict_classes()这个方法其实已经被TensorFlow/Keras弃用了(在TensorFlow 2.6及以后的版本里官方不再推荐),而且它本身的设计就是只返回预测类别的索引,不会给出对应的置信度(也就是你说的“准确率”)。要拿到每个预测结果的置信度,你需要换用model.predict()方法。
下面是具体的操作步骤:
1. 获取完整的概率分布
调用model.predict(data)会返回一个二维数组,形状是(样本数量, 类别数量),每一行代表一个样本在所有类别上的预测概率值(所有概率加起来等于1)。比如你有10张图片,分3类(自行车、汽车、行人),返回的数组就是(10, 3)的形状。
2. 推导预测类别(替代predict_classes)
如果需要和predict_classes()一样的类别索引结果,你可以对每个样本的概率数组取最大值对应的索引:
import numpy as np # 获取所有样本的概率分布 predict_probs = model.predict(data) # 得到每个样本的预测类别索引 predict_classes = np.argmax(predict_probs, axis=1)
3. 获取对应类别的置信度
要拿到每个预测类别的置信度(比如模型认为这张图是自行车的概率是60%),只需要取出每个样本概率数组中对应预测类别的那个值:
# 获取每个预测结果对应的置信度 confidences = predict_probs[range(len(predict_probs)), predict_classes]
举个实际的例子:如果predict_probs里某一行是[0.6, 0.3, 0.1],那么predict_classes会返回0(假设0是自行车的类别索引),对应的confidences就是0.6,也就是60%的置信度,和你在ML.NET里拿到的结果完全对应。
额外提示
如果你还在使用比较旧的TensorFlow版本,predict_classes()可能还能运行,但依然建议改用model.predict()的方式——因为前者只是封装了argmax的逻辑,直接丢弃了最有价值的概率分布信息,而后者能让你获取更完整的预测结果,方便后续的分析或处理。
内容的提问来源于stack exchange,提问作者eto123

