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?

FatihAkici
fonte
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.

Sycorax diz restabelecer Monica
fonte
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.

usεr11852
fonte
2

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

Stephan Kolassa
fonte
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