如何在特征选择和分类中对跨越三个数据集的两种算法进行统计比较?

机器算法验证 机器学习 统计学意义 计算统计 标准化 遗传算法
2022-04-04 20:42:27

问题背景:作为我研究的一部分,我编写了两种算法,可以从数据集(癌症患者的基因表达数据)中选择一组特征。然后对这些特征进行测试,以了解它们如何将看不见的样本分类为癌症或非癌症。对于算法的每次运行,都会生成一个解决方案(一组特征)并在 Z 个未见过的样本上进行测试。解决方案的百分比精度计算如下:(correct classifications / Z) * 100.

我有两种算法:算法 X 和算法 Y

我有三个独立的(不同的癌症)数据集:数据集 A、数据集 B 和数据集 C。这些数据集彼此非常不同。它们没有相同数量的样本或每个样本的相同数量的测量(特征)。

我在每个数据集上运行了每个算法 10 次。因此,算法 X 有来自数据集 A 的 10 个结果,来自数据集 B 的 10 个结果和来自数据集 C 的 10 个结果。总的来说,算法 X 有 30 个结果。

我的问题:我想看看算法 X 在所有三个数据集上的综合性能在统计上是否与算法 Y 的综合性能有显着差异。

我是否可以将每个数据集的算法 X 的结果组合成一组结果?这样,我将有 30 个算法 X 的标准化结果和 30 个算法 Y 的标准化结果。然后我可以使用 t 检验来查看这两种方法之间是否存在显着差异。

编辑 -这些是进化算法,因此每次运行它们都会返回稍微不同的解决方案。但是,如果样本中有一个特征在存在时可以将样本强烈分类为癌症或非癌症,那么几乎每次运行算法时都会选择该特征。

由于以下原因,我在 10 次运行中的每一次得到的结果都略有不同:

  • 这些算法是随机播种的。
  • 我使用重复的随机子抽样验证(10 次重复)。
  • 我使用的数据集(DNA 微阵列和蛋白质组学)很难使用,因为算法可能会陷入许多局部最优值。
  • 我想检测很多特征间和子集间的交互。
  • 我训练了 50 条染色体,它们不受任何特定长度的限制。它们可以自由生长和收缩(尽管选择压力会引导它们变短)。这也给最终结果带来了一些变化。

话虽如此,该算法几乎总是选择特定的特征子集!

这是我的结果示例(此处显示每种算法的 10 次运行中只有 4 次):

数据集/运行算法 X 算法 Y
1 90.91 90.91
2 90.91 95.45
3 90.91 90.91
4 90.91 90.91

乙 1 100 100
乙 2 100 100
乙 3 95.65 100
乙 4 95.65 86.96

C 1 90.32 87.10
C 2 70.97 80.65
C 3 96.77 83.87
C 4 80.65 83.87

如您所见,我将来自三个数据集的两种算法的结果放在一起。我可以对这些数据进行 Kruskal-Wallis 测试,但它是否有效?我问这个是因为:

  • 我不确定不同数据集中的准确性是否可以比较。如果它们不是,那么像我所做的那样将它们放在一起将毫无意义,对它们进行的任何统计测试也将毫无意义。
  • 当您像这样将精度放在一起时,整体结果很容易受到异常值的影响。一种算法在一个数据集上的出色性能可能会掩盖它在另一个数据集上的平均性能。

在这种情况下我也不能使用 t-test,这是因为:

  • 可公度性 - 只有当数据集的差异相当时,t 检验才有意义。
  • t-test 要求比较的两种算法之间的差异是正常分布的,在我的情况下(至少我知道)无法保证这种情况。
  • t 检验受异常值的影响,这些异常值会扭曲测试统计数据并通过增加估计的标准误差来降低测试的功效。

你怎么看?在这种情况下,如何在算法 X 和 Y 之间进行比较?

2个回答

除非您的算法在性能上有巨大差异并且您有大量的测试用例,否则您将无法仅通过查看性能来检测差异。

但是,您可以使用配对设计:

  • 在数据集的完全相同的训练/测试拆分上运行所有三种算法,并且
  • 不要将测试结果汇总为正确百分比,而是将它们保持在单个测试用例级别,无论是正确还是错误。

为了进行比较,请查看McNemar 的测试在这里利用配对设计背后的想法是,所有两种算法都正确和错误的情况都不能帮助您区分算法。但是,如果一种算法比另一种更好,那么应该有很多情况下更好的算法是正确的,但不是更差的,很少有人用更差的方法预测正确,但更好的方法预测错误。

此外,Cawley 和 Talbot:论模型选择中的过度拟合和性能评估中的后续选择偏差,JMLR,2010,1,2079-2107。是高度相关的。

由于算法的随机性,您还需要多次检查同一数据集的同一拆分。从中您可以估计在其他方面相等的不同运行之间的变化。可能很难判断所选变量集的差异程度。但是,如果您的最终目标是预测性能,那么您还可以使用同一测试用例在不同运行期间的预测之间的差异来衡量结果模型的稳定性。

然后,您还需要检查(如上所示)由于数据集的不同拆分而导致的变化,并将其与第一个方差相关联。

分数(如正确识别样本的百分比)通常被假定为二项式分布,在某些情况下可以进行正态近似,但在具有宽数据矩阵的领域中几乎没有遇到过这种情况。这导致对于少量测试用例而言置信区间很大。在 R 中,binom::binom.confint计算给定 no 的真实比例的置信区间。测试和没有。的成功。

最后,我在光谱数据遗传优化方面的经验(我的德语文凭论文)建议您还应该检查训练错误。GA 往往会很快过拟合,从而达到非常低的训练错误。低训练错误不仅过于乐观,而且还会导致 GA 无法区分许多看起来同样完美的模型。(如果 GA 在内部也随机对训练集和内部测试集进行子采样,您可能会遇到更少的问题)。

英文论文:

您正在使用 GA 运行特征选择 10 次,每次得到不同的输出!

首先,如果你从同一个种子开始,你应该总是得到相同的选择特征子集。但是,如果您使用的是随机种子,也很可能,您应该获得几乎相同的选定特征。您的帖子中说明了获得相同选定功能的一个原因。此外,为了公平比较,您可以在 A 的运行中使用相同的种子进行 B 的实验。

其次,您可以使用交叉验证或引导进行比较。通过这种方式,您可以获得更具代表性的比较。在这种情况下,有一个变异来源,即随机训练样本,它似乎比随机种子更强。因此,比较可以揭示哪种算法确实更好。

最后,您可以按照您的建议使用 t 检验或直接使用一些非参数检验,如 Kruskal-Wallis 检验。