Перекрестная проверка в небольших наборах данных
У меня действительно небольшой набор данных (124 образца), и я хотел бы попробовать, получу ли я интересные результаты с некоторыми алгоритмами машинного обучения в R.
Что я сделал: я разделил свой набор данных на 75% для обучения и 25% для теста и обучил шесть разных моделей со следующей структурой:
fitControl <- trainControl(## 10-fold CV
method = "repeatedcv",
number = 10,
## repeated five times
repeats = 5,
savePredictions = TRUE,
classProbs = TRUE,
summaryFunction = twoClassSummary)
model_SVM_P <- train(Group ~ ., data = training_set,
method = "svmPoly",
trControl = fitControl,
metric = "Accuracy",
verbose = FALSE,
tuneLength = 10)
Однако я только начал изучать машинное обучение и глубокое обучение, и часть перекрестной проверки всегда трудно понять.
Возникает вопрос: в коде есть только шаг внутренней перекрестной проверки, нужно ли делать внешний цикл для cv? Если да, как я могу это закодировать?
РЕДАКТИРОВАТЬ:
Просто обновление, которое может быть полезно, если кто-то проходит мимо с той же проблемой:
Я сделал это и работал нормально:
folds <- createFolds(training_set$Group,4) split_up <- lapply(folds, function(ind, dat) dat[ind,], dat = training_set) parms_list_SVM_P <- list() model_list_SVM_P <- list() for (i in 1:4) {model_SVM_P <- train(Group ~ ., data = split_up[[i]], method = "svmPoly", trControl = fitControl, metric = "Accuracy", verbose = FALSE, tuneLength = 10) model_list_SVM_P[[i]] <- model_SVM_P parms_list_SVM_P[[i]] <- model_SVM_P$bestTune}
Теперь перехожу к дальнейшему анализу.
Если кто-то более опытный обнаружит ошибку, сообщите мне.
Эта ссылка мне очень помогла: https://stackoverflow.com/questions/62183291/statistical-test-with-test-data/62193116#62193116
Ответы
Следует учитывать 2 момента:
вам нужен шаг внешней проверки всякий раз, когда вы используете результаты внутренней проверки для настройки вашей модели.
Причина в том, что настройка на основе оценки производительности с зашумлением приводит к тому, что эта оценка становится оптимистически смещенной в качестве оценки производительности.Ваши оценки производительности зашумлены из-за небольшого числа тестовых примеров (найдите биномиальные доверительные интервалы и пропорции измерения). Например, если вы наблюдаете 3 неправильной классификации из 31 протестированного случая, это будет 90% точность с 95% доверительным интервалом 77–97%.
Другими словами, если наблюдаемая производительность вашей настроечной сетки не имеет резких различий между лучшими и худшими моделями, вы не сможете надежно выбрать, основываясь на таком небольшом количестве проверенных случаев.
Что делать?
(повторная) перекрестная проверка во внутренней (оптимизационной) проверке дает несколько более надежные оценки производительности. (Впрочем, чудес не ждите.)
Точность (или другие пропорции) подвержены очень большой неопределенности дисперсии - для уверенности требуются очень большие размеры тестовой выборки. У них есть дополнительные характеристики, которые делают их не очень подходящими в качестве целевого функционала для оптимизации. Посмотрите, можете ли вы вместо этого использовать (строго) правильное правило оценки .
В небольших наборах данных, таких как ваш случай, это настоятельно рекомендуется, потому что разделение поезд / тест может быть шумным. Ваши оценки производительности будут намного более надежными, если вы сделаете внешнее резюме. Насколько я знаю, вам нужно самостоятельно кодировать внешнее резюме и использовать свой код внутри цикла как есть. Это может помочь.