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


16

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

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

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


1
有趣的问题。吴教授是否给出原因“为什么只应对训练数据进行PCA,然后使用映射来转换交叉验证和测试集”?我的直觉是,应将影响降到最低,因为假定火车/ cv /测试数据来自相同的分布,并且PCA不涉及输出/因变量。
miura 2012年

1
@miura是的。在执行PCA时,我们需要在输出向量中求解最小k个维,以实现所需的“保留方差”。这个参数k现在(根据我的理解)实际上是我们需要拟合的算法的一个额外参数。如果我们也对交叉验证集执行PCA,则实际上是在CV集上训练了一部分算法,从而减小了交叉验证的价值。
mchangun 2012年

我认为您混淆了PCA和MDS,但是在这两种方法中,您都没有设置期望的保留方差。但是,您可以根据调整后的尺寸(减少到k个尺寸)来计算它。您不需要拟合它,因为第一个维度将始终比第二个维度减少更多的方差,而第二个维度将比第三个维度减少的更多...
llrs

Answers:


18

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

我的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。


21

在运行该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"))

1
如果我按照您的建议进行prProcess,则当我要将模型用于预测时是否需要预处理新数据?目前,我只做: pred <- predict(knnFit2, newdata) 这里newdata不进行缩放。插入符号是否足够聪明,可以知道newdata在进行预测之前需要进行预处理?
mchangun

7
@mchangun没有 插入符保存预处理参数,并将在predict.caret调用中预处理新数据。非常漂亮!
Zach 2013年
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.