为什么要做评估诊断

有的团队构建一个机器/深度系统可能需要六个月时间,而更有技能的团队只需几周就能完成。机器/深度学习系统良好运行的效率在很大程度上取决于在项目过程中能否反复做出正确的决策。(笔者注,注意在反复中加了黑体,这是常态。)

还是以实施正则化线性回归预测房价为例。当训练模型发现预测中存在很大误差时,有多种可以尝试的方向。比如获取更多的训练样本,因为通常认为更多数据会有帮助;在这基础上考虑是否特征数量过多,尝试减少特征;获取额外的特征,比如房子的其他属性添加到数据中;对现有的特征添加多项式特征,如x_1x_2等特征,添加x_1^2x_2^2x_1x_2等;怀疑正则化参数\lambda的取值是否合适,考虑增大或减小它。在任何给定的应用中,这些尝试有的可能有效果,有的可能没有效果。

有效构建算法的关键在于找到一种方法,能对投入时间的方向做出正确选择。团队花费很多时间收集更多训练数据,有时期望通过增加数据提升效果,但结果并不一定如愿。

所以构建系统前的评估诊断非常必要。诊断是一种测试,通过它可以了解学习算法中哪些有效、哪些无效,从而指导提升算法表现。一些诊断能判断是否值得花几周甚至几个月时间去收集更多训练数据,如果值得,就可以加大投入获取更多数据以提升性能;如果不值得,诊断就能节省大量时间。虽然实施诊断需要时间,但这是对时间的良好利用。

例子

- 当仅用房屋大小这一个特征训练模型(是一个4次多项式)时,虽然模型能很好地拟合训练数据,但可能无法对非训练集的新例子进行有效预测。因为此时模型的曲线非常弯曲,意味着模型可能存在过拟合问题。

- 当使用更多特征(如大厅大小、卧室数量、房子楼层数、房子年龄等)来拟合模型时,模型变为多个特征的函数,此时绘制模型(如函数F)变得困难,因为是高维函数(如四维函数),这就引出了需要更系统的方法来评估模型性能的需求。

训练集和测试集

- 为了评估模型,对于一个训练集,可以将其分成两个子集。通常把大部分数据(如70%)作为训练集,小部分数据(如30%)作为测试集。

- 用特定符号表示训练集样本(如X_{1},y_{1}等,这里明确了M_{train}表示训练样本数量,在小数据集中为7个)和测试集样本(如X_{1}^{test},y_{1}^{test}等,M_{test}表示测试样本数量,此例中为3个)。

- 强调按照一定比例(如70:30或80:20)划分数据集是常见做法,大部分数据用于训练,小部分用于测试。

线性回归模型的评估

- 对于使用带有平方误差代价的线性回归模型,首先通过最小化代价函数J来拟合参数W,B,代价函数包含平方误差项和正则化项

$\frac{1}{2m}\sum_{i = 1}^{m}(h_{W,B}(x^{(i)}) - y^{(i)})^2+\frac{\lambda}{2m}\sum_{j = 1}^{n}W_{j}^{2}$)。

- 计算测试集上的代价J_{test}(W,B),它等于测试集的平均误差

\frac{1}{2M_{test}}\sum_{i = 1}^{M_{test}}(h_{W,B}(x_{test}^{(i)}) - y_{test}^{(i)})^2 ),

且该公式不包括正则化项,以此了解模型的学习情况。

- 定义训练误差$J_{train}(W,B)$,它是训练集的平均平方误差项

\frac{1}{2M_{train}}\sum_{i = 1}^{M_{train}}(h_{W,B}(x_{train}^{(i)}) - y_{train}^{(i)})^2 ),同样不包括正则化项。在之前提到的过拟合模型例子中,$J_{train}(W,B)$会很低(因为训练样本平均误差接近零),但$J_{test}$会很高,这表明模型虽然在训练集上表现好,但泛化能力差,不擅长处理新数据。

