Ich versuche zu verstehen, wie Random Forest funktioniert. Ich habe ein Gespür dafür, wie Bäume gebaut werden, kann aber nicht verstehen, wie Random Forest Vorhersagen aus Sackproben macht. Kann mir bitte jemand eine einfache Erklärung geben? :)
Ich versuche zu verstehen, wie Random Forest funktioniert. Ich habe ein Gespür dafür, wie Bäume gebaut werden, kann aber nicht verstehen, wie Random Forest Vorhersagen aus Sackproben macht. Kann mir bitte jemand eine einfache Erklärung geben? :)
Antworten:
Jeder Baum in der Gesamtstruktur wird aus einem Bootstrap-Beispiel der Beobachtungen in Ihren Trainingsdaten erstellt. Diese Beobachtungen im Bootstrap-Beispiel bilden den Baum, während diejenigen, die nicht im Bootstrap-Beispiel enthalten sind, die Out-of-Bag-Beispiele (oder OOB-Beispiele) bilden.
Es sollte klar sein, dass für Fälle in den Daten, die zum Erstellen eines Baums verwendet werden, dieselben Variablen verfügbar sind wie für die Fälle im OOB-Beispiel. Um Vorhersagen für die OOB-Stichprobe zu erhalten, wird jede über den aktuellen Baum weitergegeben und die Regeln für den Baum werden befolgt, bis er in einem Terminalknoten eintrifft. Das ergibt die OOB-Vorhersagen für diesen bestimmten Baum.
Dieser Prozess wird eine große Anzahl von Malen wiederholt, wobei jeder Baum auf einem neuen Bootstrap-Beispiel aus den Trainingsdaten und Vorhersagen für die neuen abgeleiteten OOB-Beispiele trainiert wird.
Wenn die Anzahl der Bäume zunimmt, befindet sich eine Stichprobe mehr als einmal in den OOB-Stichproben. Daher wird der "Durchschnitt" der Vorhersagen über die N Bäume, in denen sich eine Stichprobe im OOB befindet, als OOB-Vorhersage für jede Trainingsstichprobe für verwendet Bäume 1, ..., N. Mit "Durchschnitt" wird der Mittelwert der Vorhersagen für eine kontinuierliche Antwort verwendet, oder die Mehrheitswahl kann für eine kategoriale Antwort verwendet werden (die Mehrheitswahl ist die Klasse mit den meisten Stimmen über der Menge von Bäume 1, ..., N).
Angenommen, wir hatten die folgenden OOB-Vorhersagen für 10 Proben im Training, die auf 10 Bäumen festgelegt waren
set.seed(123)
oob.p <- matrix(rpois(100, lambda = 4), ncol = 10)
colnames(oob.p) <- paste0("tree", seq_len(ncol(oob.p)))
rownames(oob.p) <- paste0("samp", seq_len(nrow(oob.p)))
oob.p[sample(length(oob.p), 50)] <- NA
oob.p
> oob.p
tree1 tree2 tree3 tree4 tree5 tree6 tree7 tree8 tree9 tree10
samp1 NA NA 7 8 2 1 NA 5 3 2
samp2 6 NA 5 7 3 NA NA NA NA NA
samp3 3 NA 5 NA NA NA 3 5 NA NA
samp4 6 NA 10 6 NA NA 3 NA 6 NA
samp5 NA 2 NA NA 2 NA 6 4 NA NA
samp6 NA 7 NA 4 NA 2 4 2 NA NA
samp7 NA NA NA 5 NA NA NA 3 9 5
samp8 7 1 4 NA NA 5 6 NA 7 NA
samp9 4 NA NA 3 NA 7 6 3 NA NA
samp10 4 8 2 2 NA NA 4 NA NA 4
Dabei NA
bedeutet, dass sich die Stichprobe in den Trainingsdaten für diesen Baum befand (mit anderen Worten, sie befand sich nicht in der OOB-Stichprobe).
Der Mittelwert der Nichtwerte NA
für jede Zeile gibt die OOB-Vorhersage für jede Stichprobe für die gesamte Gesamtstruktur an
> rowMeans(oob.p, na.rm = TRUE)
samp1 samp2 samp3 samp4 samp5 samp6 samp7 samp8 samp9 samp10
4.00 5.25 4.00 6.20 3.50 3.80 5.50 5.00 4.60 4.00
Wenn jeder Baum zur Gesamtstruktur hinzugefügt wird, können wir den OOB-Fehler bis zu einem Einschluss dieses Baums berechnen. Im Folgenden finden Sie beispielsweise die kumulativen Mittelwerte für jede Probe:
FUN <- function(x) {
na <- is.na(x)
cs <- cumsum(x[!na]) / seq_len(sum(!na))
x[!na] <- cs
x
}
t(apply(oob.p, 1, FUN))
> print(t(apply(oob.p, 1, FUN)), digits = 3)
tree1 tree2 tree3 tree4 tree5 tree6 tree7 tree8 tree9 tree10
samp1 NA NA 7.00 7.50 5.67 4.50 NA 4.6 4.33 4.0
samp2 6 NA 5.50 6.00 5.25 NA NA NA NA NA
samp3 3 NA 4.00 NA NA NA 3.67 4.0 NA NA
samp4 6 NA 8.00 7.33 NA NA 6.25 NA 6.20 NA
samp5 NA 2 NA NA 2.00 NA 3.33 3.5 NA NA
samp6 NA 7 NA 5.50 NA 4.33 4.25 3.8 NA NA
samp7 NA NA NA 5.00 NA NA NA 4.0 5.67 5.5
samp8 7 4 4.00 NA NA 4.25 4.60 NA 5.00 NA
samp9 4 NA NA 3.50 NA 4.67 5.00 4.6 NA NA
samp10 4 6 4.67 4.00 NA NA 4.00 NA NA 4.0
Auf diese Weise sehen wir, wie sich die Vorhersage über die N Bäume im Wald bis zu einer bestimmten Iteration akkumuliert. Wenn Sie die Zeilen durchlesen, wird der am weitesten rechts stehendeNA
, ist der Wert derjenige, den ich oben für die OOB-Vorhersage gezeigt habe. Auf diese Weise können Spuren der OOB-Leistung erstellt werden - ein RMSEP kann für die OOB-Stichproben auf der Grundlage der über die N Bäume kumulierten OOB-Vorhersagen berechnet werden.
Beachten Sie, dass der angezeigte R-Code nicht aus den Interna des randomForest-Codes im randomForest stammt Paket für R stammt. Ich habe nur einen einfachen Code zusammengestellt, damit Sie verfolgen können, was los ist, sobald die Vorhersagen aus jedem Baum ermittelt wurden.
Da jeder Baum aus einem Bootstrap-Beispiel aufgebaut ist und sich in einer zufälligen Gesamtstruktur eine große Anzahl von Bäumen befindet, sodass jede Trainingssatzbeobachtung für einen oder mehrere Bäume im OOB-Beispiel enthalten ist, können OOB-Vorhersagen für alle bereitgestellt werden Proben in den Trainingsdaten.
Ich habe Probleme wie fehlende Daten für einige OOB-Fälle usw. übersehen, aber diese Probleme beziehen sich auch auf einen einzelnen Regressions- oder Klassifizierungsbaum. Beachten Sie außerdem, dass jeder Baum in einer Gesamtstruktur nur mtry
zufällig ausgewählte Variablen verwendet.
http://www.ime.unicamp.br/~ra109078/PED/Data%20Minig%20with%20R/Data%20Mining%20with%20R.pdf
. Auf Seite 115-116 verwenden die Autoren RF, um variable importance
technische Indikatoren auszuwählen .
"To get predictions for the OOB sample, each one is passed down the current tree and the rules for the tree followed until it arrives in a terminal node"
Haben Sie beim Schreiben eine einfache Erklärung für das, wasrules for the tree
es ist? Und verstehe ichsample
als Zeile richtig, wenn ich verstehe, dass es sich bei den Proben umgroups
Beobachtungen handelt, in die Bäume die Daten unterteilen?