插入符号交叉验证中的预处理

zes*_*sla 5 r r-caret

我有一个关于数据预处理的问题需要澄清。据我了解,当我们通过交叉验证调整超参数并估计模型性能时,我们需要在交叉验证中进行,而不是预处理整个数据集。换句话说,在交叉验证中,我们对训练折叠进行预处理,然后使用相同的预处理参数来处理测试折叠并进行预测。

在下面的示例代码中,当我在 caret::train 中指定 preProcess 时,它会自动执行此操作吗?如果有人能澄清我这一点,我真的很感激。

从一些在线资源来看,有些人预处理整个数据集(训练集),然后使用预处理数据通过交叉验证来调整超参数,这似乎不对......

library(caret)
library(mlbench)
data(PimaIndiansDiabetes)

control <- trainControl(method="cv", 
                        number=5,
                        preProcOptions = list(pcaComp=4))
grid=expand.grid(mtry=c(1,2,3))

model <- train(diabetes~., data=PimaIndiansDiabetes, method="rf", 
               preProcess=c("scale", "center", "pca"), 
               trControl=control,
               tuneGrid=grid)
Run Code Online (Sandbox Code Playgroud)

mis*_*use 4

您的担忧是对的。引入积极偏见的方法有很多。

preProcess根据插入符号的创建者 Max Kuhn 的说法,当中指定时不会发生数据泄漏train

所有预处理均应用于数据的重采样版本(例如,10 倍 CV 中的 90%),然后将这些计算应用于保留数据(剩余的 10%),无需重新计算。

来源: https: //github.com/topepo/caret/issues/335