Keras使用validation_split后如何可视化混淆矩阵
如何基于Keras自动划分的验证集绘制混淆矩阵
我明白你的情况——训练时用了validation_split=0.2让Keras自动划分验证集,没有单独准备测试集,现在想画混淆矩阵评估模型表现。其实完全可以用Keras划分出的那20%验证集来做这件事,下面是具体步骤:
第一步:加载训练好的模型
首先得把你保存的最优权重加载到模型里。如果之前是用ModelCheckpoint保存的整个模型(包括结构和权重),直接用load_model就行;如果只保存了权重,得先重新定义模型结构,再加载权重:
from tensorflow.keras.models import load_model # 加载完整模型(假设你的hdf5文件是完整模型) model = load_model('your_checkpoint_filename.hdf5') # 如果只保存了权重,先定义模型结构,再加载: # model = your_model_definition() # 替换成你当初定义模型的代码 # model.load_weights('your_checkpoint_filename.hdf5')
第二步:复现Keras的验证集划分
Keras的validation_split=0.2默认会先打乱数据(shuffle=True),再取最后20%作为验证集。要复现这个划分,我们可以手动做同样的操作:
import numpy as np # 先打乱数据,和训练时的shuffle行为一致 indices = np.arange(X.shape[0]) np.random.shuffle(indices) X_shuffled = X[indices] Y_shuffled = Y[indices] # 取最后20%作为验证集 val_size = int(0.2 * X_shuffled.shape[0]) X_val = X_shuffled[-val_size:] Y_val = Y_shuffled[-val_size:]
如果训练时你设置了shuffle=False,那直接取原始数据的最后20%就行,不用打乱。
第三步:用模型预测验证集结果
接下来用模型对验证集做预测,把概率转换成类别标签(根据你的分类类型调整):
# 预测验证集的概率 Y_pred = model.predict(X_val) # 处理预测结果: # 多分类问题(Y是one-hot编码):把概率转成类别索引 Y_pred_classes = np.argmax(Y_pred, axis=1) Y_true_classes = np.argmax(Y_val, axis=1) # 二分类问题(Y是0/1或者one-hot):用阈值(比如0.5)转成类别 # Y_pred_classes = (Y_pred > 0.5).astype(int) # Y_true_classes = Y_val if Y_val是0/1格式,否则用np.argmax(Y_val, axis=1)
第四步:计算并绘制混淆矩阵
用sklearn的混淆矩阵工具计算,再用seaborn和matplotlib可视化:
from sklearn.metrics import confusion_matrix import seaborn as sns import matplotlib.pyplot as plt # 计算混淆矩阵 cm = confusion_matrix(Y_true_classes, Y_pred_classes) # 绘制可视化图 plt.figure(figsize=(10, 8)) # 替换your_class_labels为你的实际类别名称,比如['猫', '狗', '鸟']或者['class0', 'class1'] sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=your_class_labels, yticklabels=your_class_labels) plt.xlabel('预测类别') plt.ylabel('真实类别') plt.title('混淆矩阵') plt.show()
一些注意事项
- 这里用的是验证集的结果,因为你没有独立测试集,这是目前最合理的选择。但要注意,模型训练过程中已经见过验证集的数据(用来调整训练策略),所以这个结果会比独立测试集的表现略好一点。如果条件允许,最好还是收集一批完全未见过的测试数据来评估,结果会更客观。
- 如果训练时你设置了
random_state或者固定了随机种子,记得在手动打乱数据时也用相同的种子,这样划分出的验证集会和训练时完全一致。
内容的提问来源于stack exchange,提问作者Shlomi Schwartz
相关产品推荐
相关产品推荐

