Alguém recebeu sugestões de bibliotecas ou códigos sobre como realmente plotar algumas árvores de amostra de:
getTree(rfobj, k, labelVar=TRUE)
(Sim, eu sei que você não deve fazer isso operacionalmente, a RF é uma caixa preta, etc. etc. Quero verificar visualmente uma árvore para verificar se alguma variável está se comportando de maneira contra-intuitiva, precisa de ajustes / combinação / discretização / transformação, verifique quão bem meus fatores codificados estão funcionando etc.)
Perguntas anteriores sem uma resposta decente:
Na verdade, eu quero plotar uma árvore de amostra . Portanto, não discuta comigo sobre isso, já. Não estou perguntando sobre varImpPlot
(Gráfico de Importância Variável) ou partialPlot
ou MDSPlot
, ou esses outros gráficos , eu já os tenho, mas eles não substituem a visualização de uma árvore de amostra. Sim, posso inspecionar visualmente a saída de getTree(...,labelVar=TRUE)
.
(Eu acho que uma plot.rf.tree()
contribuição seria muito bem recebida.)
cforest
(no pacote de festa ). Caso contrário, você precisará converter odata.frame
retornado porrandomForest::getTree
em umtree
objeto semelhante.Respostas:
Primeira (e mais fácil) solução: se você não gosta de usar a RF clássica, como implementado no Andy Liaw
randomForest
, pode experimentar o pacote de terceiros que fornece uma implementação diferente do algoritmo RF ™ original (uso de árvores condicionais e esquema de agregação baseado em unidades de peso médio). Então, conforme relatado neste post de ajuda R , você pode plotar um único membro da lista de árvores. Parece funcionar sem problemas, até onde eu sei. Abaixo está um gráfico de uma árvore gerada porcforest(Species ~ ., data=iris, controls=cforest_control(mtry=2, mincriterion=0))
.Segundo (quase tão fácil) solução: A maioria das técnicas baseadas em árvores em R (
tree
,rpart
,TWIX
, etc.) oferece umatree
estrutura -como para impressão / plotagem uma única árvore. A idéia seria converter a saída derandomForest::getTree
um objeto desse tipo R, mesmo que isso não faça sentido do ponto de vista estatístico. Basicamente, é fácil acessar a estrutura em árvore a partir de umtree
objeto, como mostrado abaixo. Observe que ela diferirá um pouco, dependendo do tipo de tarefa - regressão versus classificação - onde, no caso posterior, adicionará probabilidades específicas de classe como a última coluna daobj$frame
(que é adata.frame
).Depois, existem métodos para imprimir e plotar esses objetos de maneira bonita. As funções das teclas são um
tree:::plot.tree
método genérico (coloquei um triplo:
que permite visualizar o código em R diretamente) contando comtree:::treepl
(exibição gráfica) etree:::treeco
(coordenadas dos nós de cálculo). Essas funções esperam aobj$frame
representação da árvore. Outras questões sutis: (1) o argumentotype = c("proportional", "uniform")
no método de plotagem padrãotree:::plot.tree
ajuda a gerenciar a distância vertical entre os nós (proportional
significa que é proporcional ao desvio,uniform
significa que é fixo); (2) você precisa complementarplot(tr)
com uma chamada paratext(tr)
adicionar rótulos de texto a nós e divisões, o que, neste caso, significa que você também precisará dar uma olhadatree:::text.tree
.O
getTree
método fromrandomForest
retorna uma estrutura diferente, documentada na ajuda online. Uma saída típica é mostrada abaixo, com os nós do terminal indicados pelostatus
código (-1). (Novamente, a saída será diferente dependendo do tipo de tarefa, mas apenas nas colunasstatus
eprediction
.)Se você pode conseguir converter a tabela acima para o gerado por
tree
, provavelmente você vai ser capaz de personalizartree:::treepl
,tree:::treeco
etree:::text.tree
para atender às suas necessidades, embora eu não tenho um exemplo desta abordagem. Em particular, você provavelmente deseja se livrar do uso de desvio, probabilidades de classe etc. que não são significativas na RF. Tudo o que você deseja é configurar as coordenadas dos nós e dividir os valores. Você pode usarfixInNamespace()
isso, mas, para ser sincero, não tenho certeza se esse é o caminho certo a seguir.Terceira (e certamente inteligente) solução: Escreva uma verdadeira
as.tree
função auxiliar que alivie todos os "patches" acima. Você poderia usar os métodos de plotagem de R ou, provavelmente melhor, Klimt (diretamente de R) para exibir árvores individuais.fonte
Estou com quatro anos de atraso, mas se você realmente deseja manter o
randomForest
pacote (e existem algumas boas razões para fazê-lo) e realmente deseja visualizar a árvore, pode usar o pacote reprtree .O pacote não está super bem documentado (você pode encontrar os documentos aqui ), mas tudo é bem direto. Para instalar o pacote, consulte initialize.R no repositório, então simplesmente execute o seguinte:
Então vá em frente e faça seu modelo e árvore:
E lá vai você! Bonito e simples.
Você pode verificar o repositório do github para aprender sobre os outros métodos no pacote. De fato, se você verificar plot.getTree.R , perceberá que o autor usa sua própria implementação, da
as.tree()
qual chl ♦ sugeriu que você pudesse construir sua resposta. Isso significa que você pode fazer isso:E, potencialmente, use
realtree
com outros pacotes de plotagem de árvores, como a árvore .fonte
xgboost
também.randomForest
pacote.plot.getTree()
plota uma árvore individual. A funçãoplot.reprtree()
nesse pacote plota uma árvore representativa.reprtree:::plot.getTree(mod_rf_1$finalModel)
, no entanto, há um "Erro no data.frame (var = fr $ var, divide = as.character (gTree [," ponto de divisão "])),: argumentos implicam diferenças número de linhas: 2631, 0 "Eu criei algumas funções para extrair as regras de uma árvore.
fonte