PCA в рамках перекрестной проверки; однако только с подмножеством переменных - PullRequest
0 голосов
/ 02 марта 2020

Этот вопрос очень похож на препроцесс в рамках перекрестной проверки в карете ; однако, в проекте, над которым я работаю, я бы хотел сделать PCA только для трех предикторов из 19 в моем случае. Вот пример из препроцесса при перекрестной проверке в карете , и я буду использовать эти данные (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%, но я хотел бы включить их, так как другие исследования также использовали их. Спасибо. Пытаясь избежать утечки данных!

1 Ответ

0 голосов
/ 02 марта 2020

Насколько я знаю, это невозможно с помощью карета. Это может быть возможно при использовании recipes . Однако я не использую рецепты, но я использую 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]))

теперь определить, что должно происходить с выбранными функциями: масштабирование -> pca с выбранным 1-м P C (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)

enter image description here

конвертируйте график в ученика :

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

Для дополнительные сведения о том, как настроить количество компонентов P C, чтобы продолжить, проверьте этот ответ: R каретка: Как применить отдельный 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

не дает того, что вы упоминаете в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...