Kreuzvalidierung in kleinen Datensätzen
Ich habe einen wirklich kleinen Datensatz (124 Beispiele) und möchte ausprobieren, ob ich mit einigen Algorithmen für maschinelles Lernen in R interessante Ergebnisse erhalte.
Was ich getan habe: Ich habe meinen Datensatz in 75% Training und 25% Test aufgeteilt und sechs verschiedene Modelle mit der folgenden Struktur trainiert:
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)
Ich habe jedoch gerade angefangen, über maschinelles Lernen und tiefes Lernen zu lernen, und der Teil der Kreuzvalidierung ist immer schwer zu verstehen.
Die Frage ist: Im Code gibt es nur den inneren Kreuzvalidierungsschritt. Ist es notwendig, eine äußere Schleife für cv durchzuführen? Wenn ja, wie kann ich es codieren?
BEARBEITEN:
Nur ein Update, das hilfreich sein kann, wenn jemand mit demselben Problem vorbeikommt:
Ich habe das gemacht und gut gearbeitet:
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}
Jetzt gehe ich zur weiteren Analyse über.
Wenn jemand mit mehr Fachwissen einen Fehler findet, lassen Sie es mich bitte wissen.
Dieser Link hat mir sehr geholfen: https://stackoverflow.com/questions/62183291/statistical-test-with-test-data/62193116#62193116
Antworten
Es sind 2 Punkte zu beachten:
Sie benötigen einen äußeren Validierungsschritt, wenn Sie die Ergebnisse der inneren Validierung verwenden, um Ihr Modell zu optimieren.
Der Grund ist, dass die Abstimmung durch eine verrauschte Leistungsschätzung dazu führt, dass diese Schätzung als Leistungsschätzung optimistisch verzerrt wird.Ihre Leistungsschätzungen sind aufgrund der geringen Anzahl von Testfällen verrauscht (suchen Sie nach binomialen Konfidenzintervallen und messen Sie die Proportionen). Wenn Sie beispielsweise 3 Fehlklassifizierungen von 31 getesteten Fällen beobachten, entspricht dies einer Genauigkeit von 90% bei einem Konfidenzintervall von 95% von 77 bis 97%.
Mit anderen Worten, es sei denn, die beobachtete Leistung für Ihr Tuning-Raster unterscheidet sich stark zwischen dem besten und dem schlechtesten Modell. Sie können nicht zuverlässig anhand so weniger getesteter Fälle auswählen.
Was ist zu tun?
Durch (wiederholte) Kreuzvalidierung in der inneren (Optimierungs-) Validierung erhalten Sie etwas zuverlässigere Leistungsschätzungen. (Erwarten Sie jedoch keine Wunder.)
Die Genauigkeit (oder andere Proportionen) unterliegen einer sehr großen Varianzunsicherheit - sie benötigen sehr große Testprobengrößen, um sicher zu sein. Sie haben weitere Eigenschaften, die sie als Zielfunktion für die Optimierung nicht sehr gut geeignet machen. Prüfen Sie, ob Sie stattdessen eine (streng) korrekte Bewertungsregel verwenden können.
In kleinen Datensätzen, wie z. B. Ihrem Fall, wird dringend empfohlen, da die Zug- / Testaufteilung laut sein kann. Ihre Leistungsschätzungen sind viel robuster, wenn Sie einen äußeren Lebenslauf erstellen. Soweit ich weiß, müssen Sie den äußeren Lebenslauf selbst codieren und Ihren Code unverändert in der Schleife verwenden. Dies kann helfen.