Stichprobe mit Ersatz in R randomForest

11

Die randomForest-Implementierung erlaubt keine Stichproben über die Anzahl der Beobachtungen hinaus, selbst wenn Stichproben mit Ersatz erstellt werden. Warum ist das?

Funktioniert gut:

rf <- randomForest(Species ~ ., iris, sampsize=c(1, 1, 1), replace=TRUE)
rf <- randomForest(Species ~ ., iris, sampsize=3, replace=TRUE)

Was ich machen will; was ich vorhabe zu tun:

rf <- randomForest(Species ~ ., iris, sampsize=c(51, 1, 1), replace=TRUE)
Error in randomForest.default(m, y, ...) : 
  sampsize can not be larger than class frequency

Ähnlicher Fehler ohne geschichtete Stichprobe:

rf <- randomForest(Species ~ ., iris, sampsize=151, replace=TRUE)
Error in randomForest.default(m, y, ...) : sampsize too large

Da ich erwartet hatte, dass die Methode in beiden Fällen Bootstrap-Beispiele nimmt, wenn replace = TRUE angegeben wird, habe ich dieses Limit nicht erwartet.

Mein Ziel ist es, dies mit der Option der geschichteten Stichprobe zu verwenden, um eine ausreichend große Stichprobe aus einer relativ seltenen Klasse zu ziehen.

Cohoz
quelle
Ich bin mir nicht sicher, was der wahre Grund ist, aber ein Bootstrap-Beispiel hat normalerweise die gleiche Größe wie Ihr Original-Beispiel. Daher scheint dieses Verhalten perfekt mit dem übereinzustimmen, was ich von etwas erwarten würde, das behauptet, Bootstrap-Beispiele zu nehmen.
Joran
1
Nun, das war meine Wortwahl, nicht die der Dokumentation, aber Ihr Standpunkt ist gut aufgenommen. Dies ist jedoch unpraktisch, wenn versucht wird, die Verteilung wieder auszugleichen, und ich kenne keinen Grund, warum dies eine hilfreiche Einschränkung ist.
Cohoz

Antworten:

5

Dies beantwortet nicht den Grund , aber um dies zu umgehen, kann man die Daten für die seltene Klasse in den Trainingsdaten duplizieren und eine geschichtete Stichprobe des Ergebnisses ziehen.

Zwei Nachteile dieses Ansatzes im Vergleich zu einer "natürlichen" Überabtastung:

  • Die Out-of-Bag-Schätzungen sind nicht mehr aussagekräftig
  • Es sind mehr Ressourcen erforderlich, um das Objekt zu speichern und Zufallsstichproben zu ziehen

aber es wird einem erlauben, den Wald mit den gewünschten Klassenverhältnissen zu bauen.

Cohoz
quelle
4

Ich habe genau die gleiche Frage und habe diese im Changelog für randomForest gefunden :

Änderungen in 4.1-0:

  • Wenn in randomForest () die Sampsize angegeben ist, erfolgt die Stichprobe jetzt ersatzlos und zusätzlich nach Klassen geschichtet. Daher kann die Sampsize nicht größer als die Klassenfrequenzen sein.

Das manuelle Setzen von replace = TRUE scheint dies ebenfalls nicht zu überschreiben.

hgcrpd
quelle
2
Es kann vorkommen, dass der Ersetzungsparameter einfach ignoriert wird, aber später in diesem Änderungsprotokoll: Änderungen in 4.5-12: * Das Argument 'strata' wurde zu randomForest hinzugefügt, das in Verbindung mit 'sampsize' eine Stichprobe (mit oder) ermöglicht ohne Ersatz) gemäß einer Schichtvariablen (die etwas anderes als die Klassenvariable sein kann). Derzeit funktioniert nur in der Klassifizierung.
Cohoz
Zum Beispiel wird der gleiche Fehler überrf <- randomForest(Species ~ ., iris, sampsize=c(51, 1, 1), strata=iris$Species, replace=TRUE)
Cohoz
Darüber hinaus weisen einige Testfälle mit der aktuellen Version (4.6-7) darauf hin, dass Proben mit Ersatz entnommen werden, sodass dies nicht die Erklärung ist.
Cohoz
1
Ich habe vor dem Ausführen des randomForest nur ein Oversampling durchgeführt. Es ist wahrscheinlich etwas falsch mit dieser Methode, aber es scheint zu funktionieren, wenn ich die Ergebnisse teste.
hgcrpd
1
Nein, das ist die Problemumgehung, die ich verwende und die genau das tut, was man will. Insbesondere für den Anwendungsfall einer relativ seltenen Klasse funktioniert das Duplizieren der Daten für diese Klasse im Trainingssatz und vor der Entnahme einer geschichteten Stichprobe gut und die "Kosten" in Bezug auf zusätzlichen Speicher / CPU sind nicht zu hoch. Ich denke, das ist es wert, eine "Antwort" zu schreiben, obwohl es wirklich keine ist ...
Cohoz