Próbuję zrozumieć, jak działa Losowy Las. Rozumiem, jak buduje się drzewa, ale nie rozumiem, w jaki sposób Losowy Las przewiduje prognozy na podstawie próbki z torby. Czy ktoś mógłby mi podać proste wyjaśnienie? :)
Próbuję zrozumieć, jak działa Losowy Las. Rozumiem, jak buduje się drzewa, ale nie rozumiem, w jaki sposób Losowy Las przewiduje prognozy na podstawie próbki z torby. Czy ktoś mógłby mi podać proste wyjaśnienie? :)
Odpowiedzi:
Każde drzewo w lesie jest zbudowane z próbki bootstrap obserwacji w danych treningowych. Te obserwacje w próbce bootstrap budują drzewo, podczas gdy te, które nie znajdują się w próbce bootstrap, tworzą próbki poza torbą (OOB).
Powinno być jasne, że te same zmienne są dostępne dla przypadków w danych użytych do zbudowania drzewa, jak dla przypadków w próbce OOB. Aby uzyskać prognozy dla próbki OOB, każda z nich jest przekazywana w dół do bieżącego drzewa, a reguły dla drzewa są przestrzegane, dopóki nie dotrze do węzła końcowego. To daje prognozy OOB dla tego konkretnego drzewa.
Proces ten powtarza się wiele razy, każde drzewo trenowane na nowej próbce ładowania początkowego na podstawie danych treningowych i prognoz dla nowych wyprowadzonych próbek OOB.
W miarę wzrostu liczby drzew każda próbka będzie znajdować się w próbkach OOB więcej niż jeden raz, a zatem „średnia” prognoz na drzewach N, w których próbka znajduje się w OOB, jest używana jako prognoza OOB dla każdej próbki treningowej dla drzewa 1, ..., N. Przez „średnią” używamy średniej z prognoz w celu uzyskania ciągłej odpowiedzi, lub głosowanie większością można zastosować do odpowiedzi kategorycznej (większość głosów to klasa z największą liczbą głosów w zbiorze drzewa 1, ..., N).
Załóżmy na przykład, że mieliśmy następujące prognozy OOB dla 10 próbek w zestawie treningowym na 10 drzewach
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
Gdzie NA
oznacza, że próbka znajdowała się w danych szkoleniowych dla tego drzewa (innymi słowy nie było jej w próbce OOB).
Średnia nie- NA
wartości dla każdego wiersza daje prognozę OOB dla każdej próbki, dla całego lasu
> 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
Ponieważ każde drzewo jest dodawane do lasu, możemy obliczyć błąd OOB do tego drzewa włącznie. Na przykład poniżej znajdują się średnie sumaryczne dla każdej próbki:
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
W ten sposób widzimy, jak prognoza jest kumulowana na drzewach N w lesie do danej iteracji. Jeśli czytasz w poprzek wierszy, najbardziej po prawej stronie NA
jest brak wartości, którą pokazuję powyżej dla prognozy OOB. W ten sposób można tworzyć ślady wydajności OOB - RMSEP można obliczyć dla próbek OOB na podstawie prognoz OOB skumulowanych łącznie na drzewach N.
Zauważ, że pokazany kod R nie bierze się z wewnętrznych elementów kodu randomForest w pakiecie randomForest dla R - Właśnie podrzuciłem prosty kod, abyś mógł śledzić, co się dzieje, gdy zostaną ustalone prognozy z każdego drzewa.
Jest tak, ponieważ każde drzewo jest zbudowane z próbki bootstrap i że w losowym lesie znajduje się duża liczba drzew, tak że każda obserwacja zestawu treningowego znajduje się w próbce OOB dla jednego lub więcej drzew, prognozy OOB mogą być dostarczone dla wszystkich próbki w danych treningowych.
Omówiłem takie kwestie, jak brakujące dane w niektórych przypadkach OOB itp., Ale te kwestie dotyczą również pojedynczego drzewa regresji lub klasyfikacji. Zauważ również, że każde drzewo w lesie używa tylko mtry
losowo wybranych zmiennych.
http://www.ime.unicamp.br/~ra109078/PED/Data%20Minig%20with%20R/Data%20Mining%20with%20R.pdf
. Na stronach 115-116 autorzy używają RF do wyboru variable importance
wskaźników technicznych.
"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"
, czy masz proste wyjaśnienie, co torules for the tree
jest? Czy rozumiemsample
poprawnie jako wiersz, jeśli rozumiem, że próbki pochodzągroups
z obserwacji, w których drzewa dzielą dane?