Validation croisée dans de petits ensembles de données
J'ai un très petit ensemble de données (124 échantillons) et j'aimerais essayer si j'obtiens des résultats intéressants avec certains algorithmes d'apprentissage automatique dans R.
Ce que j'ai fait: j'ai divisé mon ensemble de données en 75% d'entraînement et 25% de test, et j'ai formé six modèles différents avec la structure similaire à la suivante:
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)
Cependant, je viens de commencer à étudier l'apprentissage automatique et l'apprentissage profond et la partie validation croisée est toujours difficile à comprendre.
La question est: dans le code, il n'y a que l'étape de validation croisée interne, est-il nécessaire de faire une boucle externe pour cv? Si oui, comment puis-je le coder?
ÉDITER:
Juste une mise à jour qui peut être utile si quelqu'un passe avec le même problème:
J'ai fait cela et j'ai bien fonctionné:
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}
Je procède maintenant à une analyse plus approfondie.
Si quelqu'un avec plus d'expertise trouve une erreur, faites-le moi savoir.
Ce lien m'a beaucoup aidé: https://stackoverflow.com/questions/62183291/statistical-test-with-test-data/62193116#62193116
Réponses
Il y a 2 points à considérer:
vous avez besoin d' une étape de validation externe chaque fois que vous utilisez les résultats de la validation interne pour régler votre modèle.
La raison en est que le réglage par une estimation de performance bruyante fait que cette estimation devient optimiste en tant qu'estimation de performance.Vos estimations de performances sont bruyantes en raison du petit nombre de cas de test (recherchez les intervalles de confiance binomiaux et mesurez les proportions). Par exemple, si vous observez 3 erreurs de classification sur 31 cas testés, il s'agit d'une précision de 90% avec un intervalle de confiance de 95% de 77 à 97%.
En d' autres termes, à moins que la performance observée pour votre grille d'accord a stark différences entre les meilleurs et les pires modèles, vous ne pouvez pas choisir de manière fiable en fonction de si peu de cas testés.
Que faire?
La validation croisée (répétée) dans la validation interne (optimisation) vous donne des estimations de performances un peu plus fiables. (Ne vous attendez pas à des miracles, cependant.)
La précision (ou d'autres proportions) est sujette à une très grande incertitude de variance - ils ont besoin de très grandes tailles d'échantillons pour être certains. Ils ont d'autres caractéristiques qui les rendent pas très bien adaptés comme cible fonctionnelle pour l'optimisation. Voyez si vous pouvez utiliser une règle de notation (strictement) appropriée à la place.
Dans les petits ensembles de données, comme votre cas, il est fortement conseillé car le partage train / test peut être bruyant. Vos estimations de performances seront beaucoup plus robustes si vous faites un CV externe. Autant que je sache, vous devez coder le CV externe par vous-même et utiliser votre code dans la boucle tel quel. Cela peut aider.