如何在测试数据集上绘制模型的Loss、Accuracy等6项评估指标?
测试集多指标计算与绘图方案
核心思路
model.evaluate()仅能返回预设的少量指标,History()回调只记录训练/验证阶段的epoch级数据,而测试集是单轮评估,因此必须通过model.predict()获取预测结果,结合真实标签手动计算所有需要的指标后再完成可视化。
具体步骤
1. 提取真实标签与模型预测结果
假设测试集为test_dataset(TensorFlow Dataset或numpy数组均可),先提取真实标签,再获取模型预测值:
import numpy as np import tensorflow as tf # 提取测试集真实标签(根据数据集类型调整) # 若为numpy数组: y_true = test_labels # test_labels为预先准备的真实标签数组 # 若为TF Dataset: y_true = np.concatenate([y for x, y in test_dataset], axis=0) # 获取模型预测概率(分类任务需后续转类别标签,回归任务直接用预测值) y_pred_probs = model.predict(test_dataset, verbose=1) # 分类任务:将概率转为类别标签 y_pred = np.argmax(y_pred_probs, axis=1)
2. 手动计算各项指标
借助scikit-learn工具及自定义逻辑计算所需指标:
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score, log_loss from sklearn.metrics import precision_recall_curve # 计算Loss(分类任务用交叉熵损失,回归任务替换为MSE等) loss = log_loss(y_true, y_pred_probs) # 回归任务示例:loss = np.mean((y_true - y_pred)**2) # 计算accuracy、recall、precision、F1-Score accuracy = accuracy_score(y_true, y_pred) recall = recall_score(y_true, y_pred, average='weighted') # 根据任务选择macro/micro/weighted precision = precision_score(y_true, y_pred, average='weighted') f1 = f1_score(y_true, y_pred, average='weighted') # 计算mAP(单标签分类场景:计算每个类别的AP后取平均) ap_list = [] for class_idx in range(y_pred_probs.shape[1]): y_true_class = (y_true == class_idx).astype(int) y_pred_class = y_pred_probs[:, class_idx] precision_curve, recall_curve, _ = precision_recall_curve(y_true_class, y_pred_class) ap = np.trapz(precision_curve, recall_curve) # 梯形法计算AP ap_list.append(ap) mAP = np.mean(ap_list)
3. 可视化指标
用matplotlib绘制柱状图展示所有指标(单轮评估场景下柱状图更直观):
import matplotlib.pyplot as plt # 整理指标名称与对应数值 metrics_names = ['Loss', 'Accuracy', 'Recall', 'Precision', 'F1-Score', 'mAP'] metrics_values = [loss, accuracy, recall, precision, f1, mAP] # 绘制柱状图 plt.figure(figsize=(10, 6)) bars = plt.bar(metrics_names, metrics_values, color=['#ff6b6b', '#4ecdc4', '#45b7d1', '#96ceb4', '#ffeaa7', '#dfe6e9']) # 为柱状图添加数值标签 for bar in bars: height = bar.get_height() plt.text(bar.get_x() + bar.get_width()/2., height, f'{height:.4f}', ha='center', va='bottom') plt.title('Test Set Evaluation Metrics') plt.xlabel('Metrics') plt.ylabel('Value') plt.ylim(0, 1.1) # Loss可能大于1,可根据实际情况调整范围 plt.show()
注意事项
- 目标检测任务的mAP计算需额外处理:需先对预测框与真实框做IOU匹配,再计算每个类别的AP后取平均,可参考相关检测框架的mAP实现逻辑。
- 指标计算中的
average参数需根据任务类型(二分类/多分类/多标签)选择合适的选项。 - 若测试集规模较大,可通过分批调用
model.predict()避免内存溢出。
内容的提问来源于stack exchange,提问作者David Lima
相关产品推荐
相关产品推荐

