R中插入符号包中的PCA和k-fold交叉验证

机器算法验证 r 主成分分析 交叉验证 插入符号
2022-02-09 05:08:18

我刚刚重新观看了 Coursera 机器学习课程的讲座。在教授讨论 PCA 在监督学习应用程序中预处理数据的部分中,他说 PCA 应该只对训练数据执行,然后使用映射来转换交叉验证和测试集。另请参阅PCA 和训练/测试拆分

但是,在caretR 包中,您传递给train()函数的训练数据已经由 PCA 处理。因此,当算法执行 k 折交叉验证时,交叉验证集已经通过 PCA 进行了处理,preProcess()并且predict()实际上用于 PCA“拟合”。

我对情况的理解正确吗?即插入符号的使用 PCA 进行交叉验证的程序(或者实际上,使用任何重新缩放/居中方法)是“错误的”,因为数据的预处理是在交叉验证集和训练集上执行的?如果是这样,这会对结果产生多大的影响?

2个回答

不要在运行train函数之前预处理数据!使用 train 函数的preProcess 参数,预处理将应用于每次重新采样迭代。

例如 要这样做:

library(caret)
dat <- iris
pp <- preProcess(dat[,-5], method="pca")
dat[,-5] <- predict(pp, dat[,-5])
knnFit1 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))

做这个!

dat <- iris
knnFit2 <- train(Species~., dat, method = "knn", preProcess=c("pca"), 
    trControl = trainControl(method = "cv"))

我没有看到讲座,所以我无法评论所说的内容。

我的 0.02 美元:如果您想使用重采样获得良好的性能估计,您应该在重采样期间而不是之前执行所有操作。这对于特征选择 [1] 以及像 PCA 这样的非平凡操作都是如此。如果它给结果增加了不确定性,请将其包括在重新采样中。

考虑主成分回归:PCA,然后是一些成分的线性回归。PCA 估计参数(有噪声)和组件的数量也必须选择(不同的值会导致不同的结果 => 更多的噪声)。

假设我们在方案 1 中使用了 10 倍 CV:

conduct PCA
pick the number of components
for each fold:
   split data
   fit linear regression on the 90% used for training
   predict the 10% held out
end:

或方案2:

for each fold:
   split data
   conduct PCA on the 90% used for training
   pick the number of components
   fit linear regression
   predict the 10% held out
end:

应该清楚的是,第二种方法应该产生反映由 PCA、组件数量选择和线性回归引起的不确定性的误差估计。实际上,第一个方案中的 CV 不知道它之前的内容。

我并不总是在重采样中进行所有操作,但只有当我并不真正关心性能估计时(这是不寻常的),我才会感到内疚。

两种方案有很大区别吗?这取决于数据和预处理。如果您只是居中和缩放,可能不会。如果您有大量数据,则可能没有。随着训练集大小的下降,得到错误估计的风险会上升,尤其是当 n 接近 p 时。

我可以根据经验肯定地说,在重采样中不包括监督特征选择是一个非常糟糕的主意(没有大型训练集)。我不明白为什么预处理会对此免疫(在某种程度上)。

@mchangun:我认为组件的数量是一个调整参数,您可能希望使用可概括的性能估计来选择它。您可以自动选择 K,以便解释至少 X% 的方差,并将该过程包括在重采样中,以便我们考虑该过程中的噪声。

最大限度

[1] Ambroise, C. 和 McLachlan, G. (2002)。基于微阵列基因表达数据的基因提取中的选择偏差。美国国家科学院院刊,99(10),6562-6566。