使用相同的数据进行特征选择和交叉验证是否有偏差?

机器算法验证 机器学习 交叉验证 特征选择 火车
2022-03-28 13:58:03

我们有一个小数据集(大约 250 个样本 * 100 个特征),我们希望在选择最佳特征子集后在其上构建一个二元分类器。假设我们将数据划分为:

培训、验证和测试

对于特征选择,我们应用了一个基于选择特征的包装模型,分别优化分类器 X、Y 和 Z 的性能。在这个预处理步骤中,我们使用训练数据来训练分类器和验证数据来评估每个候选特征子集。

最后,我们要比较不同的分类器(X、Y 和 Z)。当然,我们可以使用测试部分的数据来进行公平的比较和评价。但是在我的情况下,测试数据会非常小(大约 10 到 20 个样本),因此,我想应用交叉验证来评估模型。

正例和反例的分布高度不平衡(大约 8:2)。因此,交叉验证可能会误导我们评估性能。为了克服这个问题,我们计划将测试部分(10-20 个样本)作为第二种比较方法并验证交叉验证。

总之,我们将数据划分为训练、验证和测试。训练和验证部分将用于特征选择。然后,将应用对相同数据的交叉验证来估计模型。最后,在数据不平衡的情况下,使用测试来验证交叉验证。

问题是:如果我们使用相同的数据(训练+验证)来选择优化分类器 X、Y 和 Z 性能的特征,我们能否对用于特征选择的相同数据(训练+验证)应用交叉验证测量最终性能并比较分类器?

我不知道此设置是否会导致有偏差的交叉验证测量并导致不合理的比较。

4个回答

简单的答案是,您应该在不同于您训练的数据集上进行特征选择(您已经在这样做,所以不要更改它)——不这样做的效果是您将过度拟合您的训练数据。你也不能在你的测试集上进行特征选择,因为这会夸大你的模型性能的估计(我想你也已经意识到了这一点,但我发现准确理解这个问题有点困难)。

如果您已经将测试集划分为训练、验证和测试,那么没有特别的理由进行交叉验证,除非您的数据太少以至于您的测试集太小而无法从中得出强有力的结论。许多研究人员不喜欢交叉验证,因为如果用于推动模型开发(我的意思是,你调整一些东西,然后运行交叉验证以查看它们是如何做的,然后再调整它们等等)你可以有效地访问你的测试数据,这可能会导致您高估您在真正看不见的数据上的表现。如果您的数据太小以至于您别无选择,只能进行交叉验证,那么使用训练集、开发集和测试集执行此操作的正确方法是将数据显式拆分为每个折叠的三个部分——应该使用大多数为了训练,一些用于开发(您的情况下的功能选择,以及需要拟合的任何其他免费参数),最后您应该在测试部分进行测试。然后,您可以对这些测试部分的分数进行平均,以获得对模型性能的估计:但是,正如我所说,请注意,如果这些分数被用来指导您解决问题的方法,您不应该期望得到与您在交叉验证中所做的未见数据相同的分数。

我认为这是有偏见的。如何在 N-1 分区中应用 FS 并在最后一个分区上进行测试。并以某种方式(联合/交集/或某些特定问题的方式)组合所有折叠的特征。

你试过LOOCV吗?我认为当你的训练数据非常少时,它很容易训练。要回答您的问题,这不会仅仅因为它可能会过度拟合并给您带来误导性的结果,从而不会给您最好的结果,这样您的分类器就不会在它没有看到的其他数据上表现出色。

您可以执行以下操作来比较分类器的性能

使用您的训练集并在每个可能的特征集上对其进行训练。对于每个特征集,最小化参数并构建模型,使其很好地拟合训练集。现在,一旦为所有特征集构建了模型,即您为每个特征集都有一个模型,在验证集上验证模型(基于不同的特征集构建)并选择该模型(为特征集的特定子集构建) 给出了验证集上的最小误差。这样,您可以确保构建的模型不仅适合训练集,还适合验证集。

现在,使用这个构建的模型并在测试集上对其进行测试。这将告诉您分类器在既不用于训练也不用于验证的数据集上运行时的性能。此外,您选择了适合训练集和验证集的特征集。