Как обучить данные вручную за фолд с k-кратным CV в R? - PullRequest
0 голосов
/ 27 июня 2019

У меня есть следующий сегмент кода, который работает для меня, и я получаю результат модели:

library(base)
library(caret)
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'))

set.seed(88)

nfolds <- 3
cvIndex <- createFolds(Y, nfolds, returnTrain = T)

fit.control <- trainControl(method="cv",
                            index=cvIndex,
                            number=nfolds,
                            classProbs=TRUE,
                            savePredictions=TRUE,
                            verboseIter=TRUE,
                            summaryFunction=twoClassSummary,
                            allowParallel=FALSE)

model <- caret::train(X, Y,
                      method = "svmLinear",
                      trControl = fit.control,
                      preProcess=c("center","scale"),
                      tuneLength=10)

Используя это, я могу получить доступ к окончательной модели как model$finalModel, однако в этом случае вместо одной конечной модели, я на самом деле хочу иметь 3 модели, поскольку у меня есть 3-кратное. Итак, я хочу получить обученную модель после первого сгиба, затем после второго сгиба и, наконец, после третьего сгиба, что соответствует фактической конечной модели. Есть идеи, как этого добиться в R? Обратите внимание, что использование caret не является строгим, если вы можете сделать это с mlr, что также приветствуется.

Ответы [ 3 ]

1 голос
/ 27 июня 2019

Функция поезда в карете упрощает оценку модели и обучение https://cran.r -project.org / веб / пакеты / каретка / виньетки / caret.html

"оценить, используя повторную выборку, влияние параметров настройки модели на производительность выберите «оптимальную» модель по этим параметрам Оценить производительность модели из тренировочного набора "

Итак, модель, которую она дает, является оптимальной конечной моделью. Нет никаких оснований использовать модели, обученные на каждом сгибе. Я не знаю, как это сделать в R

0 голосов
/ 28 июня 2019

Вот подход с использованием пакета 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

0 голосов
/ 27 июня 2019

Не эксперт по машинному обучению, но почему бы не обучить модель случайной выборке и сохранить результат в списке?

   data <- read_csv("https://gist.githubusercontent.com/dmpe/bfe07a29c7fc1e3a70d0522956d8e4a9/raw/7ea71f7432302bb78e58348fede926142ade6992/pima-indians-diabetes.csv", col_names=FALSE)

    train_multiple_models <- function(data, kfolds) {
        resultlist <- list()
        for(i in 1:kfolds) {

            sample <- sample.int(n = nrow(data), size = floor(.75*nrow(data)), replace = F)
            train <- data[sample, ]

            X = train[, 1:8]
            Y = as.factor(ifelse(train$X9 == 1, 'diabetes', 'nondiabetes'))

            model <- caret::train(X, Y,
                                  method = "svmLinear",
                                  preProcess=c("center","scale"),
                                  tuneLength=10)
            resultlist[[i]] <- model
        }
        return(resultlist)
    }

    result <- train_multiple_models(data, kfolds = 3)


    > result[[1]]$finalModel
    Support Vector Machine object of class "ksvm" 

    SV type: C-svc  (classification) 
     parameter : cost C = 1 

    Linear (vanilla) kernel function. 

    Number of Support Vectors : 307 

    Objective Function Value : -302.065 
    Training error : 0.230903 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...