Der beste Weg, eine zufällige Gesamtstruktur in einer Publikation darzustellen?

75

Ich verwende den Random Forest-Algorithmus als robusten Klassifikator für zwei Gruppen in einer Microarray-Studie mit Tausenden von Features.

  • Was ist der beste Weg, um die zufällige Gesamtstruktur so darzustellen, dass genügend Informationen vorhanden sind, um sie in einem Papier reproduzierbar zu machen?
  • Gibt es eine Plotmethode in R, um den Baum tatsächlich zu plotten, wenn es eine kleine Anzahl von Features gibt?
  • Ist die OOB-Schätzung der Fehlerrate die beste zu zitierende Statistik?
Danielsbrewer
quelle
2
Es gibt keinen einzigen Baum ... Aber siehe @ Shanes Antwort für die grafische Darstellung eines davon zur Veranschaulichung.
Chl
Es lohnt sich bestimmt, randomForest :: partialPlot, stats.stackexchange.com/questions/92150/…
Soren Havelund Welling
1
Sie könnten mein zufälliges Waldvisualisierungspaket ausprobieren
Soren Havelund Welling

Antworten:

48

Um es reproduzierbar zu machen, ist es am besten , reproduzierbare Recherchen (dh Code und Daten) zusammen mit dem Papier bereitzustellen . Stellen Sie es auf Ihrer Website oder auf einer Hosting-Site (wie github) zur Verfügung.

In Bezug auf die Visualisierung hat Leo Breiman einige interessante Arbeiten dazu geleistet (siehe seine Homepage , insbesondere den Abschnitt zu Grafiken ).

Wenn Sie jedoch R verwenden, enthält das randomForestPaket einige nützliche Funktionen:

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

Und

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

Ich kenne keine einfache Möglichkeit, einen Baum tatsächlich zu zeichnen, aber Sie können die getTreeFunktion verwenden, um den Baum abzurufen und diesen separat zu zeichnen.

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

Die Präsentation von Strobl / Zeileis zum Thema "Warum und wie man zufällige waldvariable Wichtigkeitsmaße verwendet (und wie man das nicht sollte)" enthält Beispiele von Bäumen, die auf diese Weise erzeugt worden sein müssen. Dieser Blog-Beitrag zu Baummodellen enthält einige schöne Beispiele für CART-Baumdiagramme, die Sie beispielsweise verwenden können.

Wie @chl bemerkte, ist ein einzelner Baum in diesem Zusammenhang nicht besonders aussagekräftig. Wenn ich ihn nicht zur Erklärung eines zufälligen Waldes verwende, würde ich ihn nicht in ein Papier aufnehmen.

Shane
quelle
4
Kleine Erweiterung zu Plots: plot.randomForestZeigt, wie sich der OOB-Fehler und der OOB-Fehler in der Klasse mit zunehmender Anzahl von Bäumen entwickelt haben. varImpPlotZeigt die Attribut-Wichtigkeitsmaße für die oberen Attribute und MDSplotalle Objekte an, die auf der 2D-Projektion des RF-Objektnäherungsmaßes aufgezeichnet sind.
+1 für das Zitieren der MDSplot()Funktion. Ich muss zugeben, dass ich häufig RFs verwende, um Gruppen von Personen hervorzuheben (basierend auf dem RF-Näherungsmaß), anstatt die besten Merkmale auszuwählen. Kliniker lesen solche Diagramme oft sehr leicht als Punktdiagramme von var. Bedeutung ...
chl
18
  1. Wie Shane schrieb; machen es reproduzierbar Forschung + enthalten zufällige Samen, weil RF stochastisch ist.
  2. Zuallererst ist das Plotten einzelner Bäume, die RF bilden, Unsinn; Dies ist ein Ensemble-Klassifikator, der nur als Ganzes Sinn macht. Aber selbst das Plotten des gesamten Waldes ist Unsinn - es ist ein Black-Box-Klassifikator, daher ist es nicht beabsichtigt, die Daten mit ihrer Struktur zu erklären, sondern den ursprünglichen Prozess zu replizieren. Machen Sie stattdessen einige der von Shane vorgeschlagenen Handlungen.
  3. In der Praxis ist OOB eine sehr gute Fehlerannäherung. Dies ist jedoch keine allgemein akzeptierte Tatsache. Daher ist es für die Veröffentlichung besser, einen Lebenslauf zu verfassen, um dies zu bestätigen.

