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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:41:45