Najlepszy sposób na zaprezentowanie losowego lasu w publikacji?

75

Używam algorytmu losowego lasu jako solidnego klasyfikatora dwóch grup w badaniu mikromacierzy z tysiącami funkcji.

  • Jaki jest najlepszy sposób przedstawienia losowego lasu, aby było wystarczająco dużo informacji, aby można go było odtworzyć w formie papierowej?
  • Czy istnieje metoda kreślenia w R, która faktycznie drukuje drzewo, jeśli istnieje niewielka liczba funkcji?
  • Czy szacowana przez OOB stopa błędu jest najlepszą statystyką do cytowania?
danielsbrewer
źródło
2
Nie ma ani jednego drzewa ... Ale zobacz odpowiedź @ Shane'a, aby wykreślić jedno z nich w celach ilustracyjnych.
chl
Z pewnością warto wziąć pod uwagę randomForest :: czesciowoPlot, stats.stackexchange.com/questions/92150/…
Soren Havelund Welling
1
możesz wypróbować mój losowy pakiet wizualizacji lasu, forestFloor - forestfloor.dk
Soren Havelund Welling

Odpowiedzi:

48

Jeśli chodzi o uczynienie go odtwarzalnym, najlepszym sposobem jest zapewnienie powtarzalnych badań (tj. Kodu i danych) wraz z dokumentem. Udostępnij go na swojej stronie internetowej lub stronie hostingowej (np. Github).

Jeśli chodzi o wizualizację, Leo Breiman wykonał kilka interesujących prac w tym zakresie (patrz jego strona główna , w szczególności sekcja grafiki ).

Ale jeśli używasz R, randomForestpakiet ma kilka przydatnych funkcji:

data(mtcars)
mtcars.rf <- randomForest(mpg ~ ., data=mtcars, ntree=1000, keep.forest=FALSE,
                           importance=TRUE)
plot(mtcars.rf, log="y")
varImpPlot(mtcars.rf)

I

set.seed(1)
data(iris)
iris.rf <- randomForest(Species ~ ., iris, proximity=TRUE,
                        keep.forest=FALSE)
MDSplot(iris.rf, iris$Species)

Nie znam prostego sposobu na sporządzenie wykresu drzewa, ale możesz użyć tej getTreefunkcji do odzyskania drzewa i wykreślenia go osobno.

getTree(randomForest(iris[,-5], iris[,5], ntree=10), 3, labelVar=TRUE)

Prezentacja Strobl / Zeileis na „Dlaczego i jak używać zmiennych losowych leśnych środki znaczenie (i jak nie należy)” zawiera przykłady drzew, które muszą być wyprodukowane w ten sposób. Ten post na blogu na temat modeli drzew zawiera kilka ciekawych przykładów wykresów drzewa CART, których można na przykład użyć.

Jak skomentował @chl, pojedyncze drzewo nie ma w tym kontekście szczególnego znaczenia, więc nie używam go do wyjaśnienia, czym jest przypadkowy las, nie zamieściłbym tego w artykule.

Shane
źródło
4
Małe rozszerzenie o wykresach: plot.randomForestpokazuje, jak ewoluował błąd OOB i błąd OOB w klasie wraz ze wzrostem liczby drzew; varImpPlotpokazuje miary ważności atrybutów dla najwyższych atrybutów i MDSplotwszystkich obiektów wykreślonych na rzucie 2D miary bliskości obiektów RF.
+1 za cytowanie MDSplot()funkcji. Muszę przyznać, że często używam RF jako sposobu na wyróżnienie grup osób (w oparciu o miarę bliskości RF) zamiast wybierania najlepszych funkcji. Klinicyści często czytają takie wykresy znacznie łatwiej niż dotplot var. znaczenie ...
chl
18
  1. Jak napisał Shane; sprawiają, że badania są powtarzalne + obejmują losowe nasiona, ponieważ RF jest stochastyczny.
  2. Po pierwsze, kreślenie pojedynczych drzew tworzących RF jest nonsensem; jest to klasyfikator zespołowy, ma sens tylko jako całość. Ale nawet kreślenie całego lasu jest nonsensem - to klasyfikator czarnej skrzynki, więc nie ma na celu wyjaśnienia danych jego strukturą, a raczej odtworzenia pierwotnego procesu. Zamiast tego zrób kilka fabuł, które zasugerował Shane.
  3. W praktyce OOB jest bardzo dobrym przybliżeniem błędu; nie jest to jednak fakt powszechnie akceptowany, dlatego w celu publikacji lepiej jest również napisać CV, aby je potwierdzić.

