10 votos

Cómo hacer que los árboles randomforest voten decimales pero no binarios

Mi pregunta se refiere a la clasificación binaria, por ejemplo, separar los buenos clientes de los malos, pero no a la regresión ni a 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 un "no", y el voto medio de todos los árboles es la probabilidad final del bosque.

Mi pregunta se refiere a 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 sí/no binario. Para entender mejor a qué me refiero 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. Supongamos que limito a 100 el tamaño de los nodos terminales. Entonces los nodos terminales se verán como:

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

Fíjate, aunque el Nodo1 y el Nodo2 votan "malo", su "fuerza de maldad" es muy diferente. Eso es lo que pretendo. En lugar de que produzcan 1 o 0 (que es el comportamiento por defecto), ¿se puede modificar el paquete R para que voten 80/100, 51/100, 10/100, etc.?

0 votos

Sólo quería incluir el siguiente enlace a un debate relacionado: stackoverflow.com/questions/22409019/

0 votos

¿Quieres decir que quieres el probabilidades reales previstas no sólo la clase prevista más probable.

0 votos

Sí @smci exactamente.

10voto

user777 Puntos 10934

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

  1. Hojas binarias - Cada hoja vota como la mayoría. Así es como randomForest funciona en R, incluso cuando se utiliza predict(..., type="prob")
  2. Hojas de proporción - Cada hoja devuelve la proporción de las muestras de entrenamiento que pertenecen a cada clase. De este modo sklearn.ensemble.RandomForestClassifier.predict_proba funciona. En otra respuesta, @usr11852 señala que R ranger también ofrece esta funcionalidad. Afortunadamente, puedo dar fe de que a partir de mi uso limitado, ranger también es mucho, mucho más rápido que randomForest .

No creo que haya un fácil manera de conseguir randomForest para utilizar el método de la hoja proporcional, ya que el software R es en realidad sólo un gancho en un programa C & FORTRAN. A menos que te guste modificar el código de otra persona, tendrás que escribir el tuyo propio o encontrar otra implementación de software.

0 votos

Muchas gracias, Sycorax. ¿Crees que el código fuente de R randomForest puede modificarse para acompañar esto?

0 votos

Con los recursos suficientes, cualquier software puede modificarse para hacer cualquier cosa. Por otro lado, randomForest es sólo una interfaz de R en código FORTRAN, por lo que podría requerir recursos considerables para lograrlo.

0 votos

@FatihAkici En realidad, parece que me he equivocado. El código compilado es un port en C del código FORTRAN original de Breiman.

5voto

usεr11852 Puntos 5514

Es perfectamente posible cultivar un "bosque de probabilidades". La metodología de Malley et al. (2012) " Máquinas de probabilidad: estimación consistente de probabilidades mediante máquinas de aprendizaje no paramétricas. "que explica cómo se hace y cómo se compara con la aplicación estándar de los bosques aleatorios. Además, el excelente Paquete R guardabosques ya implementa esta funcionalidad; basta con configurar probability = TRUE al realizar la llamada a la función ranger .

2voto

icelava Puntos 548

Sólo tiene que utilizar predict.randomForest(..., type="prob") . Usted está haciendo un Lo bueno .

2 votos

Stephan, gracias por tu respuesta, pero no es lo que busco. El código que usted ha mencionado toma el promedio de los votos de los árboles binarios subyacentes, pero estoy tratando de tener los árboles subyacentes voto decimal. Así que en un bosque de 3 árboles, no quiero (1+1+0)/3, más bien (.80+.51+.10)/3. ¿Tiene sentido?

2 votos

Tiene sentido, y ese es el comportamiento del clasificador random forest en sklearn: scikit-learn.org/stable/modules/generated/

1 votos

Ah, entiendo lo que quieres decir. Lo siento, entonces lo entendí mal. A juzgar por la página de ayuda y mirando el predict.all y el norm.votes esto no parece posible. Si realmente quieres esto, probablemente tendrás que codificar tu propio bosque aleatorio. Estoy de acuerdo con @psarka en que esto tiene mucho sentido. (Borraría esta respuesta, pero entonces perderíamos esta discusión en los comentarios).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X