Перекрестная проверка в небольших наборах данных

Aug 20 2020

У меня действительно небольшой набор данных (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 cbeleitesunhappywithSX Aug 21 2020 at 06:56

Следует учитывать 2 момента:

  • вам нужен шаг внешней проверки всякий раз, когда вы используете результаты внутренней проверки для настройки вашей модели.
    Причина в том, что настройка на основе оценки производительности с зашумлением приводит к тому, что эта оценка становится оптимистически смещенной в качестве оценки производительности.

  • Ваши оценки производительности зашумлены из-за небольшого числа тестовых примеров (найдите биномиальные доверительные интервалы и пропорции измерения). Например, если вы наблюдаете 3 неправильной классификации из 31 протестированного случая, это будет 90% точность с 95% доверительным интервалом 77–97%.

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

Что делать?

  • (повторная) перекрестная проверка во внутренней (оптимизационной) проверке дает несколько более надежные оценки производительности. (Впрочем, чудес не ждите.)

  • Точность (или другие пропорции) подвержены очень большой неопределенности дисперсии - для уверенности требуются очень большие размеры тестовой выборки. У них есть дополнительные характеристики, которые делают их не очень подходящими в качестве целевого функционала для оптимизации. Посмотрите, можете ли вы вместо этого использовать (строго) правильное правило оценки .

2 gunes Aug 20 2020 at 14:50

В небольших наборах данных, таких как ваш случай, это настоятельно рекомендуется, потому что разделение поезд / тест может быть шумным. Ваши оценки производительности будут намного более надежными, если вы сделаете внешнее резюме. Насколько я знаю, вам нужно самостоятельно кодировать внешнее резюме и использовать свой код внутри цикла как есть. Это может помочь.