测试准确率高于训练。如何解读?

机器算法验证 分类 特征选择
2022-02-10 00:02:59

我有一个数据集,最多包含 150 个示例(分为训练和测试),具有许多特征(高于 1000)。我需要比较在数据上表现良好的分类器和特征选择方法。因此,我使用了三种分类方法(J48、NB、SVM)和两种特征选择方法(CFS、WrapperSubset)和不同的搜索方法(Greedy、BestFirst)。

在比较时,我正在查看训练准确度(5 倍交叉折叠)和测试准确度。

这是 J48 和 CFS-BestFirst 的结果之一:

{“准确性训练”:95.83,“准确性测试”:98.21}

很多结果都是这样的,在SVM上有很多结果表明测试准确率远高于训练(训练:60%,测试:98%)

我怎样才能有意义地解释这些结果?如果它更低,我会说它过度拟合。通过查看所有结果,在这种情况下,关于偏差和方差有什么要说的吗?我可以做些什么来使这种分类有意义,例如重新选择训练和测试集或仅对所有数据使用交叉验证?

我有 73 个训练实例和 58 个测试实例。有些答案在发布时没有此信息。

4个回答

我认为第一步是检查报告的训练和测试性能是否真的正确。

  • 5 折交叉验证期间的拆分是否以产生统计上独立的 cv 训练/测试集的方式完成?例如,如果数据中有重复测量,它们是否总是在同一个集合中结束?
  • 在 150 个样本的 5 倍 cv 中,95.83% 的准确率与 5 个代理模型的 130 个训练样本中的 5 个错误或 5 * 130 个训练样本的 25 个错误案例一致。
  • 98.21% 的测试准确率更难解释:在一次 cv 运行期间,每个案例都应该测试一次。因此,可能报告的数字应该以 100%/150 为单位。98.21% 对应 2.68 个错误用例(150 个测试用例中有 2 个和 3 个错误分别给出 98.67% 和 98.00% 的准确率)。

  • 如果您可以提取模型,请在外部计算报告的准确度。

  • 随机输入的报告精度是多少?
  • 进行外部交叉验证:拆分数据,只将训练部分交给程序。预测“外部”测试数据并计算准确度。这符合程序的输出吗?
  • 确保报告的“测试准确性”来自独立数据(双重/嵌套交叉验证):如果您的程序进行数据驱动优化(例如通过比较多个模型来选择“最佳”特征),这更像是训练错误(善良拟合)而不是泛化错误。

我同意@mbq 的观点,即训练错误在机器学习中几乎没有用处。但是您可能处于它实际上有用的少数情况之一:如果程序通过比较准确度来选择“最佳”模型,但只有训练错误可供选择,您需要检查训练错误是否真的允许一个明智的选择。
@mbq 概述了无法区分模型的最佳情况。然而,更糟糕的情况也会发生:就像测试准确度一样,训练准确度也受方差影响,但与通常感兴趣的泛化准确度相比存在乐观偏差。这可能导致模型无法区分的情况,尽管它们确实具有不同的性能。但是由于他们的乐观偏见,他们的训练(或内部 cv)准确性太接近而无法区分它们。例如,迭代特征选择方法可能会遇到这样的问题,这些问题甚至可能会持续存在于内部交叉验证的准确性(取决于交叉验证的实现方式)。

因此,如果可能出现这样的问题,我认为检查程序用于决策的准确性是否可能导致明智的选择是一个好主意。这意味着检查内部 cv 准确性(据说用于选择最佳模型)相对于具有统计独立拆分的外部完成的 cv 没有或没有太大的乐观偏差。同样,合成和/或随机数据可以帮助找出程序实际做了什么。

第二步是看看观察到的统计独立分裂的差异是否有意义,正如@mbq 已经指出的那样。

我建议您计算在给定样本量下需要观察的准确度差异,以便获得具有统计学意义的差异。如果您观察到的变化较小,则您无法确定哪种算法更适合您的给定数据集:进一步优化没有意义。

如何解释高于训练集准确度的测试准确度。

最有可能的罪魁祸首是您的训练/测试拆分百分比。想象一下,如果您使用 99% 的数据进行训练,使用 1% 的数据进行测试,那么测试集的准确率显然会优于测试集,100 次中有 99 次。这里的解决方案是使用 50% 的数据进行训练,50% 用于评估模型。

训练集的准确性可能是噪声,具体取决于您使用的 ML 算法。训练集准确度不会评估模型在看不见的行上的正确性。一种策略是忽略训练集的准确性。

为了更清楚地了解模型的哪些超参数选择(例如训练/测试拆分、迭代、收敛标准、学习率 alpha 等)对您的模型在测试集上具有卓越的准确性负有最大责任,然后运行您的模型 100每个超参数选择的时间,然后平均训练准确度和测试准确度之间的差异。

另一种策略是将你的模型打包到一个 N 模型列表中,所有这些模型都是在 50/50 训练测试拆分上训练的。然后所有模型都可以访问所有数据,但也没有一个模型能够观察超过 50% 的训练数据。平均结果是正确的,那么你的训练准确率和测试准确率会更接近相等。

您处理此问题的方式存在一些严重问题。首先,除非总样本量很大,否则数据拆分是不可靠的。如果你再次分裂,你会得到不同的结果。除其他外,您没有考虑准确性估计的置信区间。其次,5 折交叉验证不够精确。可能需要重复 100 次才能达到足够的精度。第三,您选择了不连续的不正确评分规则(正确分类的比例)作为准确度评分。这种不正确的评分规则会导致选择错误的模型。

假设算法的实现没有故障,让我们看一下问题。

想象一下,从您的训练数据中提取一小部分并在其上运行您的学习算法。它显然会做得很好。总是可以提取出准确率接近 98% 的子集。

现在您的测试数据是否与该子集非常相似?如果是,那么您需要去收集更多数据,希望更多样。从偏差方差的角度来看,我会说你的方差很高。