źródło
Więc @mbq podczas pisania CV jest poprawne, aby najpierw zrobić losowy las z wybranymi wszystkimi próbkami; robiąc to dwa razy ze wszystkimi, a po drugie z 10 najważniejszymi zmiennymi (które można zacytować w pracy). Następnie wykonaj pominiętą walidację krzyżową (wybierając 10 najlepszych genów za każdym razem) i podaj z tego błąd CV?
danielsbrewer
1
@ Danielsbrewer Zrobiłbym to w inny sposób (zwracając większą uwagę na wybór funkcji), ale jest to poprawne; jednak chodzi bardziej o analizę porównawczą wyboru funkcji RF niż o wybór najlepszych markerów dla twojego problemu biologicznego.
2
Głównym problemem jest to, że naprawdę trudno jest porównać dwa modele (model = metoda uczenia się + metoda wyboru funkcji), ale dla uproszczenia możesz po prostu coś założyć (np. Użyję RF i wybiorę 10 najlepszych atrybutów) i przyznać, że wiesz że może to być nieoptymalne, ale zgadzasz się na to, podczas gdy na przykład jesteś zadowolony z dokładności. W takim przypadku Twoim jedynym problemem jest usunięcie błędu selekcji atrybutów. do potwierdzenia
2
Zrobiłbym więc proste pakowanie: tworzysz 10 (lub 30, jeśli masz dobry komputer) losowych podpróbek obiektów (powiedzmy przez losowe wybieranie z wymianą), trenujesz RF na każdym, uzyskujesz jego ważność i zwracasz rangę każdego atrybut uśredniony dla wszystkich powtórzeń (najlepszy atrybut otrzymuje rangę 1, drugi najlepszy 2 itd.; można go uśrednić, aby atrybut, który był 12 razy 1 i 18 razy 2, miał rangę 1,6), w końcu wybierz 10 z najlepszymi rangami i nazwij je twoje markery. Następnie użyj CV (LOO, 10-krotne lub najlepiej losowe próbkowanie), aby uzyskać przybliżenie błędu RF za pomocą swoich markerów. do potwierdzenia
2
Zgłoś rangi (mam nadzieję, że powinny być dość blisko 1,2,3 ...), błąd CV z odchyleniem (wystarczy policzyć odchylenie standardowe wyników każdej rundy CV) i błąd OOB (prawdopodobnie będzie identyczny z błędem CV). ZASTRZEŻENIE: To nie jest metoda wyboru optymalnej liczby atrybutów - do tego potrzebujesz RFE i zagnieżdżonego CV. OŚWIADCZENIE2: Nie pracowałem z takimi danymi, więc nie gwarantuję, że Twoi sędziowie będą z nich zadowoleni (choć uważam, że powinni).
13

Pamiętaj o zastrzeżeniach zawartych w innych odpowiedziach dotyczących tego, że fabuła ma znaczenie. Ale jeśli chcesz fabułę do celów ilustracyjnych / pedagogicznych, przydatny może być następujący fragment R. Nie jest trudno dodać „punkt podziału” do tekstu krawędzi, jeśli jest to potrzebne.

to.dendrogram <- function(dfrep,rownum=1,height.increment=0.1){

  if(dfrep[rownum,'status'] == -1){
    rval <- list()

    attr(rval,"members") <- 1
    attr(rval,"height") <- 0.0
    attr(rval,"label") <- dfrep[rownum,'prediction']
    attr(rval,"leaf") <- TRUE

  }else{##note the change "to.dendrogram" and not "to.dendogram"
    left <- to.dendrogram(dfrep,dfrep[rownum,'left daughter'],height.increment)
    right <- to.dendrogram(dfrep,dfrep[rownum,'right daughter'],height.increment)
    rval <- list(left,right)

    attr(rval,"members") <- attr(left,"members") + attr(right,"members")
    attr(rval,"height") <- max(attr(left,"height"),attr(right,"height")) + height.increment
    attr(rval,"leaf") <- FALSE
    attr(rval,"edgetext") <- dfrep[rownum,'split var']
    #To add Split Point in Dendrogram
    #attr(rval,"edgetext") <- paste(dfrep[rownum,'split var'],"\n<",round(dfrep[rownum,'split point'], digits = 2),"=>", sep = " ")
  }

  class(rval) <- "dendrogram"

  return(rval)
}

mod <- randomForest(Species ~ .,data=iris)
tree <- getTree(mod,1,labelVar=TRUE)

d <- to.dendrogram(tree)
str(d)
plot(d,center=TRUE,leaflab='none',edgePar=list(t.cex=1,p.col=NA,p.lty=0))
Patrick Caldon
źródło
1
Kod tworzy bardzo dobry wykres drzewa. Ale wartości nie są wyświetlane. Prawdopodobnie po ostatniej instrukcji (plot) należy dodać funkcję text ().
rnso