Convalida incrociata in piccoli set di dati
Ho un set di dati davvero piccolo (124 campioni) e mi piacerebbe provare se ottengo risultati interessanti con alcuni algoritmi di apprendimento automatico in R.
Cosa ho fatto: ho suddiviso il mio set di dati in 75% di allenamento e 25% di test e ho addestrato sei diversi modelli con la struttura simile come segue:
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)
Tuttavia, ho appena iniziato a studiare l'apprendimento automatico e l'apprendimento profondo e la parte della convalida incrociata è difficile da capire.
La domanda è: nel codice c'è solo la fase di convalida incrociata interna, è necessario fare un ciclo esterno per cv? Se sì, come posso codificarlo?
MODIFICARE:
Solo un aggiornamento che può essere utile se qualcuno sta passando con lo stesso problema:
L'ho fatto e ha funzionato bene:
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}
Ora sto procedendo ad ulteriori analisi.
Se qualcuno con più esperienza trova un errore, fammelo sapere.
Questo link mi ha aiutato molto: https://stackoverflow.com/questions/62183291/statistical-test-with-test-data/62193116#62193116
Risposte
Ci sono 2 punti da considerare:
è necessario un passaggio di convalida esterno ogni volta che si utilizzano i risultati della convalida interna per ottimizzare il modello.
Il motivo è che l'ottimizzazione di una stima rumorosa delle prestazioni fa sì che tale stima diventi distorta in modo ottimistico come stima delle prestazioni.Le stime delle prestazioni sono rumorose a causa del numero limitato di casi di test (cerca gli intervalli di confidenza binomiali e le proporzioni di misurazione). Ad esempio, se si osservano 3 classificazioni errate su 31 casi testati, questa è un'accuratezza del 90% con un intervallo di confidenza del 95% 77-97%.
In altre parole, a meno che le prestazioni osservate per la griglia di ottimizzazione non presentino differenze nette tra i modelli migliori e peggiori, non è possibile scegliere in modo affidabile in base a così pochi casi testati.
Cosa fare?
La convalida incrociata (ripetuta) nella convalida interna (di ottimizzazione) fornisce stime delle prestazioni un po 'più affidabili. (Non aspettarti miracoli, però.)
L'accuratezza (o altre proporzioni) sono soggette a un'incertezza di varianza molto ampia: per essere certi, hanno bisogno di campioni di dimensioni molto grandi. Hanno ulteriori caratteristiche che le rendono poco adatte come target funzionali all'ottimizzazione. Verifica se puoi invece utilizzare una regola di punteggio (rigorosamente) corretta .
In piccoli set di dati, come il tuo caso, è fortemente consigliato perché la divisione treno / test può essere rumorosa. Le stime del rendimento saranno molto più solide se esegui un CV esterno. Per quanto ne so, è necessario codificare da soli il CV esterno e utilizzare il codice all'interno del ciclo così com'è. Questo può aiutare.