Ich versuche herauszufinden, welche Kreuzvalidierungsmethode für meine Situation am besten geeignet ist.
Die folgenden Daten sind nur ein Beispiel für die Bearbeitung des Problems (in R), aber meine realen X
Daten ( xmat
) sind miteinander korreliert und in unterschiedlichem Maße mit der y
Variablen ( ymat
) korreliert . Ich habe R-Code angegeben, aber meine Frage bezieht sich nicht auf R, sondern auf die Methoden. Xmat
enthält die X-Variablen V1 bis V100, während ymat
eine einzelne y-Variable enthalten ist.
set.seed(1233)
xmat <- matrix(sample(-1:1, 20000, replace = TRUE), ncol = 100)
colnames(xmat) <- paste("V", 1:100, sep ="")
rownames(xmat) <- paste("S", 1:200, sep ="")
# the real y data are correlated with xmat
ymat <- matrix(rnorm(200, 70,20), ncol = 1)
rownames(ymat) <- paste("S", 1:200, sep="")
Ich möchte ein Modell für die Vorhersage erstellen, y
das auf allen Variablen in basiert xmat
. Es wird also ein lineares Regressionsmodell sein y ~ V1 + V2 + V3+ ... + V100
. Aus einer Überprüfung kann ich die folgenden drei Kreuzvalidierungsmethoden erkennen:
Teilen Sie die Daten in ungefähr die Hälfte auf und verwenden Sie eine für das Training und eine andere für das Testen (Kreuzvalidierung):
prop <- 0.5 # proportion of subset data set.seed(1234) # training data set training.s <- sample (1:nrow(xmat), round(prop*nrow(xmat),0)) xmat.train <- xmat[training.s,] ymat.train <- ymat[training.s,] # testing data set testing.s <- setdiff(1:nrow(xmat), training) xmat.test <- xmat[testing.s,] ymat.test <- ymat[testing.s,]
K-fache Kreuzvalidierung - unter Verwendung der 10-fachen Kreuzvalidierung:
mydata <- data.frame(ymat, xmat) fit <- lm(ymat ~ ., data=mydata) library(DAAG) cv.lm(df=mydata, fit, m=10) # ten-fold cross validation
Maskieren eines oder mehrerer Werte gleichzeitig : Bei dieser Methode maskieren wir zufällig einen Wert in Datensatz (y), indem wir ihn durch NA ersetzen und vorhersagen. Der Vorgang wird n mal wiederholt.
n = 500 predicted.v <- rep(NA, n) real.v <- rep(NA, n) for (i in 1:n){ masked.id <- sample (1:nrow(xmat), 1) ymat1 <- ymat real.v[i] <- ymat[masked.id,] ymat1[masked.id,] <- NA mydata <- data.frame(ymat1, xmat) fit <- lm(ymat1 ~ ., data=mydata) predicted.v[i] <- fit$fitted.values[masked.id] }
Woher weiß ich, welche für jede Situation am besten ist? Gibt es noch andere Methoden? Bootstrap validation
vs CV
? Arbeitsbeispiele wären willkommen.
quelle
Antworten:
Da das OP ein Kopfgeld auf diese Frage gesetzt hat, sollte es einige Aufmerksamkeit erregen, und daher ist es der richtige Ort, um einige allgemeine Ideen zu diskutieren, auch wenn es das OP nicht direkt beantwortet.
Vornamen:
a) Kreuzvalidierung ist die allgemeine Bezeichnung für alle Schätz- / Messtechniken, die einen anderen als den Zugsatz verwenden. Synonym: Schätzungen außerhalb oder außerhalb der Stichprobe. Antonym: In-Sample-Schätzung.
Bei der In-Sample-Schätzung handelt es sich um Techniken, die einige Informationen zum Trainingssatz verwenden, um die Modellqualität zu schätzen (nicht unbedingt Fehler). Dies ist sehr häufig der Fall, wenn das Modell eine hohe Verzerrung aufweist, das heißt, wenn starke Annahmen über die Daten getroffen werden. In linearen Modellen (ein High-Bias-Modell) werden, wie im Beispiel der Frage, R-Quadrat, AIC, BIC und Abweichung als Maß für die Modellqualität verwendet - all dies sind In-Sample-Schätzer. In SVM sind beispielsweise die Verhältnisdaten im Unterstützungsvektor zur Anzahl der Daten eine In-Sample-Schätzung des Fehlers des Modells.
Es gibt viele Kreuzvalidierungstechniken:
b) Hold-out ist die obige Methode # 1. Teilen Sie das Set in ein Training und einen Test auf. Es gibt eine lange Geschichte von Diskussionen und Praktiken zu den relativen Größen des Trainings- und Test-Sets.
c) k- fach - Methode Nr. 2 oben. Ziemlich normal.
d) Auslassen - Methode 3 oben.
e) Bootstrap : Wenn Ihr Set N Daten enthält, wählen Sie zufällig N Samples WITH REPLACEMENT aus dem Set aus und verwenden Sie es als Training. Die Daten aus dem Originalsatz, die zu keinem Zeitpunkt abgetastet wurden, werden als Testsatz verwendet. Es gibt verschiedene Möglichkeiten, die endgültige Schätzung des Fehlers des Modells zu berechnen, wobei sowohl der Fehler für den Testsatz (außerhalb der Stichprobe) als auch der Fehler für den Zugsatz (innerhalb der Stichprobe) verwendet werden. Siehe zum Beispiel den .632-Bootstrap. Ich denke, es gibt auch eine .632+ -Formel - es handelt sich um Formeln, die den wahren Fehler des Modells anhand von Fehlern außerhalb und innerhalb der Stichprobe abschätzen.
f) Orthogonal zur Auswahl der obigen Methode ist das Problem der Wiederholung. Mit Ausnahme von "Leave-One-Out" können alle oben genannten Methoden beliebig oft wiederholt werden. Tatsächlich kann man von REPEATED Hold-Out oder REPEATED k- Fold sprechen . Fairerweise wird fast immer die Bootstrap-Methode wiederholt angewendet.
Die nächste Frage ist, welche Methode "besser" ist. Das Problem ist, was "besser" bedeutet.
1) Die erste Antwort ist, ob jede dieser Methoden für die Schätzung des Modellfehlers (für eine unendliche Menge zukünftiger Daten) voreingenommen ist .
2) Die zweite Alternative ist, wie schnell oder wie gut jede dieser Methoden zum wahren Modellfehler konvergiert (wenn sie nicht voreingenommen sind). Ich glaube, das ist immer noch ein Forschungsthema. Lassen Sie mich auf diese beiden Papiere verweisen (hinter der Lohnwand), aber die Zusammenfassung gibt uns ein Verständnis dafür, was sie zu erreichen versuchen. Beachten Sie auch, dass es sehr häufig vorkommt, k- fold als "Kreuzvalidierung" für sich zu bezeichnen.
Messung des Vorhersagefehlers. Ein Vergleich von Cross-Validation-, Bootstrap- und Kovarianz-Strafmethoden
Schätzung der Klassifizierungsfehlerrate: Wiederholte Kreuzvalidierung, wiederholte Unterbrechung und Bootstrap
Es gibt wahrscheinlich viele andere Artikel zu diesen Themen. Das sind nur einige Beispiele.
3) Ein weiterer Aspekt von "besser" ist: Wenn ein bestimmtes Maß des Modellfehlers unter Verwendung einer der oben genannten Techniken angegeben wird, wie sicher können Sie sein, dass der richtige Modellfehler nahe beieinander liegt.
In diesem Fall möchten Sie in der Regel viele Fehlermaßnahmen durchführen und ein Konfidenzintervall berechnen (oder ein glaubwürdiges Intervall, wenn Sie einen Bayes'schen Ansatz verfolgen). In diesem Fall geht es darum, wie sehr Sie der Varianz des Satzes von Fehlermaßnahmen vertrauen können. Beachten Sie, dass Sie mit Ausnahme des Auslassens bei allen oben beschriebenen Techniken viele verschiedene Maße erhalten ( k- Maße für eine k- Falte, n- Maße für eine n- wiederholte Haltezeit) und somit die Varianz (oder Standardabweichung) messen können ) dieser Menge und berechnen ein Konfidenzintervall für das Fehlermaß.
Hier wird es etwas komplizierter. Von dem, was ich aus dem Papier verstehen Keine unverzerrter Schätzer für die Varianz von k -fach Kreuzvalidierung (nicht hinter paywall), kann man nicht die Varianz Sie von einem bekommen vertrauen k -fach - so man kein gutes Konfidenzintervall von konstruieren k - Falten. Auch nach dem, was ich aus dem Artikel über ungefähre statistische Tests zum Vergleichen von Lernalgorithmen für überwachte Klassifizierung (nicht hinter Paywall) verstehe , Techniken, die wiederholte Messungen verwenden (wiederholtes k-fache, wiederholte Unterbrechung (bei Bootstrap nicht sicher) führt zu einer Unterschätzung der tatsächlichen Varianz des Fehlermaßes (dies ist leicht zu erkennen), da Sie eine Stichprobe aus einer endlichen Menge ziehen, wenn Sie die Messung mit einer sehr großen Zahl wiederholen Mal wiederholen sich dieselben Werte, wodurch der Mittelwert gleich bleibt, aber die Varianz verringert wird. Daher sind Techniken für wiederholte Messungen in Bezug auf das Konfidenzintervall zu optimistisch.
In diesem letzten Artikel wird vorgeschlagen, eine 5-fache Wiederholung (5 × 2 CV) durchzuführen, um eine gute Balance zwischen vielen Takten (10) und nicht zu vielen Wiederholungen zu erzielen.
BEARBEITEN:
Natürlich gibt es in Cross Validated großartige Antworten auf einige dieser Fragen (obwohl sie manchmal untereinander nicht übereinstimmen). Hier sind einige:
Cross-Validierung oder Bootstrapping zur Bewertung der Klassifizierungsleistung?
Unterschiede zwischen Kreuzvalidierung und Bootstrapping zur Abschätzung des Vorhersagefehlers
Cross-Validierung oder Bootstrapping zur Bewertung der Klassifizierungsleistung?
Grundlegendes zum Bootstrapping für die Validierung und Modellauswahl
Im Allgemeinen ist die Tag -Kreuzvalidierung hier Ihr Freund.
Was ist die beste Lösung? Ich weiß es nicht. Ich habe 5 × 2 CV verwendet, wenn ich sehr streng sein muss, wenn ich sicher sein muss, dass eine Technik besser ist als eine andere, insbesondere in Veröffentlichungen. Und ich verwende ein Holdout, wenn ich nicht vorhabe, Varianz oder Standardabweichung zu messen, oder wenn ich zeitliche Einschränkungen habe - es gibt nur ein Modell, das in einem Holdout lernt .
quelle
Die Methodendefinitionen finden Sie auf der Wikipedia-Seite (sie sind weitaus besser als ich hier).
Nachdem Sie sich diese Seite angesehen haben, kann Ihnen Folgendes helfen. Lassen Sie mich auf den Teil der Frage konzentrieren, in dem eine dieser Methoden für ihren Modellierungsprozess ausgewählt werden soll. Da dies eine ziemlich häufige Wahl ist und sie von zusätzlichem Wissen profitieren könnten, ist hier meine Antwort für zwei Situationen:
Beliebige Situation : Verwenden Sie diese Option
k-fold cross validation
mit einer geeigneten Anzahl von Wiederholungen (z. B. 5 oder 10).Das Aufteilen der Daten in eine Hälfte, das Training in der ersten Hälfte und das Validieren in der anderen Hälfte ist ohnehin ein Schritt der zweifachen Kreuzvalidierung (der andere Schritt besteht darin, die gleiche Übung mit vertauschten beiden Hälften zu wiederholen). Schließen Sie daher die Strategie der Halbierung der Daten aus.
Viele Veröffentlichungen zum maschinellen Lernen und zum Data Mining verwenden die k-fache Kreuzvalidierung (ohne Zitat). Verwenden Sie sie daher, es sei denn, Sie müssen in diesem Schritt sehr vorsichtig sein.
Lassen Sie nun eine Methode aus und andere Methoden wie ' p auslassen ' und ' zufälliges Teilen und Wiederholen ' (im Wesentlichen Bootstrap- ähnlicher Prozess wie oben beschrieben) sind auf jeden Fall gute Konkurrenten.
Wenn Ihre Datengröße N ist, ist die N-fache Kreuzvalidierung im Wesentlichen die gleiche wie eine ausgelassene.
'p out lassen' und 'bootstrap' unterscheiden sich ein wenig von der k-fachen Kreuzvalidierung, aber der Unterschied besteht im Wesentlichen darin, wie Falten definiert sind und wie viele Wiederholungen 'k' auftreten.
Wie auf der Wiki-Seite steht, sind sowohl k-fach als auch " p auslassen " anständige Schätzer für die " erwartete Leistung / Anpassung " (obwohl die Wetten in Bezug auf die Varianz dieser Schätzer nicht stimmen).
Ihre Situation: Sie haben nur eine Stichprobengröße von 200 im Vergleich zur Anzahl der Features (100). Ich denke, es besteht eine sehr hohe Wahrscheinlichkeit, dass es mehrere lineare Modelle gibt, die die gleiche Leistung liefern. Ich würde vorschlagen, eine k-fache Kreuzvalidierung mit> 10 Wiederholungen zu verwenden . Wählen Sie einen Wert von 3 oder 5.
Grund für den k-Wert: generische Wahl.
Grund für den Wiederholungswert: Ein angemessen hoher Wert für die Wiederholung ist hier wahrscheinlich kritisch, da die Ausgabe einer einzelnen k-fachen Kreuzvalidierungsberechnung für die von uns eingeführte Variabilität / Zufälligkeit der Faltenteilung geeignet sein kann.
Zusätzliche Gedanken:
Vielleicht würde ich für dasselbe Leistungs- / Anpassungsmaß auch die Methoden " p auslassen " und " Bootstrap-like-Random-Split-Repeat " verwenden (zusätzlich zur k-fach-Kreuzvalidierung), um zu überprüfen, ob die Ausgaben meiner k-fach-Kreuzvalidierungsmethode in Ordnung sind.
Obwohl Sie alle 100 Funktionen verwenden möchten, achten Sie auf Multikollinearität / Korrelation und reduzieren Sie möglicherweise die Anzahl der Funktionen.
quelle
rms
Paketvalidate
und in dencalibrate
Funktionen implementiert ist .