首页 文章

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

提问于
浏览
2

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

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

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

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)

1 回答

  • 0

    你的担忧在正确的位置 . 有很多方法可以引入积极的偏见 .

    根据插入符号的创建者Max Kuhn, train 中指定 preProcess 时没有数据泄漏:

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

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

相关问题