评估神经网络模型在新数据(完全未见过的数据)上的表现,是其开发过程中的一个必要阶段。这一评估能提供模型泛化能力(即在未训练数据上进行准确预测的能力)的公正估计。测试集的作用在整个训练过程中,您可能已使用验证集来监控性能。该集合有助于调整超参数(例如学习率或网络结构),并决定何时停止训练(例如使用早停技术)。然而,由于验证集间接影响模型开发过程,因此使用相同数据评估最终模型可能会导致评估结果过于乐观。为获得真实的性能衡量,我们使用单独的测试集。该数据集必须单独存放,并且在所有训练和模型选择完成后仅使用一次。重复使用测试集来微调模型,实际上会使其变成另一个验证集,从而损害其作为公正评估工具的效用。评估指标评估指标的选择主要取决于您的神经网络旨在解决的问题类型(例如分类或回归)。分类任务的指标对于目标是将数据点分配到预设类别的任务,常用指标包括:准确率: 最直接的衡量指标。它衡量的是正确分类的样本占总样本的比例。 $$ \text{准确率} = \frac{\text{正确预测数量}}{\text{总预测数量}} $$ 准确率虽然直观,但对于类别不平衡的数据集可能产生误导。例如,如果95%的样本属于A类,5%属于B类,一个总是预测A类的模型将达到95%的准确率,但对于识别B类而言则毫无用处。混淆矩阵: 一个表格,通过显示真阳性(TP)、真阴性(TN)、假阳性(FP)和假阴性(FN)的数量,概括了分类模型的表现。它详细列出了每个类别的正确和不正确预测。digraph G { rankdir=LR; node [shape=plaintext]; ConfusionMatrix [label=< <TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> <TR><TD COLSPAN="2" ROWSPAN="2"></TD><TD COLSPAN="2" BGCOLOR="#e9ecef">预测类别</TD></TR> <TR><TD BGCOLOR="#ced4da">阳性 (1)</TD><TD BGCOLOR="#ced4da">阴性 (0)</TD></TR> <TR><TD ROWSPAN="2" BGCOLOR="#e9ecef">实际类别</TD><TD BGCOLOR="#ced4da">阳性 (1)</TD><TD BGCOLOR="#b2f2bb">真阳性 (TP)</TD><TD BGCOLOR="#ffc9c9">假阴性 (FN)</TD></TR> <TR><TD BGCOLOR="#ced4da">阴性 (0)</TD><TD BGCOLOR="#ffc9c9">假阳性 (FP)</TD><TD BGCOLOR="#b2f2bb">真阴性 (TN)</TD></TR> </TABLE> >]; }一个标准的混淆矩阵布局,比较实际类别与预测类别。精确率: 衡量的是被识别为阳性且实际也正确的样本比例。它回答:“在所有被预测为阳性的样本中,有多少是真正的阳性?” $$ \text{精确率} = \frac{TP}{TP + FP} $$ 当假阳性成本很高时,高精确率很重要。召回率(敏感度): 衡量的是被正确识别的实际阳性样本的比例。它回答:“在所有实际阳性样本中,模型正确预测了多少?” $$ \text{召回率} = \frac{TP}{TP + FN} $$ 当假阴性成本很高时,高召回率很重要。F1分数: 精确率和召回率的调和平均值。它提供一个平衡两种指标的单一分数。 $$ F1 = 2 \times \frac{\text{精确率} \times \text{召回率}}{\text{精确率} + \text{召回率}} $$ F1分数在需要平衡精确率和召回率时通常很有用,尤其是在类别分布不均匀的情况下。AUC-ROC: 接收者操作特征曲线下面积(AUC-ROC)绘制了在各种分类阈值下,真阳性率(召回率)与假阳性率的关系。AUC表示模型将随机阳性样本排在随机阴性样本之上的概率,提供了一个衡量所有阈值下性能的综合指标。回归任务的指标对于预测连续值的任务,使用不同的指标:平均绝对误差 (MAE): 预测值与实际值之间绝对差的平均值。它易于理解,因为其单位与目标变量相同。 $$ \text{平均绝对误差} = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i| $$ 相比于MSE,MAE对大误差(异常值)的敏感度较低。均方误差 (MSE): 预测值与实际值之间平方差的平均值。对误差进行平方会更严厉地惩罚较大的偏差。 $$ \text{均方误差} = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2 $$ 其单位是目标变量单位的平方,这使得它不如MAE或RMSE那样直接易懂。均方根误差 (RMSE): MSE的平方根。它将指标的单位恢复到目标变量的原始单位,使其比MSE更易懂,同时仍能显著惩罚大误差。 $$ \text{均方根误差} = \sqrt{\text{均方误差}} = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2} $$R平方 ($R^2$) 或决定系数: 表示因变量中可由自变量预测的方差比例。一个$R^2$为1表示模型完美预测目标值,而一个$R^2$为0表示模型的表现不比简单预测目标变量的平均值更好。在PyTorch中进行实际评估模型训练完成后,您可以使用所选框架在测试集上对其进行评估。以下是PyTorch中用于分类模型的典型工作流程:加载已训练模型: 确保您可以访问训练后保存的模型权重。将模型设置为评估模式: 调用 model.eval()。这很重要,因为它会禁用像Dropout这样的机制,并调整批量归一化等层的行为,使其使用运行统计数据而非批量统计数据,从而确保预测结果的一致性。准备测试数据: 使用 DataLoader 加载测试数据集。禁用梯度计算: 使用 torch.no_grad() 上下文管理器。因为您只进行评估而不训练,计算梯度是不必要的,并且会消耗内存和计算资源。迭代并预测: 遍历测试数据批次,将输入传入模型以获取预测。计算指标: 将模型的预测与测试集中的真实标签进行比较,以计算您选择的评估指标(例如,准确率、精确率、召回率、F1、MSE)。以下是一个计算测试集准确率的简化示例: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' # .结果解读“在测试集上计算的评估指标,能为您提供模型在新数据的实际情况中表现的最可靠参考。”比较测试与验证表现: 如果测试表现明显差于训练期间观察到的验证表现,这可能表明您在超参数调整过程中无意中对验证集过拟合了,或者测试集的数据分布与训练/验证集存在显著差异。分析具体错误: 查看混淆矩阵(针对分类)或分析误差最大的样本(针对回归)。这可以表明模型中存在的具体不足,例如对某些类别或输入数据类型处理困难。指导后续步骤: 如果表现符合您的要求,模型就可以部署了。如果不符合,评估结果将指导进一步的改进。这可能涉及收集更多样的数据、尝试不同的模型结构、优化特征,或重新审视超参数调整(但要小心不要基于测试集结果间接进行过度调整)。在专用测试集上严格评估模型是机器学习中的一项基本做法。它提供了必要的验证,表明您的模型已经从训练数据中学习到了一般模式,而不仅仅是记忆,从而让您对其预测能力充满信心。