不使用sklearn为MNIST数据集构建混淆矩阵的技术实现问询
手动构建MNIST混淆矩阵(不依赖sklearn)
核心思路
混淆矩阵是一个10×10的矩阵,行代表真实标签,列代表预测标签,每个位置的数值对应「真实为某类、预测为某类」的样本数量。我们只需要初始化一个全零矩阵,在遍历测试集时实时更新对应位置的计数即可。
修改后的完整代码
import numpy # 初始化10x10的混淆矩阵,元素类型为整数(对应0-9十个数字类别) confusion_matrix = numpy.zeros((10, 10), dtype=int) scorecard = [] # 遍历测试数据集的所有记录 for record in test_data_list: # 按逗号分割记录 all_values = record.split(',') # 提取真实标签(第一个值) correct_label = int(all_values[0]) # 缩放并偏移输入数据,适配神经网络输入范围 inputs = (numpy.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01 # 用训练好的网络获取预测输出 outputs = n.query(inputs) # 获取预测标签(输出节点中概率最大值的索引) label = numpy.argmax(outputs) # 更新混淆矩阵:真实标签对应行,预测标签对应列,计数+1 confusion_matrix[correct_label][label] += 1 # 记录单条样本的分类结果(正确/错误) scorecard.append(1 if label == correct_label else 0) # 打印混淆矩阵 print("混淆矩阵:") print(confusion_matrix) # 计算并输出准确率(两种方式均可,结果一致) # 方式1:用scorecard计算 scorecard_array = numpy.asarray(scorecard) print(f"准确率: {scorecard_array.sum() / scorecard_array.size:.4f}") # 方式2:用混淆矩阵对角线元素求和计算 correct_total = numpy.trace(confusion_matrix) total_samples = confusion_matrix.sum() print(f"准确率(混淆矩阵计算): {correct_total / total_samples:.4f}")
矩阵解读
- 对角线元素
confusion_matrix[i][i]:真实标签为i且预测正确的样本数量,所有对角线元素之和是总正确分类数。 - 非对角线元素
confusion_matrix[i][j](i≠j):真实标签为i但被错误预测为j的样本数量,数值越高说明模型越容易混淆这两个类别。
内容的提问来源于stack exchange,提问作者avezee
相关产品推荐
相关产品推荐

