趋近智
评估神经网络模型在新数据(完全未见过的数据)上的表现,是其开发过程中的一个必要阶段。这一评估能提供模型泛化能力(即在未训练数据上进行准确预测的能力)的公正估计。
在整个训练过程中,您可能已使用验证集来监控性能。该集合有助于调整超参数(例如学习率或网络结构),并决定何时停止训练(例如使用早停技术)。然而,由于验证集间接影响模型开发过程,因此使用相同数据评估最终模型可能会导致评估结果过于乐观。
为获得真实的性能衡量,我们使用单独的测试集。该数据集必须单独存放,并且在所有训练和模型选择完成后仅使用一次。重复使用测试集来微调模型,实际上会使其变成另一个验证集,从而损害其作为公正评估工具的效用。
评估指标的选择主要取决于您的神经网络旨在解决的问题类型(例如分类或回归)。
对于目标是将数据点分配到预设类别的任务,常用指标包括:
准确率: 最直接的衡量指标。它衡量的是正确分类的样本占总样本的比例。
准确率虽然直观,但对于类别不平衡的数据集可能产生误导。例如,如果95%的样本属于A类,5%属于B类,一个总是预测A类的模型将达到95%的准确率,但对于识别B类而言则毫无用处。
混淆矩阵: 一个表格,通过显示真阳性(TP)、真阴性(TN)、假阳性(FP)和假阴性(FN)的数量,概括了分类模型的表现。它详细列出了每个类别的正确和不正确预测。
一个标准的混淆矩阵布局,比较实际类别与预测类别。
精确率: 衡量的是被识别为阳性且实际也正确的样本比例。它回答:“在所有被预测为阳性的样本中,有多少是真正的阳性?”
当假阳性成本很高时,高精确率很重要。
召回率(敏感度): 衡量的是被正确识别的实际阳性样本的比例。它回答:“在所有实际阳性样本中,模型正确预测了多少?”
当假阴性成本很高时,高召回率很重要。
F1分数: 精确率和召回率的调和平均值。它提供一个平衡两种指标的单一分数。
F1分数在需要平衡精确率和召回率时通常很有用,尤其是在类别分布不均匀的情况下。
AUC-ROC: 接收者操作特征曲线下面积(AUC-ROC)绘制了在各种分类阈值下,真阳性率(召回率)与假阳性率的关系。AUC表示模型将随机阳性样本排在随机阴性样本之上的概率,提供了一个衡量所有阈值下性能的综合指标。
对于预测连续值的任务,使用不同的指标:
平均绝对误差 (MAE): 预测值与实际值之间绝对差的平均值。它易于理解,因为其单位与目标变量相同。
相比于MSE,MAE对大误差(异常值)的敏感度较低。
均方误差 (MSE): 预测值与实际值之间平方差的平均值。对误差进行平方会更严厉地惩罚较大的偏差。
其单位是目标变量单位的平方,这使得它不如MAE或RMSE那样直接易懂。
均方根误差 (RMSE): MSE的平方根。它将指标的单位恢复到目标变量的原始单位,使其比MSE更易懂,同时仍能显著惩罚大误差。
R平方 () 或决定系数: 表示因变量中可由自变量预测的方差比例。一个为1表示模型完美预测目标值,而一个为0表示模型的表现不比简单预测目标变量的平均值更好。
模型训练完成后,您可以使用所选框架在测试集上对其进行评估。以下是PyTorch中用于分类模型的典型工作流程:
model.eval()。这很重要,因为它会禁用像Dropout这样的机制,并调整批量归一化等层的行为,使其使用运行统计数据而非批量统计数据,从而确保预测结果的一致性。DataLoader 加载测试数据集。torch.no_grad() 上下文管理器。因为您只进行评估而不训练,计算梯度是不必要的,并且会消耗内存和计算资源。以下是一个计算测试集准确率的简化示例:
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset
# 假设 'model' 是您已训练好的PyTorch模型(例如,从文件中加载)
# 假设 'test_loader' 是您的测试集DataLoader
# 示例:如果需要上下文,可以定义一个简单的模型结构
# class SimpleClassifier(nn.Module):
# def __init__(self):
# super().__init__()
# self.linear1 = nn.Linear(784, 128)
# self.relu = nn.ReLU()
# self.linear2 = nn.Linear(128, 10) # MNIST有10个类别
#
# def forward(self, x):
# x = x.view(x.size(0), -1) # 展平输入
# x = self.linear1(x)
# x = self.relu(x)
# x = self.linear2(x)
# return x
#
# model = SimpleClassifier()
# model.load_state_dict(torch.load('trained_model_weights.pth')) # 加载训练好的权重
# 将模型设置为评估模式
model.eval()
correct_predictions = 0
total_predictions = 0
# 使用 torch.no_grad() 禁用梯度计算
with torch.no_grad():
for inputs, labels in test_loader:
# 将数据移动到合适的设备(例如,如果可用则移至GPU)
# inputs, labels = inputs.to(device), labels.to(device)
# 获取模型输出(logits)
outputs = model(inputs)
# 获取预测类别(具有最高logit的索引)
_, predicted_classes = torch.max(outputs.data, 1)
# 更新计数
total_predictions += labels.size(0)
correct_predictions += (predicted_classes == labels).sum().item()
# 计算最终准确率
accuracy = 100 * correct_predictions / total_predictions
print(f'测试准确率: {accuracy:.2f}%')
# 您可以类似地计算其他指标,如精确率、召回率、F1
# 使用scikit-learn等库,基于所有批次收集的 'predicted_classes' 和 'labels'
# .
“在测试集上计算的评估指标,能为您提供模型在新数据的实际情况中表现的最可靠参考。”
在专用测试集上严格评估模型是机器学习中的一项基本做法。它提供了必要的验证,表明您的模型已经从训练数据中学习到了一般模式,而不仅仅是记忆,从而让您对其预测能力充满信心。
这部分内容有帮助吗?
model.eval()和torch.no_grad(),这些是准确评估PyTorch模型的实践方法。© 2026 ApX Machine Learning用心打造