Вот подход с использованием пакета mlr:
library(mlr)
library(base)
library(tidyverse)
dataset <- read_csv("https://gist.githubusercontent.com/dmpe/bfe07a29c7fc1e3a70d0522956d8e4a9/raw/7ea71f7432302bb78e58348fede926142ade6992/pima-indians-diabetes.csv", col_names=FALSE)
X = dataset[, 1:8]
Y = as.factor(ifelse(dataset$X9 == 1, 'diabetes', 'nondiabetes'))
создать задачу mlr:
mlr_task <- makeClassifTask(data = data.frame(X, Y),
target = "Y",
positive = "diabetes")
определить повторную выборку:
set.seed(7)
cv3 <- makeResampleInstance(makeResampleDesc("CV", iters = 3),
task = mlr_task)
определить типпоиска гиперпараметров
ctrl <- makeTuneControlRandom(maxit = 10L)
определить ученика
lrn <- makeLearner("classif.ksvm", predict.type = "prob")
опционально проверить параметры ученика, чтобы увидеть, какие из них настраиваются
mlr::getLearnerParamSet(lrn)
определить пространство поиска (vanilladotлинейное ядро в пакете kernlab, которое внутренне вызывается для "classif.ksvm").Больше информации об интегрированных учениках в mlr: https://mlr.mlr -org.com / Articles / Tutorial / integrated_learners.html
ps <- makeParamSet(makeDiscreteParam("kernel", "vanilladot"),
makeNumericParam("C", lower = 2e-6, upper = 2e-6))
Настройка гиперпараметров.Я просто установил некоторые случайные меры, первый из перечисленных используется для оценки эффективности, другие для демонстрации.
res <- tuneParams(lrn,
mlr_task,
cv3,
measures = list(auc, bac, f1),
par.set = ps,
control = ctrl)
установка оптимальных гиперпараметров для ученика
lrn <- setHyperPars(lrn, par.vals = res$x)
повторная выборка с models = TRUE
rsmpls <- resample(lrn,
mlr_task,
cv3,
measures = list(auc, bac, f1),
models = TRUE)
в моделях
rsmpls$models[[1]]$learner.model
rsmpls$models[[2]]$learner.model
rsmpls$models[[3]]$learner.model
Для этого сначала настраиваются гиперпараметры, а затем выполняется другой набор перекрестной проверки с настроенными параметрами натакие же сгибы.
альтернативный и, на мой взгляд, лучший подход состоит в том, чтобы выбрать гиперпараметры во внутренних сгибах вложенной перекрестной проверки и оценить внешние сгибы, сохраняя модели внешних сгибов в игре.
lrn <- makeLearner("classif.ksvm", predict.type = "prob")
определить стратегию внутренней передискретизации
cv3_inner <- makeResampleDesc("CV", iters = 3)
создать оболочку мелодии - определить, что происходит во внутреннем цикле перекрестной проверки
lrn <- makeTuneWrapper(lrn,
resampling = cv3_inner,
measures = list(auc, bac, f1),
par.set = ps,
control = ctrl)
выполнить внешнюю перекрестную проверку
rsmpls <- resample(lrn,
mlr_task,
cv3,
measures = list(auc, bac, f1),
models = TRUE)
Это выполняет трехкратное CV во внешнем цикле, в каждом обучающем экземпляре другое, три раза CV выполняется для настройки гиперпараметров и утра.odel подходит для всего обучающего экземпляра с оптимальными гиперпараметрами, эти модели оцениваются во внешних тестовых экземплярах.Это сделано для уменьшения предвзятости оценки.См. Также: https://mlr.mlr -org.com / Articles / Tutorial / nested_resampling.html