PCA 和训练/测试拆分

机器算法验证 机器学习 分类 主成分分析 交叉验证
2022-01-24 10:35:17

我有一个数据集,我有多组二进制标签。对于每组标签,我训练一个分类器,通过交叉验证对其进行评估。我想使用主成分分析(PCA)来降低维度。我的问题是:

是否可以对整个数据集进行一次PCA ,然后如上所述使用较低维度的新数据集进行交叉验证?还是我需要为每个训练集做一个单独的 PCA(这意味着为每个分类器和每个交叉验证折叠做一个单独的 PCA)?

一方面,PCA 不使用任何标签。另一方面,它确实使用测试数据进行转换,所以我担心它可能会使结果产生偏差。

我应该提到,除了为我节省一些工作之外,对整个数据集执行一次 PCA 可以让我一次可视化所有标签集的数据集。如果每个标签集都有不同的 PCA,我需要分别可视化每个标签集。

3个回答

为了测量泛化误差,您需要执行后者:为每个训练集使用单独的 PCA(这意味着为每个分类器和每个 CV 折叠执行单独的 PCA)。

然后,您将相同的转换应用于测试集:即您不在测试集上执行单独的 PCA!您减去训练集的平均值(如果需要,除以标准差),如下所述:在训练集上的 PCA 之后将测试集归零然后将数据投影到训练集的 PC 上。


  • 您需要为要使用的 PC 数量定义一个自动标准。
    由于这只是“实际”分类之前的第一个数据缩减步骤,因此使用过多的 PC 可能不会损害性能。如果您期望从经验中有多少台 PC 是好的,您也许可以直接使用它。

  • 您还可以在之后测试是否需要为每个代理模型重做 PCA(仅使用一个 PCA 模型重复分析)。我认为这个测试的结果是值得报告的。

  • 我曾经测量过不重复 PCA 的偏差,发现用我的光谱分类数据,在不重做每个代理模型的 PCA 时,我只检测到一半的泛化错误率。

  • 也相关:https ://stats.stackexchange.com/a/240063/4598

话虽如此,您可以为整个数据集构建一个额外的 PCA 模型,用于描述(例如可视化)目的。只要确保将这两种方法彼此分开即可。


我仍然发现很难了解整个数据集上的初始 PCA 如何在没有看到类标签的情况下对结果产生偏差。

但它确实看到了数据。如果类间方差与类内方差相比较大,则类间方差会影响 PCA 投影。通常会完成 PCA 步骤,因为您需要稳定分类。也就是说,在其他情况确实会影响模型的情况下。

如果类间方差很小,这种偏差不会很大,但在这种情况下,PCA 也不会帮助分类:PCA 投影无法帮助强调类之间的分离。

这个问题的答案取决于你的实验设计。只要您不需要在知道要预测的数据之前构建模型,就可以对整个数据集进行 PCA。如果您有一个数据集,其中有一堆样本,其中一些是已知的,一些是未知的,并且您想预测未知数,包括 PCA 中的未知数将为您提供更丰富的数据多样性视图,并有助于提高性能的模型。由于 PCA 是无监督的,因此它不是“峰值”,因为您可以对未知样本做同样的事情,就像对已知样本一样。

另一方面,如果您有一个数据集,您现在必须在其中构建模型,并且在将来的某个时候您将获得必须使用该预构建模型预测的新样本,则您必须在每个折叠中执行单独的 PCA确保它会泛化。由于在这种情况下,我们不知道新特征可能是什么样子,并且我们无法重建模型来解释新特征,因此对测试数据进行 PCA 将是“峰值”。在这种情况下,当模型在实践中使用时,未知样本的特征和结果都不可用,因此在训练模型时它们不应该可用。

每次在训练集上做后者, PCA

在 PCA 中,我们学习简化矩阵:U,它帮助我们得到投影Z_train = U x X_train

在测试时,我们使用从训练阶段学到的相同U,然后计算投影Z_test = U x X_test

因此,本质上我们是将测试集投影到训练期间获得的缩减特征空间上。

基本假设是测试集和训练集应该来自相同的分布,这解释了上述方法。