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

如何在测试数据集上绘制模型的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 20:08:25