原则:
使用在整个数据集上训练的单个模型进行预测(因此只有一组特征)。交叉验证仅用于估计在整个数据集上训练的单个模型的预测性能。使用交叉验证至关重要的是,在每个折叠中,您都重复用于拟合主要模型的整个过程,否则您最终可能会在性能上出现相当大的乐观偏差。
要了解为什么会发生这种情况,请考虑一个具有 1000 个二元特征但只有 100 个案例的二元分类问题,其中案例和特征都是纯随机的,因此特征和案例之间没有任何统计关系。如果我们在完整数据集上训练一个主要模型,我们总是可以在训练集上实现零错误,因为特征多于案例。我们甚至可以找到“信息丰富”特征的子集(碰巧相关)。如果我们然后仅使用这些特征执行交叉验证,我们将获得比随机猜测更好的性能估计。原因是在交叉验证过程的每一部分中,都有一些关于用于测试的保留案例的信息,因为选择了这些特征,因为它们有利于预测,所有这些,包括那些坚持的。当然,真正的错误率是 0.5。
如果我们采用正确的程序,并在每个折叠中执行特征选择,则在选择该折叠中使用的特征时不再有任何关于保留案例的信息。如果您使用正确的程序,在这种情况下,您将获得大约 0.5 的错误率(尽管对于数据集的不同实现会有所不同)。
值得阅读的好论文是:
Christophe Ambroise,Geoffrey J. McLachlan,“基于微阵列基因表达数据的基因提取中的选择偏差”,PNAS http://www.pnas.org/content/99/10/6562.abstract
这与 OP 高度相关,并且
Gavin C. Cawley, Nicola LC Talbot,“论模型选择中的过度拟合和性能评估中的后续选择偏差”,JMLR 11(七月):2079−2107,2010 http://jmlr.csail.mit.edu/papers /v11/cawley10a.html
这表明在模型选择中很容易发生同样的事情(例如调整 SVM 的超参数,这也需要在 CV 过程的每次迭代中重复)。
在实践中:
我建议使用 Bagging,并使用袋外错误来估计性能。您将获得使用许多功能的委员会模型,但这实际上是一件好事。如果您只使用单个模型,您可能会过度拟合特征选择标准,并最终得到一个比使用大量特征的模型给出更差预测的模型。
Alan Millers 关于回归中的子集选择的书(Chapman 和 Hall 关于统计和应用概率的专着,第 95 卷)给出了一个很好的建议(第 221 页),如果预测性能是最重要的事情,那么不要进行任何特征选择,只需使用岭回归。那是在一本关于子集选择的书中!!!;o)