quelle
Wenn Sie also einen Lebenslauf erstellen, ist es gültig, zunächst eine zufällige Gesamtstruktur mit allen ausgewählten Stichproben zu erstellen. Tun Sie es zweimal mit allen und zweitens mit den Top-10-Variablen (die in einem Papier zitiert werden können). Führen Sie dann eine einmalige Kreuzvalidierung durch (Auswahl der 10 besten Gene bei jedem Versuch) und zitieren Sie den CV-Fehler daraus?
Danielsbrewer
1
@danielsbrewer Ich würde dies auf andere Weise tun (mehr Aufmerksamkeit auf die Auswahl der Features), aber das ist richtig; Dabei geht es mehr um das Benchmarking der Auswahl von HF-Merkmalen als um die Auswahl der besten Marker für Ihr biologisches Problem.
2
Das Hauptproblem ist, dass es wirklich schwierig ist, zwei Modelle zu vergleichen (Modell = Lernmethode + Feature-Auswahlmethode), aber der Einfachheit halber können Sie einfach etwas davon ausgehen (wie ich RF verwende und Top-10-Attribute auswähle) und zugeben, dass Sie es wissen dass dies suboptimal sein mag, aber Sie stimmen dem zu, während Sie zum Beispiel mit der Genauigkeit zufrieden sind. In diesem Fall besteht Ihr einziges Problem darin, die Verzerrung der Attributauswahl zu beseitigen. tbc.
2
Also, ich würde ein einfaches Absacken machen: Sie erstellen 10 (oder 30, wenn Sie einen guten Computer haben) zufällige Unterproben von Objekten (sagen wir durch zufällige Auswahl mit Ersetzung), trainieren RF auf jedem, bekommen seine Wichtigkeit und geben einen Rang von jedem zurück Attribut gemittelt über alle Wiederholungen (bestes Attribut erhält Rang 1, zweitbester 2 usw.; es kann gemittelt werden, sodass das Attribut, das 12-mal den 1. und 18-mal den 2. Rang hatte, Rang 1,6 hat), wählen Sie schließlich 10 mit den besten Rängen aus und rufen Sie sie auf Ihre Marker. Verwenden Sie dann einen Lebenslauf (LOO, 10-fach oder vorzugsweise zufällige Stichprobe), um eine Fehlerannäherung von RF unter Verwendung Ihrer Marker zu erhalten. tbc.
2
Berichten Sie über die Ränge (hoffentlich sollten sie in der Nähe von 1,2,3 liegen ...), den CV-Fehler mit seiner Abweichung (zählen Sie einfach die Standardabweichung der Ergebnisse jeder CV-Runde) und den OOB-Fehler (wahrscheinlich identisch mit dem CV-Fehler). HAFTUNGSAUSSCHLUSS: Dies ist keine Methode zur Auswahl der optimalen Anzahl von Attributen. Dazu benötigen Sie RFE und einen verschachtelten Lebenslauf. HAFTUNGSAUSSCHLUSS2: Ich habe nicht mit solchen Daten gearbeitet, daher kann ich nicht garantieren, dass Ihre Schiedsrichter damit zufrieden sind (obwohl ich glaube, dass sie das sollten).
13

Beachten Sie, dass die Vorbehalte in den anderen Antworten zur Handlung unbedingt von Bedeutung sind. Wenn Sie jedoch eine Handlung zu illustrativen / pädagogischen Zwecken wünschen, kann der folgende Ausschnitt von R nützlich sein. Es ist nicht schwer, dem Kantentext bei Bedarf einen "Trennpunkt" hinzuzufügen.

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
quelle
1
Der Code erzeugt eine sehr gute Baumdarstellung. Die Werte werden jedoch nicht angezeigt. Möglicherweise muss eine text () -Funktion nach der letzten (plot) -Anweisung hinzugefügt werden.
RNSO