Il modo migliore per presentare una foresta casuale in una pubblicazione?


75

Sto usando l'algoritmo di foresta casuale come un robusto classificatore di due gruppi in uno studio di microarray con migliaia di funzionalità.

  • Qual è il modo migliore per presentare la foresta casuale in modo che ci siano abbastanza informazioni per renderla riproducibile in un documento?
  • Esiste un metodo di trama in R per tracciare effettivamente l'albero, se ci sono un numero limitato di funzioni?
  • La stima OOB del tasso di errore è la migliore statistica da citare?

2
Non c'è un solo albero ... Ma vedi la risposta di @ Shane per averne tracciato uno a scopo illustrativo.
chl,

Sicuramente vale la pena considerare randomForest :: partialPlot, stats.stackexchange.com/questions/92150/…
Soren Havelund Welling

1
potresti provare il mio pacchetto di visualizzazione casuale della foresta, forestFloor - forestfloor.dk
Soren Havelund Welling

Risposte:


48

Per quanto riguarda il renderlo riproducibile, il modo migliore è fornire ricerche riproducibili (ad esempio codice e dati) insieme al documento. Renderlo disponibile sul tuo sito Web o su un sito di hosting (come github).

Per quanto riguarda la visualizzazione, Leo Breiman ha svolto un lavoro interessante su questo (vedi la sua homepage , in particolare la sezione sulla grafica ).

Ma se stai usando R, il randomForestpacchetto ha alcune funzioni utili:

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

E

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

Non sono a conoscenza di un modo semplice per tracciare effettivamente un albero, ma puoi usare la getTreefunzione per recuperare l'albero e disegnarlo separatamente.

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

La presentazione di Strobl / Zeileis su "Perché e come usare misure casuali di importanza delle variabili forestali (e come non dovresti)" contiene esempi di alberi che devono essere stati prodotti in questo modo. Questo post sul blog sui modelli di alberi contiene alcuni esempi di trame di alberi CART che è possibile utilizzare ad esempio.

Come ha commentato @chl, un singolo albero non è particolarmente significativo in questo contesto, quindi a corto di usarlo per spiegare cos'è una foresta casuale, non lo includerei in un documento.


4
Piccola estensione per i grafici: plot.randomForestmostra come si sono evoluti l'errore OOB e l'errore OOB in classe con l'aumentare del numero di alberi; varImpPlotmostra le misure di importanza degli attributi per gli attributi principali e MDSplottutti gli oggetti tracciati sulla proiezione 2D della misura di prossimità degli oggetti RF.

+1 per citare la MDSplot()funzione. Devo ammettere che uso spesso le RF come modo per evidenziare gruppi di individui (in base alla misura di prossimità RF) piuttosto che selezionare le migliori caratteristiche. I clinici spesso leggono molto facilmente trame simili a dotplot di var. importanza ...
chl,

18
  1. Come scrisse Shane; renderlo ricerca riproducibile + includere semi casuali, perché la RF è stocastica.
  2. Innanzitutto, la trama di singoli alberi che formano la RF non ha senso; questo è un classificatore d'ensemble, ha senso solo nel suo insieme. Ma anche tracciare l'intera foresta non ha senso: è un classificatore black-box, quindi non ha lo scopo di spiegare i dati con la sua struttura, piuttosto di replicare il processo originale. Invece, crea alcune delle trame suggerite da Shane.
  3. In pratica, OOB è un'ottima approssimazione dell'errore; tuttavia questo non è un fatto ampiamente accettato, quindi per la pubblicazione è meglio fare anche un CV per confermarlo.

Quindi, quando si fa un CV, @mbq è valido innanzitutto fare una foresta casuale con tutti i campioni selezionati; farlo due volte una volta con tutte e in secondo luogo con le prime 10 variabili (che possono essere citate in un documento). Quindi fai una validazione incrociata (selezionando i 10 migliori geni ogni tentativo) e cita l'errore CV da quello?
danielsbrewer,

1
@danielsbrewer Lo farei in qualche altro modo (prestando maggiore attenzione alla selezione delle funzionalità), ma questo è corretto; tuttavia è più sul tema del benchmarking della selezione delle funzionalità RF che sulla selezione dei migliori marker per il tuo problema biologico.

2
Il problema principale è che è davvero difficile confrontare due modelli (modello = metodo di apprendimento + metodo di selezione delle funzioni), ma per semplicità puoi semplicemente supporre qualcosa (come userò la RF e selezionerò i primi 10 attributi) e ammettere che lo sai che questo può non essere ottimale, ma tu sei d'accordo su questo mentre ad esempio sei soddisfatto dell'accuratezza. In tal caso, l'unico problema è rimuovere la distorsione della selezione degli attributi. TBC.

2
Quindi, farei un semplice insacco: crei 10 (o 30 se hai un buon computer) sottocampioni casuali di oggetti (diciamo per scelta casuale con sostituzione), alleni RF su ciascuno, ottieni la sua importanza e restituisci un rango di ciascuno attributo mediato su tutte le ripetizioni (l'attributo migliore ottiene il rango 1, il secondo miglior 2 e così via; può essere mediato in modo che l'attributo che era 12 volte 1 ° e 18 volte 2 ° abbia un rango di 1,6), infine seleziona 10 con i migliori ranghi e chiamali i tuoi marcatori. Quindi utilizzare un CV (LOO, 10 volte o preferibilmente campionamento casuale) per ottenere un'approssimazione dell'errore di RF utilizzando i marker. TBC.

2
Riporta i ranghi (si spera che dovrebbero essere abbastanza vicini a 1,2,3 ...), l'errore CV con la sua deviazione (basta contare la deviazione standard dei risultati di ogni round CV) e l'errore OOB (probabilmente sarà identico all'errore CV). NOTA BENE: Questo non è un metodo per selezionare il numero ottimale di attributi - per farlo è necessario RFE e CV nidificato. DISCLAIMER2: Non ho lavorato con tali dati, quindi non garantisco che i tuoi arbitri saranno contenti (anche se credo che dovrebbero).

13

Ricorda che le avvertenze nelle altre risposte sulla trama sono necessariamente significative. Ma se vuoi una trama a scopi illustrativi / pedagogici, il seguente frammento di R potrebbe essere utile. Non è difficile aggiungere "punto di divisione" al testo del bordo se ne hai bisogno.

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

1
Il codice produce un'ottima trama ad albero. Ma i valori non vengono visualizzati. Probabilmente una funzione text () deve essere aggiunta dopo l'ultima istruzione (trama).
anche il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.