我们必须在交叉验证中进行特征选择吗?

机器算法验证 机器学习 交叉验证 特征选择
2022-03-29 18:04:05

又是我,参考这篇文章提出了非常相似的问题,这一次,我有点困惑是否应该在 KFold 交叉验证之前进行特征选择。我经常看到人们在建模之前进行一次性特征选择,想知道这是否正常?

在其中一个最热门的评论中,他提到:

我不认为那是(相当)Hastie 等人的情况。正在提倡。一般的论点是,如果特征选择使用响应,那么最好将其包含在您的 CV 程序中。如果您进行预测变量筛选,例如,通过查看它们的样本方差并排除具有小变化的预测变量,则可以作为一次性程序。


想知道如果我们不考虑响应变量,这是否意味着我们可以在 cv 之前进行一次特征选择?

事实上,如果我要在交叉验证中进行特征选择,那么对特征选择进行广泛的 EDA 有什么用?


如果我的数据集中有很多多重共线性特征,我应该在交叉验证之前处理它吗?


编辑:我一直在广泛阅读这个问题,但由于不确定在 CV 之前何时“可以”进行特征选择/减少,这真的让我很头疼。我偶然发现了来自scikit-learn的这段非常短的代码,其中他们使用 Ward 方法通过在聚类过程中选择一个截止点来删除高度相关的特征。我想知道这是否是我可以在循环之外做的事情,如果是的话,如何选择“阈值”?

4个回答

交叉验证是一种评估模型拟合方法性能的方法,而不是模型本身,因此拟合模型的所有步骤(包括特征选择和优化超参数)都需要在每个步骤中独立执行交叉验证过程的折叠。如果你不这样做,那么你最终会得到一个带有乐观偏见的性能估计。请参阅我(与有袋动物夫人)关于此主题的论文

GC Cawley 和 NLC Talbot,“关于模型选择中的过度拟合和性能评估中的后续选择偏差”,机器学习研究杂志 11,2079-2107 ( pdf )

我倾向于使用嵌套交叉验证来获得无偏的性能估计,但如果您不需要无偏的性能估计,只需在竞争方法之间进行选择(没有太多自由度,即没有特征选择!)那么这在实践中通常是不必要的,请参阅 Wainer 和 Cawley

J Wainer 和 G Cawley,“选择分类器时的嵌套交叉验证对于大多数实际应用来说过于热心”,具有应用程序的专家系统 182、115 ( doi:10.1016/j.eswa.2021.115222 )

一旦你有了那个性能估计,然后在整个数据集上重新训练模型,再次重复特征和模型选择过程。

如果目标是提高性能(而不是识别相关特征本身就是目标),我也建议不要选择特征。使用正则化模型通常会表现得更好。

这个问题最具挑战性的元素之一是知道何时可以将无监督学习步骤放在 CV 循环之外,以及何时应该通过将它们包含在循环中来完全惩罚它们。一般而言,诸如主成分分析之类的无监督学习过程可能是不稳定的,即,在对新样本进行计算时,第一个主成分的负载会发生变化。并且排除特征的无监督学习步骤,例如冗余分析和变量聚类,也可能是不稳定的。但是他们的不稳定性可能会伤害您或帮助您,即可能会提高或降低您的决赛R2. 因此,它们不会始终对您有利。在最终的预测歧视测量中过度拟合,例如R2或伪R2来自于做一些对你有利的事情,例如使用监督学习进行特征选择,无论是手动的还是自动的。

因此,将完全无监督的学习步骤保留在 CV 循环之外作为预处理步骤通常是可以的,但有时将它们带入循环以确保您的最终性能测量不会受到无监督学习中不稳定的影响。

你提到的线程已经非常详细地讨论了它,所以我会跳过那里已经提到的部分。回答您的问题,这取决于您所说的“如果我们不考虑响应变量,则在 cv 之前进行一次特征选择”的意思。例如,如果您查看数据并发现某些特征的质量非常低(数据没有意义,显然是错误的,或者特征是恒定的),那么您可以在 cross 之外执行此操作-验证。另一方面,进行深入的探索性数据分析以手动选择特征与通过算法进行类似的事情具有相同的效果,并且没有理由“手动”不会产生过拟合模型。

原则上,如果您希望您的 CV 验证分数反映应用以您所做的方式训练的算法将对新数据执行的操作,那么所有内容都应该是交叉验证(或引导,或您按照这些思路执行的任何其他操作)的一部分)。当我们需要在此基础上做出决定时,这当然是最令人担忧的(例如,我应该选择哪些可能会因偏离理想而受到不同影响的几种方法中的哪一种?)。这个理想在实践中并不完全可以实现(除非您保留一个单独的验证和/或测试分区,但是这对于除了庞大的数据集之外的任何东西都是低效的),探索性数据分析就是一个明显的例子。

一些违反这一理想的行为比其他的更糟糕。例如,您可能需要做一些 EDA 来定义您的交叉验证方案应该是什么样子(例如,您可能会发现每个患者有多个记录,也许出于这个原因,您应该使用 group-K-fold 而不是基本 K -折叠)。同样,筛选预测变量是否具有零(或接近零)方差似乎是无害的。仅基于人类对任务的理解来创建特征(例如,将类别名称的不同拼写错误组合在一起)通常也完全没有问题。

当你进行目标编码(通过它们的平均结果表示类别)时,你肯定会越界进入极端危险的境地,这必须始终在交叉验证循环内完成(甚至在其中的一个额外的 CV 循环内)。确实,大多数使用预测目标的事情都应该被认为太危险而不能在 CV 循环之外完成。

许多其他事情可能介于这些极端之间。例如,转换预测变量(例如标准化或进行 PCA)或缺失预测变量的插补理想地也属于 CV 循环,但不太明显(显然至少有一点)这会破坏 CV 评估的有效性。但是,您偏离得越多,对新数据的最终外部验证就越重要(由于其他原因,例如训练数据的来源与模型的使用位置不匹配,它当然也可能非常重要) .