Validación cruzada en pequeños conjuntos de datos
Tengo un conjunto de datos realmente pequeño (124 muestras) y me gustaría probar si obtengo algunos resultados interesantes con algunos algoritmos de aprendizaje automático en R.
Lo que hice: dividí mi conjunto de datos en 75% de entrenamiento y 25% de prueba, y entrené seis modelos diferentes con una estructura similar a la siguiente:
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)
Sin embargo, recién comencé a estudiar sobre aprendizaje automático y aprendizaje profundo, y la parte de validación cruzada es siempre difícil de entender.
La pregunta es: en el código solo existe el paso de validación cruzada interna, ¿es necesario hacer un bucle externo para cv? Si es así, ¿cómo puedo codificarlo?
EDITAR:
Solo una actualización que puede ser útil si alguien pasa con el mismo problema:
Hice esto y funcioné bien:
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}
Ahora paso a un análisis más detallado.
Si alguien con más experiencia encuentra un error, hágamelo saber.
Este enlace me ayudó mucho: https://stackoverflow.com/questions/62183291/statistical-test-with-test-data/62193116#62193116
Respuestas
Hay 2 puntos a considerar:
se necesita una etapa de validación externa siempre que utilice los resultados de la validación interna para ajustar su modelo.
La razón es que el ajuste mediante una estimación de rendimiento ruidosa hace que esa estimación se sesgue de manera optimista como una estimación de rendimiento.Sus estimaciones de rendimiento son ruidosas debido a la pequeña cantidad de casos de prueba (busque intervalos de confianza binomiales y proporciones de medición). Por ejemplo, si observa 3 clasificaciones erróneas de 31 casos probados, esto es una precisión del 90% con un intervalo de confianza del 95% del 77 al 97%.
En otras palabras, a menos que el rendimiento observado para su cuadrícula de sintonización tenga grandes diferencias entre los mejores y peores modelos, no puede elegir de manera confiable basándose en tan pocos casos probados.
¿Qué hacer?
La validación cruzada (repetida) en la validación interna (optimización) le brinda estimaciones de rendimiento algo más confiables. (Sin embargo, no espere milagros).
La precisión (u otras proporciones) están sujetas a una gran incertidumbre de la varianza: necesitan tamaños de muestra de prueba muy grandes para estar seguros. Tienen otras características que los hacen no muy adecuados como objetivo funcional para la optimización. Vea si puede usar una regla de puntuación (estrictamente) adecuada en su lugar.
En conjuntos de datos pequeños, como su caso, se recomienda encarecidamente porque la división de tren / prueba puede ser ruidosa. Tus estimaciones de rendimiento serán mucho más sólidas si haces un CV externo. Hasta donde yo sé, necesitas codificar el CV externo por ti mismo y usar tu código dentro del ciclo tal como está. Esto puede ayudar.