Melhor maneira de apresentar uma floresta aleatória em uma publicação?

75

Estou usando o algoritmo de floresta aleatória como um classificador robusto de dois grupos em um estudo de microarray com milhares de recursos.

  • Qual é a melhor maneira de apresentar a floresta aleatória para que haja informações suficientes para torná-la reproduzível em um artigo?
  • Existe um método de plotagem em R para realmente plotar a árvore, se houver um pequeno número de recursos?
  • A estimativa de taxa de erro OOB é a melhor estatística a ser citada?
danielsbrewer
fonte
2
Não existe uma única árvore ... Mas veja a resposta de @ Shane ao traçar uma delas para fins ilustrativos.
chl
Eu certamente vale a pena considerar Floresta aleatória :: partialPlot, stats.stackexchange.com/questions/92150/...
Soren Havelund Welling
1
você pode tentar o meu pacote Floresta aleatória visualização, forestFloor - forestfloor.dk
Soren Havelund Welling

Respostas:

48

Em relação à reprodução, a melhor maneira é fornecer pesquisa reproduzível (código e dados) junto com o artigo. Disponibilize-o em seu site ou em um site de hospedagem (como o github).

Em relação à visualização, Leo Breiman fez um trabalho interessante sobre isso (consulte sua página inicial , em particular a seção de gráficos ).

Mas se você estiver usando R, o randomForestpacote terá algumas funções úteis:

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)

Não conheço uma maneira simples de plotar uma árvore, mas você pode usar a getTreefunção para recuperar a árvore e plotar isso separadamente.

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

A apresentação de Strobl / Zeileis sobre "Por que e como usar medidas aleatórias de importância variável da floresta (e como você não deve)" tem exemplos de árvores que devem ter sido produzidas dessa maneira. Esta postagem no blog sobre modelos de árvores tem alguns bons exemplos de gráficos de árvores CART que você pode usar, por exemplo.

Como o @chl comentou, uma única árvore não é especialmente significativa nesse contexto; portanto, sem usá-la para explicar o que é uma floresta aleatória, eu não a incluiria em um artigo.

Shane
fonte
4
Pequena extensão sobre parcelas: plot.randomForestmostra como o erro OOB e o erro OOB da classe evoluíram com o aumento do número de árvores; varImpPlotmostra medidas de importância de atributos para os principais atributos e MDSplottodos os objetos plotados na projeção 2D da medida de proximidade de objetos de RF.
+1 por citar a MDSplot()função. Devo admitir que frequentemente uso RFs como uma maneira de destacar grupos de indivíduos (com base na medida de proximidade de RF) em vez de selecionar os melhores recursos. Os médicos costumam ler muito facilmente esses gráficos do que o gráfico de pontos var. importância ...
chl
18
  1. Como Shane escreveu; torne a pesquisa reproduzível + inclua sementes aleatórias, porque a RF é estocástica.
  2. Primeiro de tudo, planejar árvores isoladas formando RF não faz sentido; este é um classificador de conjunto, faz sentido apenas como um todo. Mas até mesmo plotar toda a floresta não faz sentido - é um classificador de caixa preta, portanto, não se destina a explicar os dados com sua estrutura, e sim a replicar o processo original. Em vez disso, faça algumas das parcelas sugeridas por Shane.
  3. Na prática, OOB é uma aproximação de erro muito boa; no entanto, esse não é um fato amplamente aceito; portanto, para publicação, é melhor também criar um currículo para confirmá-lo.

fonte
Portanto, @mbq ao fazer um currículo é válido primeiro fazer uma floresta aleatória com todas as amostras selecionadas; fazendo isso duas vezes uma vez com todas e em segundo lugar com as 10 principais variáveis ​​(que podem ser citadas em um artigo). Em seguida, faça uma validação cruzada de exclusão (selecionando os 10 genes principais a cada tentativa) e cite o erro CV disso?
Danielsbrewer 6/09/10
1
@danielsbrewer Eu faria isso de outra maneira (prestando mais atenção à seleção de recursos), mas isso está correto; no entanto, trata-se mais do tema de comparar a seleção de recursos de RF do que selecionar os melhores marcadores para o seu problema biológico.
2
O principal problema é que é realmente difícil comparar dois modelos (modelo = método de aprendizado + método de seleção de recursos), mas por uma questão de simplicidade, você pode simplesmente assumir algo (como eu vou usar a RF e selecionar os 10 principais atributos) e admitir que você sabe que isso pode ser abaixo do ideal, mas você concorda que, por exemplo, está satisfeito com a precisão. Nesse caso, seu único problema é remover o viés da seleção de atributos. tbc.
2
Então, eu faria um simples ensacamento: você cria 10 (ou 30, se tiver um bom computador) subamostras de objetos aleatórios (digamos, escolhendo aleatoriamente com substituição), treina RF em cada um, obtém sua importância e retorna uma classificação de cada atributo calculado como média em todas as repetições (o melhor atributo obtém a classificação 1, o segundo melhor 2 e assim por diante; pode ser calculado a média de modo que o atributo que era 12 vezes a primeira e 18 vezes a segunda tenha a classificação 1,6), finalmente selecione 10 com as melhores classificações e chame-os seus marcadores. Em seguida, use um CV (LOO, amostragem de 10 vezes ou de preferência aleatória) para obter uma aproximação de erro de RF usando seus marcadores. tbc.
2
Relate as classificações (espero que elas estejam bem próximas de 1,2,3 ...), erro de CV com seu desvio (apenas conte o desvio padrão dos resultados de cada rodada de CV) e erro de OOB (provavelmente será idêntico ao erro de CV). AVISO LEGAL: Este não é um método para selecionar o número ideal de atributos - você precisa do RFE e do CV aninhado para fazer isso. AVISO LEGAL2: Eu não trabalhei com esses dados, por isso não garanto que seus árbitros ficarão satisfeitos com eles (embora eu acredite que devam).
13

Lembre-se das advertências nas outras respostas sobre o enredo ser necessariamente significativo. Mas se você deseja um gráfico para fins ilustrativos / pedagógicos, o seguinte trecho de R pode ser útil. Não é difícil adicionar "ponto de divisão" ao texto da borda, se necessário.

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
fonte
1
O código produz muito bom gráfico de árvore. Mas os valores não estão sendo exibidos. Provavelmente, uma função text () precisa ser adicionada após a última declaração (plot).
rnso