交叉验证中的 PCA;然而,只有一部分变量

乔什·埃里克森

这个问题与caret 中交叉验证中的预处理非常相似但是,在我正在进行的一个项目中,在我的情况下,我只想对 19 个预测变量中的三个预测变量进行 PCA。这是插入符号中交叉验证中预处理的示例,PimaIndiansDiabetes为了方便起见,我将使用此数据 ( )(这不是我的项目数据,但概念应该相同)。然后我想只对变量的子集进行预处理,即 PimaIndiansDiabetes[, c(4,5,6)]。有没有办法做到这一点?

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

control <- trainControl(method="cv", 
                        number=5)
p <- preProcess(PimaIndiansDiabetes[, c(4,5,6)], #only do these columns!
                     method = c("center", "scale", "pca"))
p
grid=expand.grid(mtry=c(1,2,3))

model <- train(diabetes~., data=PimaIndiansDiabetes, method="rf", 
               preProcess= p, 
               trControl=control,
               tuneGrid=grid)

但我收到此错误:

Error: pre-processing methods are limited to: BoxCox, YeoJohnson, expoTrans, invHyperbolicSine, center, scale, range, knnImpute, bagImpute, medianImpute, pca, ica, spatialSign, ignore, keep, remove, zv, nzv, conditionalX, corr

我尝试这样做的原因是我可以将三个变量减少到一个 PCA1 并用于预测。在我正在做的项目中,所有三个变量的相关性都在 90% 以上,但我想将它们合并,因为其他研究也使用了它们。谢谢。尽量避免数据泄露!

误用

据我所知,这是不可能的。这可能可以使用食谱但是我不使用食谱,但我使用mlr3,所以我将展示如何使用这个包:

library(mlr3)
library(mlr3pipelines)
library(mlr3learners)
library(paradox)
library(mlr3tuning)
library(mlbench)

从数据创建任务:

data("PimaIndiansDiabetes")

pima_tsk <- TaskClassif$new(id = "Pima",
                            backend = PimaIndiansDiabetes,
                            target = "diabetes")

定义一个名为“slct1”的预处理选择器:

pos1 <- po("select", id = "slct1")

并在其中定义选择器函数:

pos1$param_set$values$selector <- selector_name(colnames(PimaIndiansDiabetes[, 4:6]))

现在定义所选功能应该发生的情况:缩放 -> 选择第一台 PC 时的 pca ( param_vals = list(rank. = 1))

pos1 %>>%
  po("scale", id = "scale1") %>>%
  po("pca", id = "pca1", param_vals = list(rank. = 1)) -> pr1

现在定义一个反转选择器:

pos2 <- po("select", id = "slct2")

pos2$param_set$values$selector <- selector_invert(pos1$param_set$values$selector)

定义学习者:

rf_lrn <- po("learner", lrn("classif.ranger")) #ranger is a faster version of rf

组合它们:

gunion(list(pr1, pos2)) %>>%
  po("featureunion") %>>%
  rf_lrn -> graph

检查它是否正常:

graph$plot(html = TRUE)

在此处输入图片说明

将图转换为学习器:

glrn <- GraphLearner$new(graph)

定义要调整的参数:

ps <-  ParamSet$new(list(
  ParamInt$new("classif.ranger.mtry", lower = 1, upper = 6),
  ParamInt$new("classif.ranger.num.trees", lower = 100, upper = 1000)))

定义重采样:

cv10 <- rsmp("cv", folds = 10)

定义调谐:

instance <- TuningInstance$new(
  task = pima_tsk,
  learner = glrn,
  resampling = cv10,
  measures = msr("classif.ce"),
  param_set = ps,
  terminator = term("evals", n_evals = 20)
)

set.seed(1)
tuner <- TunerRandomSearch$new()
tuner$tune(instance)
instance$result

有关如何调整 PC 组件数量以保持检查此答案的其他详细信息:R caret:如何在训练前将单独的 pca 应用于不同的数据帧?

如果您觉得这很有趣,请查看mlr3book

cor(PimaIndiansDiabetes[, 4:6])
          triceps   insulin      mass
triceps 1.0000000 0.4367826 0.3925732
insulin 0.4367826 1.0000000 0.1978591
mass    0.3925732 0.1978591 1.0000000

不会产生您在问题中提到的内容。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

CSS文件中只有一部分不起作用

从pandas数据框中删除重复的行,其中只有一部分是相同的

替换powershell中变量的一部分而不替换其余部分?

目标C-if条件中只有一部分起作用

验证邮件后缀的一部分

验证对象Spring的一部分

验证它是此模块的一部分

如何在Nginx中获取$ host变量的一部分?

将段落的一部分复制到变量中

读取行的一部分以存储在变量中

将字符串的一部分放入变量中

在作为回调一部分的嵌套函数中传递或访问变量

在Theano中更新共享变量的一部分

如何在模板文件中替换变量名的一部分

如何将字符串的一部分提取到变量中?

捕获JSON响应的一部分并保存到变量中?

仅将输出的一部分存储到shell变量中

将JSON对象的一部分存储在javascript变量中

Kotlin中的静态变量是否仍然是实例对象的一部分

在python中剪切一部分字符串变量(网络抓取)

如何将 javascript 对象的一部分存储到变量中?

仅在ggplot的x轴标签中显示交互x变量的一部分

jQuery-如何找出变量的一部分是否在数组中

C ++标准的哪一部分允许在括号中声明变量?

在 Python 中的函数内用作变量名一部分的参数

使用“for 循环”中的 i 作为变量的一部分

有没有办法在fortran中读取文件的一部分?

数组局部变量的哪一部分存储在堆栈中?哪一部分在堆上?

从Java中的现有图像中剪切图像的一部分