Zufälliger Wald und Vorhersage

13

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? :)

user1665355
quelle

Antworten:

16

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 NAbedeutet, 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 NAfü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 mtryzufällig ausgewählte Variablen verwendet.

Setzen Sie Monica - G. Simpson wieder ein
quelle
Tolle Antwort Gavin! "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, was rules for the treees ist? Und verstehe ich sampleals Zeile richtig, wenn ich verstehe, dass es sich bei den Proben um groupsBeobachtungen handelt, in die Bäume die Daten unterteilen?
user1665355
@ user1665355 Angenommen, Sie haben verstanden, wie Regressions- oder Klassifizierungsbäume erstellt wurden. Die Bäume in RF unterscheiden sich nicht (außer vielleicht beim Stoppen von Regeln). Jeder Baum teilt die Trainingsdaten in Gruppen von Stichproben mit ähnlichen "Werten" für die Antwort auf. Die Variable und die Aufteilungsstelle (z. B. pH> 4,5), die den "Fehler" am besten vorhersagen (dh minimieren), bilden die erste Aufteilung oder Regel im Baum. Jeder Zweig dieser Aufteilung wird dann der Reihe nach betrachtet und neue Aufteilungen / Regeln werden identifiziert, die den "Fehler" des Baums minimieren. Dies ist der binäre rekursive Partitionierungsalgorithmus. Die Spaltungen sind die Regeln.
Setzen Sie Monica - G. Simpson am
@ user1665355 Ja, tut mir leid, ich komme aus einem Feld, in dem eine Probe eine Beobachtung ist, eine Zeile im Datensatz. Wenn Sie jedoch von einem Bootstrap-Beispiel sprechen, handelt es sich um eine Reihe von N Beobachtungen, die mit Ersetzung aus den Trainingsdaten erstellt wurden und daher N Zeilen oder Beobachtungen enthalten. Ich werde später versuchen, meine Terminologie zu bereinigen.
Setzen Sie Monica - G. Simpson am
Vielen Dank! Ich bin sehr neu bei RF und entschuldige vielleicht dumme Fragen :) Ich glaube, ich verstehe fast alles, was du geschrieben hast, sehr gute Erklärung! Ich wundere mich nur über die Variable und den Split-Ort (z. B. pH> 4,5), die die erste Aufteilung oder Regel im Baum am besten vorhersagen (dh "Fehler" minimieren) ... Ich kann nicht verstehen, was der Fehler ist. : / Ich lese und versuche zu verstehen 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 importancetechnische Indikatoren auszuwählen .
user1665355
Der "Fehler" hängt davon ab, welcher Baumtyp angepasst wird. Abweichung ist das übliche Maß für kontinuierliche (Gauß'sche) Reaktionen. Im rpart-Paket ist der Gini-Koeffizient die Standardeinstellung für kategoriale Antworten, es gibt jedoch andere für verschiedene Modelle usw. Sie sollten sich ein gutes Buch über Bäume und RF zunutze machen, wenn Sie es erfolgreich implementieren möchten. Variablenverbesserungsmaße sind etwas anderes - sie messen die "Wichtigkeit" jeder Variablen in der Datenmenge, indem sie sehen, um wie viel sich etwas ändert, wenn diese Variable für einen Baum verwendet wird und wenn diese Variable nicht verwendet wird.
Setzen Sie Monica - G. Simpson am