1. при выполнении предварительной обработки (pca) в функции поезда:
- pca запускается на каждом наборе поездов во время CV, и набор поездов преобразуется
- оценивается несколько моделей регрессии гребня (на основе поиска определенных гиперпараметров) для каждого из этих преобразованных наборов поездов.
- на основе pca, полученного для каждого набора поездов, соответствующий набор тестов преобразуется
- все подходящие модели оцениваются на соответствующих преобразованных тестовых наборах
Когда это закончено, окончательная модель строится с гиперпараметрами, которые имели наилучшие средние характеристики на тестовых наборах:
- pca применяется ко всем данным набора поездов и получается преобразованные данные поезда.
- с использованием предварительно выбранных гиперпараметров модель регрессии гребня строится на преобразованных данных поезда
Когда вы выполняете предварительную обработку (pca) перед функцией поезда, вы вызываете утечку данных , так как выпойте информацию из ваших тестовых сгибов CV для оценки координат pca. Это вызывает оптимистический уклон во время CV и его следует избегать.
2. Мне не известны встроенные функции каретки, которые бы обеспечивали это жонглирование несколькими наборами данных. Я верю, что это может быть достигнуто с mlr3pipelines . Особенно этот учебник удобен.
Вот пример того, как разделить набор данных радужной оболочки на два набора данных, применить масштабирование и pca к каждому из них, объединить преобразованные столбцы и подобрать модель rpart. Настройка количества сохраняемых компонентов PCA, а также одного гиперпараметра rpart с помощью случайного поиска:
пакетов:
library(mlr3pipelines)
library(visNetwork)
library(mlr3learners)
library(mlr3tuning)
library(mlr3)
library(paradox)
определяет конвейер селектора с именем "slct1":
pos1 <- po("select", id = "slct1")
скажите ему, какие столбцы выбрать:
pos1$param_set$values$selector <- selector_name(c("Sepal.Length", "Sepal.Width"))
скажите, что делать после того, как он получит функции
pos1 %>>%
mlr_pipeops$get("scale", id = "scale1") %>>%
mlr_pipeops$get("pca", id = "pca1") -> pr1
определите селектор pipeop с именем "slct2":
pos2 <- po("select", id = "slct2")
скажите ему, какие столбцы выбрать:
pos2$param_set$values$selector <- selector_name(c("Petal.Length", "Petal.Width"))
скажите, что делать после того, как он получит функции
pos2 %>>%
mlr_pipeops$get("scale", id = "scale2") %>>%
mlr_pipeops$get("pca", id = "pca2") -> pr2
объедините два выхода:
piper <- gunion(list(pr1, pr2)) %>>%
mlr_pipeops$get("featureunion")
и отправьте их ученику:
graph <- piper %>>%
mlr_pipeops$get("learner",
learner = mlr_learners$get("classif.rpart"))
давайте проверим, как это выглядит:
graph$plot(html = TRUE)
Теперь определите, как это должно быть настроено:
glrn <- GraphLearner$new(graph)
10 кратное CV:
cv10 <- rsmp("cv", folds = 10)
Настройте количество измерений PCA, сохраненных для каждого набора данных, а также параметр сложности rpart:
ps <- ParamSet$new(list(
ParamDbl$new("classif.rpart.cp", lower = 0, upper = 1),
ParamInt$new("pca1.rank.", lower = 1, upper = 2),
ParamInt$new("pca2.rank.", lower = 1, upper = 2)
))
определить задачу и настройку:
task <- mlr_tasks$get("iris")
instance <- TuningInstance$new(
task = task,
learner = glrn,
resampling = cv10,
measures = msr("classif.ce"),
param_set = ps,
terminator = term("evals", n_evals = 20)
)
Инициировать случайный поиск:
tuner <- TunerRandomSearch$new()
tuner$tune(instance)
instance$result
Возможно, это также можно сделать with tidymodels hover Я еще не попробовал их.
РЕДАКТИРОВАТЬ: чтобы ответить на вопросы в комментариях.
Чтобы полностью понять mlr3, я советую вам прочитать книгу , а также учебные пособия для каждого из дополнительных пакетов.
В приведенном выше примере количество измерений PCA, сохраняемых для каждого из наборов данных, было настроено совместно с гиперпараметром cp
. Это было определено в этой строке:
ps <- ParamSet$new(list(
ParamDbl$new("classif.rpart.cp", lower = 0, upper = 1),
ParamInt$new("pca1.rank.", lower = 1, upper = 2),
ParamInt$new("pca2.rank.", lower = 1, upper = 2)
))
Таким образом, для pca1 алгоритм мог выбрать 1 или 2 ПК для сохранения (я установил его таким образом, поскольку в каждом наборе данных есть только две функции)
Если вы не хотите настраивать количество измерений для оптимизации производительности, вы можете определить pipeop
следующим образом:
pos1 %>>%
mlr_pipeops$get("scale", id = "scale1") %>>%
mlr_pipeops$get("pca", id = "pca1", param_vals = list(rank. = 1)) -> pr1
, в этом случае вы должны опустить его в наборе параметров:
ps <- ParamSet$new(list(
ParamDbl$new("classif.rpart.cp", lower = 0, upper = 1)
))
Насколько я знаю, объяснение отклонения в настоящее время не может быть изменено только для количества сохраненных измерений для преобразования pca.
Чтобы изменить тип предсказания, можно определить ученика:
learner <- mlr_pipeops$get("learner",
learner = mlr_learners$get("classif.rpart"))
и задайте тип прогнозирования:
learner$learner$predict_type <- "prob"
, а затем создайте график:
graph <- piper %>>%
learner
Чтобы получить производительность для каждой комбинации гиперпараметров:
instance$archive(unnest = "params")
Чтобы получить прогнозы для каждой комбинации гиперпараметров:
lapply(as.list(instance$archive(unnest = "params")[,"resample_result"])$resample_result,
function(x) x$predictions())
Чтобы получить прогнозы для лучшей комбинации гиперпараметров:
instance$best()$predictions()
Если вам это нужно в виде фрейма данных:
do.call(rbind,
lapply(instance$best()$predictions(),
function(x) data.frame(x$data$tab,
x$data$prob)))
, вероятно, есть некоторые дополнительные функции, которые делают это проще, я просто не наигрался.