Cómo hacer que los árboles del bosque al azar voten decimales pero no binarios

9

Mi pregunta es sobre la clasificación binaria, por ejemplo, separar a los buenos clientes de los malos clientes, pero no la regresión o la clasificación no binaria. En este contexto, un bosque aleatorio es un conjunto de árboles de clasificación. Para cada observación, cada árbol vota un "sí" o "no", y el voto promedio de todos los árboles es la probabilidad final del bosque.

Mi pregunta es sobre la modificación del comportamiento de los árboles subyacentes: ¿Cómo podemos modificar la función randomForest (del paquete randomForest de R) para que cada árbol vote un decimal en lugar de un binario sí / no. Para comprender mejor lo que quiero decir con decimal, pensemos en cómo funcionan los árboles de decisión.

Un árbol de decisión completamente desarrollado tiene 1 instancia buena o 1 mala en sus nodos terminales. Suponga que limito el tamaño del nodo terminal a 100. Entonces los nodos terminales se verán así:

Nodo1 = 80 malo, 20 bueno
Nodo2 = 51 malo, 49 bueno
Nodo3 = 10 malo, 90 bueno

Tenga en cuenta que, aunque el Nodo1 y el Nodo2 votan "malo", su "fuerza de maldad" es muy diferente. Eso es lo que busco. En lugar de hacer que produzcan 1 o 0 (que es el comportamiento predeterminado), ¿se puede modificar el paquete R para que vote 80/100, 51/100, 10/100, etc.?

FatihAkici
fuente
Solo quería incluir el siguiente enlace a una discusión relacionada: stackoverflow.com/questions/22409019/…
FatihAkici
Quiere decir que quiere las probabilidades pronosticadas reales , no solo la clase pronosticada más probable.
smci
Sí @smci exactamente.
FatihAkici

Respuestas:

10

Este es un punto sutil que varía de un software a otro. Hay dos métodos principales que conozco:

  1. Hojas binarias: cada hoja vota como la mayoría. Así es como randomForestfunciona en R, incluso cuando se usapredict(..., type="prob")
  2. Hojas de proporción: cada hoja devuelve la proporción de las muestras de entrenamiento que pertenecen a cada clase. Así es como sklearn.ensemble.RandomForestClassifier.predict_probafunciona. En otra respuesta, @ usεr11852 señala que el rangerpaquete de R también proporciona esta funcionalidad. Afortunadamente, puedo dar fe de que mi uso limitado rangertambién es mucho, mucho más rápido que randomForest.

No creo que haya una manera fácilrandomForest de usar el método de hoja proporcional, ya que el software R es en realidad un gancho en un programa C & FORTRAN. A menos que disfrute de modificar el código de otra persona, tendrá que escribir el suyo propio o buscar otra implementación de software.

Sycorax dice reinstalar a Mónica
fuente
Muchas gracias, Sycorax. ¿Crees que el código fuente de R's randomForest puede modificarse para acompañar esto?
FatihAkici
Con suficientes recursos, cualquier software puede modificarse para hacer cualquier cosa. Por otro lado, randomForestes solo una interfaz R en el código FORTRAN, por lo que puede requerir recursos considerables para lograrlo.
Sycorax dice Reinstate Monica el
@FatihAkici En realidad, parece que me equivoqué. El código compilado es un puerto C del código FORTRAN original de Breiman.
Sycorax dice Reinstate Monica el
55
Trabajé en el paquete randomForest para un verano en 2015 como parte de un REU. Definitivamente es posible modificar el código para hacer esto, pero es un poco complicado porque en realidad es C-Fortran mixto. La mayor parte del código "externo" es C, mientras que algunas funciones centrales permanecen en Fortran y se vinculan después de la compilación. Desafortunadamente, ha pasado demasiado tiempo desde que vi el código para saber dónde buscar. pero sugeriría estar preparado para trabajar tanto en C como en Fortran si desea modificar el paquete.
chipbuster
5

Es perfectamente posible cultivar un "bosque de probabilidad". La metodología en Malley et al. (2012) " Máquinas de probabilidad: estimación de probabilidad consistente usando máquinas de aprendizaje no paramétricas " que describe cómo se hace esto y cómo se compara con la implementación forestal aleatoria estándar. Además, el excelente R package ranger ya implementa esta funcionalidad; solo configúrelo probability = TRUEcuando realice la llamada a la función ranger.

usεr11852
fuente
2

Simplemente use predict.randomForest(..., type="prob"). Estás haciendo algo bueno .

Stephan Kolassa
fuente
2
Stephan, gracias por tu respuesta, pero eso no es lo que estoy buscando. El código que mencionó toma el promedio de los votos del árbol binario subyacente, pero estoy tratando de que los árboles subyacentes voten decimal. Entonces, en un bosque de 3 árboles, no quiero (1 + 1 + 0) / 3, sino (.80 + .51 + .10) / 3. ¿Tiene sentido?
FatihAkici
2
Tiene sentido, y ese es el comportamiento del clasificador de bosque aleatorio en sklearn: scikit-learn.org/stable/modules/generated/…
psarka
1
Ah, entiendo tu punto. Lo siento, entonces entendí mal. A juzgar por la página de ayuda y mirando predict.alllos norm.votesparámetros y, esto no parece posible. Si realmente quieres esto, probablemente necesites codificar tu propio bosque aleatorio. Estoy de acuerdo con @psarka en que esto tiene mucho sentido. (Eliminaría esta respuesta, pero luego perderíamos esta discusión en los comentarios.)
Stephan Kolassa
Fue una discusión muy fructífera, querido Stephan y @psarka. ¡Gracias!
FatihAkici