Como fazer com que as árvores da floresta aleatória votem decimais, mas não binárias


9

Minha pergunta é sobre classificação binária, por exemplo, separar bons clientes de clientes ruins, mas não regressão ou classificação não-binária. Nesse contexto, uma floresta aleatória é um conjunto de árvores de classificação. Para cada observação, toda árvore vota um "sim" ou "não", e o voto médio de todas as árvores é a probabilidade final da floresta.

Minha pergunta é sobre a modificação do comportamento das árvores subjacentes: Como podemos modificar a função randomForest (do pacote randomForest de R) para que cada árvore vote um decimal em vez de um sim / não binário. Para entender melhor o que quero dizer com decimal, vamos pensar sobre como as árvores de decisão funcionam.

Uma árvore de decisão totalmente desenvolvida possui 1 instância boa ou 1 incorreta em seus nós terminais. Suponha que eu limite o tamanho do nó do terminal como 100. Em seguida, os nós do terminal terão a seguinte aparência:

Nó1 = 80 ruim, 20 bom
Nó2 = 51 ruim, 49 bom
Nó3 = 10 ruim, 90 bom

Observe que, embora o Nó1 e o Nó2 votem "ruim", sua "força da maldade" é severamente diferente. É disso que eu estou depois. Em vez de fazê-los produzir 1 ou 0 (qual é o comportamento padrão), pode-se modificar o pacote R para votar 80/100, 51/100, 10/100 etc?


Só queria incluir o seguinte link para uma discussão relacionada: stackoverflow.com/questions/22409019/…
— FatihAkici

Você quer dizer as probabilidades previstas reais , não apenas a classe prevista mais provável.
— smci

Sim @smci exatamente.
— FatihAkici

Respostas:


10

Este é um ponto sutil que varia de software para software. Existem dois métodos principais que eu conheço:

  1. Folhas binárias - Cada folha vota como maioria. É assim que randomForestfunciona no R, mesmo ao usarpredict(..., type="prob")
  2. Folhas de proporção - Cada folha retorna a proporção das amostras de treinamento pertencentes a cada classe. É assim que sklearn.ensemble.RandomForestClassifier.predict_probafunciona. Em outra resposta, @ usεr11852 aponta que o rangerpacote de R também fornece essa funcionalidade. Felizmente, posso atestar que, devido ao meu uso limitado, rangertambém é muito, muito mais rápido que randomForest.

Não acho que exista uma maneira fácilrandomForest de usar o método da folha proporcional, já que o software R é na verdade apenas um gancho para um programa C & FORTRAN. A menos que você goste de modificar o código de outra pessoa, precisará criar seu próprio código ou encontrar outra implementação de software.


Muito obrigado, Sycorax. Você acha que o código fonte dos R's randomForest pode ser modificado para acompanhar isso?
— FatihAkici

Com recursos suficientes, qualquer software pode ser modificado para fazer qualquer coisa. Por outro lado, randomForesté apenas uma interface R no código FORTRAN, portanto, pode levar recursos consideráveis ​​para ser realizado.
— Sycorax diz Reinstate Monica

@FatihAkici Na verdade, parece que eu estava enganado. O código compilado é uma porta C do código FORTRAN original de Breiman.
— Sycorax diz Reinstate Monica

5
Trabalhei no pacote randomForest por um verão em 2015 como parte de uma REU. Definitivamente, é possível modificar o código para fazer isso, mas é um pouco complicado, porque na verdade é um C-Fortran misto. A maior parte do código "externo" é C, enquanto algumas funções principais permanecem no Fortran e são vinculadas após a compilação. Infelizmente, faz muito tempo desde que eu vi o código para saber onde procurar. mas eu sugiro estar preparado para trabalhar no C e no Fortran, se você quiser modificar o pacote.
— chipbuster

5

É perfeitamente possível cultivar uma "floresta de probabilidade". A metodologia de Malley et al. (2012) " Máquinas de probabilidade: estimativa consistente de probabilidade usando máquinas de aprendizagem não paramétricas ", que descreve como isso é feito e como ele se compara à implementação padrão de floresta aleatória. Além disso, o excelente guarda florestal de pacotes R já implementa essa funcionalidade; basta definir probability = TRUEao fazer a chamada de função para ranger.


2

Basta usar predict.randomForest(..., type="prob"). Você está fazendo uma coisa boa .


2
Stephan, obrigado pela sua resposta, mas não é isso que estou procurando. O código que você mencionou leva a média dos votos da árvore binária subjacente, mas estou tentando fazer com que as árvores subjacentes votem decimal. Portanto, em uma floresta de 3 árvores, eu não quero (1 + 1 + 0) / 3, e sim (0,80 + 0,51 + 0,10) / 3. Isso faz sentido?
— FatihAkici

2
Faz sentido, e isso é o comportamento do classificador floresta aleatória na sklearn: scikit-learn.org/stable/modules/generated/...
— psarka

1
Ah, entendo o seu ponto. Desculpe, então eu entendi errado. A julgar pela página de ajuda e observando predict.allos norm.votesparâmetros e, isso não parece ser possível. Se você realmente deseja isso, provavelmente precisará codificar sua própria floresta aleatória. Concordo com a @psarka que isso faz todo o sentido. (Eu excluir esta resposta, mas então poderíamos perder esta discussão nos comentários.)
— Stephan Kolassa

Foi realmente uma discussão muito proveitosa, queridos Stephan e @psarka. Obrigado!
— FatihAkici
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.