应该只对训练数据(或所有数据)进行特征选择吗?

机器算法验证 数据集 交叉验证 实验设计 特征选择
2022-02-08 22:43:52

应该只对训练数据(或所有数据)进行特征选择吗?我经历了一些讨论和论文,例如Guyon (2003)Singhi and Liu (2006),但仍然不确定正确答案。

我的实验设置如下:

  • 数据集:50 名健康对照和 50 名疾病患者(cca 200 可能与疾病预测相关的特征)。
  • 任务是根据可用特征诊断疾病。

我所做的是

  1. 获取整个数据集并执行特征选择(FS)。我只保留选定的功能以供进一步处理
  2. 拆分以测试和训练,使用训练数据和选定的特征训练分类器。然后,将分类器应用于测试数据(再次仅使用选定的特征)。使用留一验证。
  3. 获得分类准确率
  4. 平均:重复 1)-3) N 次。 (100)。N=50

我同意对整个数据集进行 FS 会引入一些偏差,但我认为它在平均过程中被“平均”(步骤 4)。那是对的吗?(准确度方差<2%

1 Guyon, I. (2003) “变量和特征选择简介”,机器学习研究杂志,卷。3, pp. 1157-1182
2 Singhi, SK 和 Liu, H. (2006) “分类学习的特征子集选择偏差”,ICML '06 第 23 届机器学习国际会议论文集,第 849-856 页

3个回答

您使用的过程将导致性能估计出现乐观偏差,因为您使用步骤 2 和 3 中使用的测试集的数据来确定步骤 1 中使用的特征。重复练习可以减少性能估计的方差,而不是偏差,因此偏差不会平均化。为了获得无偏的性能估计,不得以任何方式使用测试数据来选择模型,包括特征选择。

更好的方法是使用嵌套交叉验证,这样外部交叉验证提供了对使用构建模型的方法(包括特征选择)可获得的性能的估计,而内部交叉验证用于独立选择特征在外部交叉验证的每一折中。然后使用所有数据构建您的最终预测模型。

由于您拥有的特征多于案例,因此您很可能仅通过特征选择来过度拟合数据。应该期望特征选择可以提高预测性能,这有点神话,所以如果这是您感兴趣的(而不是将相关特征本身识别为目的),那么您可能最好使用岭回归和不执行任何特征选择。如果仔细选择岭参数,这可能会比特征选择提供更好的预测性能(我使用最小化 Allen 的 PRESS 统计量 - 即均方误差的留一估计)。

有关详细信息,请参阅Ambroise 和 McLachlan以及我对此问题的回答。

就像这里答案的附录一样,我有两个链接真的帮助我理解了为什么这不是一个好的程序:

编辑:根据要求,对链接内容的简要说明:

假设我正在训练一个分类器,我有一个包含 1000 个样本的数据集,每个样本有 100 万个特征。我不能全部处理它们,所以我需要更少的特征(比如,我可以计算 300 个特征)。我还有一个包含 100 个样本的测试集,可以准确地估计我的样本外真实世界的准确性。

如果我将我的 100 万个特征过滤到 300 个,通过选择与整个数据集的目标相关性最高的那些特征,我就犯了一个错误(因为我引入了稍后无法通过交叉验证检测到的过度拟合)。我的保留集将通过吐出一个糟糕的准确度值来显示这一点。

根据上述链接,正确的做法是将我的数据集划分为训练集和交叉验证集,然后根据该训练集及其相关的 CV 分数调整我的模型(过滤掉特征等)。如果我使用 K-folds,我必须在每次进行拆分/折叠时从头开始调整,然后平均结果。

以编程方式,您执行以下操作:

  • 保留数据集的一部分作为保留集。
  • 将数据集的其余部分(以下称为 T1)拆分为 K 折叠。
  • 在从 i=1 到 K 的 for 循环中,执行以下操作:
    • 选择第 i 个折叠作为您的 CV 集,其余样本作为您的训练集(以下称为 Ti)。
    • 做任何你想做的特征工程和特征选择:过滤特征,组合它们等。
    • 将您的 CV 集(当前折叠,称为 CVi)和您当前的训练集 Ti 转换为具有适当特征的一个。
    • 在训练集 Ti 上训练你的模型
    • 从当前折叠中获取分数,CVi。将此分数附加到包含所有分数的列表中。
  • 现在,你的列表有每个折叠的分数,所以你平均它,得到 K-folds 分数。

在循环内,在子训练集 Ti 上执行特征工程,而不是在完整训练集 T1 上执行特征工程,这一点非常重要。

这样做的原因是,当您为 Ti 进行拟合/特征工程师时,您在 CVi 上进行测试,这对于该模型是看不到的。然而,如果您在 T1 上进行拟合/特征工程师,则您选择的任何 CV 都必须是 T1 的子集,因此您将存在乐观偏差,即您将过度拟合,因为您正在对相同的数据样本进行训练和测试。

一个非常好的 StackExchange 答案是这个,它通过代码示例更深入地解释了它。也将视为附录。

Efron-Gong“乐观”引导程序非常适合这一点。这个想法是使用所有可用数据来开发预测模型,并使用所有数据来估计同一模型的可能未来性能。并且您的样本量太小了 100 倍,无法使用任何拆分样本方法。

要正确使用引导程序,您必须对使用的所有步骤进行编程,并在每次重新采样时重新重复它们。除了特征选择,这里有一个很好的例子:解释具有多个预测变量的逻辑回归模型Y