Losowy las i prognozy

14

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

użytkownik1665355
źródło

Odpowiedzi:

17

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 NAoznacza, ż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- NAwartoś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 NAjest 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 mtrylosowo wybranych zmiennych.

Przywróć Monikę - G. Simpson
źródło
Świetna odpowiedź Gavin! Kiedy piszesz "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 to rules for the treejest? Czy rozumiem samplepoprawnie jako wiersz, jeśli rozumiem, że próbki pochodzą groupsz obserwacji, w których drzewa dzielą dane?
user1665355
@ user1665355 Zakładałem, że rozumiesz, jak zbudowano drzewa regresji lub klasyfikacji? Drzewa w RF nie różnią się (z wyjątkiem być może reguł zatrzymywania). Każde drzewo dzieli dane treningowe na grupy próbek o podobnych „wartościach” odpowiedzi. Lokalizacja zmiennej i podziału (np. PH> 4,5), która najlepiej przewiduje (tj. Minimalizuje „błąd”), tworzy pierwszy podział lub regułę w drzewie. Każda gałąź tego podziału jest następnie rozpatrywana kolejno i identyfikowane są nowe podziały / reguły, które minimalizują „błąd” drzewa. Jest to binarny algorytm partycjonowania rekurencyjnego. Podziały są zasadami.
Przywróć Monikę - G. Simpson,
@ user1665355 Tak, przepraszam, pochodzę z pola, w którym próbka jest obserwacją, wierszem w zestawie danych. Ale kiedy zaczynasz mówić o próbce ładowania początkowego, jest to zestaw N obserwacji, narysowanych z zastąpieniem z danych treningowych, a zatem ma N rzędów lub obserwacji. Spróbuję później wyczyścić moją terminologię.
Przywróć Monikę - G. Simpson,
Dzięki! Jestem bardzo nowy w RF, więc przepraszam za może głupie pytania :) Myślę, że rozumiem prawie wszystko, co napisałeś, bardzo dobre wytłumaczenie! Zastanawiam się tylko nad zmienną i lokalizacją podziału (np. PH> 4,5), która najlepiej przewiduje (tj. Minimalizuje „błąd”), tworzy pierwszy podział lub regułę w drzewie… Nie rozumiem, co to jest błąd. : / Czytam i próbuję zrozumieć 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 importancewskaźników technicznych.
user1665355
„Błąd” zależy od rodzaju dopasowywanego drzewa. Odchylenie jest zwykle miarą ciągłych (Gaussowskich) odpowiedzi. W pakiecie rpart współczynnik Giniego jest domyślny dla odpowiedzi kategorycznych, ale istnieją inne dla różnych modeli itp. Powinieneś skorzystać z dobrej książki na temat drzew i RF, jeśli chcesz ją pomyślnie wdrożyć. Miary nieregularności zmiennej są czymś innym - mierzą „ważność” każdej zmiennej w zbiorze danych, sprawdzając, jak bardzo coś się zmienia, gdy ta zmienna jest używana do dopasowania do drzewa, a kiedy ta zmienna nie jest używana.
Przywróć Monikę - G. Simpson,