分类问题的模型评估

- 以在0或1的数字之间进行分类为例,对于逻辑回归模型,同样通过最小化代价函数(J(W,B),包含逻辑损失函数和正则化项)来拟合参数。

- 计算测试误差J_{test},它是测试样本的平均逻辑损失(即不属于训练集的30%数据在逻辑损失上的平均值),也可以计算训练误差(训练数据的平均逻辑损失)。

- 更常用的是通过计算错误分类的比例来定义J_{test}J_{train},即在测试集上计算预测结果与实际标签不同的样本比例(如在手写数字分类中,0被分类为1或1被分类为0的比例),在训练集上同理。

反面例子

一旦模型参数与训练集拟合,训练误差可能不是一个好的指标,不能很好地反映模型对训练集之外新例子的泛化能力。上文 线性回归模型的评估 中提到过,训练误差几乎为零,但实际的泛化误差(即新样本上的平均误差)可能比训练误差高很多。所以相比之下,在测试集上的误差(J 测试)能更好地表明模型在新数据(非训练集数据)上的表现。

使用测试集选择模型的初步方法和可能问题

还是以预测房价的回归问题为例,

-不同阶数的多项式模型(一阶、二阶、三阶等直至十阶)。对于每个模型,先在训练集上拟合得到参数 W 和 B,然后计算 J 测试来估计其对新数据的泛化能力。

-一种尝试的方法是查看所有模型的 J 测试值,选择值最小的模型。但这种方法存在问题,因为在选择多项式次数(D)这个额外参数时使用了测试集,导致 J 测试的 W-B 值很可能是对泛化误差的乐观估计,即低于实际的泛化误差,所以不推荐使用该方法。

交叉验证集

所以为了自动选择模型(如确定多项式的合适次数),将数据分成三个部分:训练集、交叉验证集和测试集。比如,对于十个训练样本,可将 60% 的数据放入训练集(样本数量记为 M 训练 = 6),20% 的数据放入交叉验证集(样本用 XCV 和 yCV 表示,数量记为 mCV = 2),20% 的数据放入测试集(样本用 X 测试和 y 测试表示,数量记为 M 测试 = 2)。

交叉验证集也被称为验证集、开发集等,它是用于检查不同模型有效性或准确性的额外数据集。使用这三个子集的数据,可以分别计算训练误差、交叉验证误差(也叫验证误差、开发集误差等)和测试误差,且这些误差计算通常不包括训练目标中的正则化项。

验证集选择流程

-对于多个不同的模型(如不同阶数的多项式模型),在训练集上拟合参数 W-B 后,在交叉验证集上计算 JCV(交叉验证误差)。例如对于二阶多项式模型计算 JCV (W-B) 2,直至计算到十阶多项式模型的 JCV (W 10) b10。

-通过比较所有模型的 JCV 值,选择 JCV 值最低的模型。假设 JCV (W-B) 4 最低,就选择四阶多项式模型作为应用模型。

-最后,若要报告模型在新数据上的泛化误差估计,使用测试集计算该模型的 J 测试。由于在整个过程中,没有将任何参数(W、B 或 D)拟合到测试集,所以此时的 J 测试是对模型泛化误差的一个公平估计。

笔者注

这种模型选择过程不仅适用于选择多项式次数的回归模型,也适用于选择其他类型的模型,如手写数字识别的神经网络架构。对于不同大小和结构的神经网络模型,训练得到相应参数后,在交叉验证集上用 JCV 评估性能(对于分类问题,JCV 通常是算法错误分类的交叉验证例子的百分比),选择 JCV 最低的模型,最后用测试集评估所选模型的泛化能力。

在对学习算法做出所有决策(如选择参数、模型架构等)时,仅使用训练集和交叉验证集,不使用测试集。只有在做出所有决策并确定最终模型后,才在测试集上评估模型。这样可以确保测试集是对算法泛化能力的公平估计,而不是乐观估计。

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