PCA、SMOTE 和交叉验证——如何将它们结合在一起?

数据挖掘 机器学习 分类 交叉验证 主成分分析 打击
2021-10-14 03:34:29

我最近阅读了很多关于 PCA 和交叉验证的内容,似乎大多数人认为在交叉验证之前进行 PCA 是一种不当行为。我也想执行 SMOTE,但在 PCA 之前或之后执行 SMOTE 的人之间存在分歧。是的,我很困惑,但即使是已发表论文的作者似乎也对此感到困惑(我是新手)。即使在这里(在 CrossValidate 上),关于 SMOTE 和 PCA 的相同 Q 也有不同的答案,要点是,看看什么适合您的数据。无论如何,我知道如何自己执行每个操作,但不知道如何在每个折叠中执行 PCA,例如在 Kfold 或任何其他交叉验证方法中。

1-有人可以与我分享如何在 Kfold 中进行 PCA 吗?也许通过循环或管道?

2-我个人对 SMOTE/PCA 的事情有两极的看法: a-我认为 PCA 应该在 SMOTE 之前执行,以便在我们采样之前对主要(真实)训练数据进行降维(在我的情况下是上采样)。b-我对此的另一个想法是,如果您上采样然后执行 SMOTE,那么您的降维是基于“无偏”组样本(现在两个组具有相同的数字)。我的问题是,如果我是 CV(交叉验证)PCA,我可以在组合中加入 SMOTE 吗?

3-最后一个问题,我看到了一个教授的视频。谁说如果你测试/分割你的数据,然后在训练集上进行 CV PCA,这是错误的。由于交叉验证,例如 Kfold 已经为您进行了训练/测试拆分。是这样吗?如果是这样,那么我最终将如何选择我的 X_test X_train y_test y_train 进行进一步分析?

1个回答

为避免数据泄漏,在拆分数据后进行任何转换很重要 - 所以是的,您希望 PCA 适合您的训练集/折叠,但将该转换应用于训练和测试数据(当您想考虑泛化时) .

Scikit-learn 使用sklearn.pipeline.Pipeline使这个过程变得简单,并且有一个很好的例子,其中 5 倍 CV 在PCA 到逻辑回归的链上完成,这应该会给你一些基础。

为了解决您的第二个问题,在进行训练测试或 CV 拆分后,没有什么能阻止您将 SMOTE 包含在组合中,但在不了解数据和情况的情况下,我不会进一步评论。

最后,没有必要在 k-fold CV 中嵌套训练测试拆分,因为正如您所说,k-fold CV 包含一个测试集。然而,对于最终的模型选择,更严格的方法是在你做任何其他事情之前分离出最终的验证集。在该训练数据上进行 k 倍 CV 实验以选择任何模型和参数,并将验证结果用作泛化的最终估计。

为了实现这一点,上面的 scikit-learn 示例展示了如何评估不同参数对分类器的影响。它没有显示最终的模型选择和评估,但需要做的只是在示例中的所有内容之前分离出合理数量的数据,然后采用最佳模型并评估它们在该验证中的性能放。