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


10

应该仅对训练数据(或所有数据)执行特征选择吗?我经历了一些讨论和论文,例如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),“变量和特征选择简介”,《机器学习研究杂志》,第1卷。3,第1157-1182页
2 Singhi,SK和Liu,H.(2006)“用于分类学习的特征子集选择偏差”,进行ICML '06的第23届国际机器学习会议论文集,第849-856页

Answers:


12

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

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

由于您拥有比案例更多的要素,因此很可能仅通过要素选择就可以过度拟合数据。特征选择可以提高预测性能是一个神话,因此,如果您对此感兴趣(而不是将相关特征本身识别为终点),则最好使用岭回归而不执行任何特征选择。如果仔细选择了脊参数,这可能会提供比特征选择更好的预测性能(我使用艾伦PRESS统计量的最小值-即均方误差的留一法估计)。

有关更多详细信息,请参阅Ambroise和McLachlan,以及我对这个问题的回答


谢谢你的答案。实际上,我对这两者都感兴趣,以找到相关功能并提高预测性能。在我的实验(用于分类的SVM)中,特征选择显着提高了预测准确性(但是,正如您指出的那样,这可能是数据过度拟合的结果)。我认为,通过岭回归,您是说也称为Tikhonov正则化吗?
pedro29 2013年

是的,岭回归只是基于权重平方范数的惩罚项的正态线性回归。对于大多数问题,它的功能与SVM一样好,但易于实现(并且您可以免费免费解决留一法交叉验证错误,该错误可用于调整超参数)。
迪克兰有袋博物馆,

顺便说一下,岭规则化和特征选择之间有什么区别?我的意思是,最终,这两者都指示给定预测变量集中的预测变量的“最佳子集”。
pedro29 2013年

岭回归不能识别特征的子集,点阵回归的LASSO或LARS形式可以识别。那将是我选择特征选择方法的原因,因为惩罚项对进入和离开模型的特征施加了排序,因此它不太容易过拟合,因此与仅穷举搜索最佳集合相比,自由度要小。特征。
迪克兰有袋博物馆,2013年

3

就像这里答案的附录一样,我有两个链接确实可以帮助我理解为什么这不是一个很好的过程:

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

假设我正在训练一个分类器,并且我有一个包含1000个样本的数据集,每个样本都具有100万个特征。我无法全部处理它们,因此我需要更少的功能(例如,我可以计算300个功能)。我还有一个包含100个样本的测试集,可以准确估计我的样本外真实精度。

如果我将100万个特征过滤到300个(通过选择与整个数据集的目标相关性最高的特征),那么我就犯了一个错误(因为我引入了过拟合,稍后交叉验证无法检测到)。我坚持的设置将通过散布错误的精度值来显示这一点。

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

通过编程,您可以执行以下操作:

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

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

原因是,当您为Ti配备/功能工程师时,您需要在CVi上进行测试,而CVi在该模型上是看不到的。而如果您是T1的合适/特征工程师,那么您选择的任何CV都必须是T1的子集,因此您会感到乐观,即会过度拟合,因为您正在针对相同的数据样本进行训练和测试。

一个真正好的StackExchange的回答是一个,这确实说明了它更深入,并与代码的例子。另请参阅作为附录。


1
您能否提供这些链接内容的简短摘要?我们希望使用独立的答案,否则,如果链接更改位置,它们很容易受到“ linkrot”的影响。或者,我们可以将其转换为您的评论。
银鱼

@Silverfish完成
Abhishek Divekar '16

那么在for循环中,对于不同的折叠倍数可能会有不同的选择特征?
stackunderflow

2

Efron-Gong的“乐观”引导程序对此非常有用。想法是使用所有可用数据来开发预测模型,并使用所有数据来估计同一模型的未来可能性能。对于任何拆分样本方法,您的样本大小都小100倍。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.