¿Cómo cambiar el umbral para la clasificación en R randomForests?


10

Toda la literatura de Modelado de Distribución de Especies sugiere que cuando se predice la presencia / ausencia de una especie utilizando un modelo que genera probabilidades (por ejemplo, RandomForests), la elección del umbral de probabilidad para clasificar una especie como presencia o ausencia es importante y uno debe No siempre se basa en el valor predeterminado de 0.5. ¡Necesito algo de ayuda con esto! Aquí está mi código:

library(randomForest)
library(PresenceAbsence)

#build model
RFfit <- randomForest(Y ~ x1 + x2 + x3 + x4 + x5, data=mydata, mytry = 2, ntrees=500)

#eventually I will apply this to (predict for) new data but for first I predict back    to training data to compare observed vs. predicted
RFpred <- predict(RFfit, mydata, type = "prob")

#put the observed vs. predicted in the same dataframe
ObsPred <- data.frame(cbind(mydata), Predicted=RFpred)

#create auc.roc plot
auc.roc.plot(ObsPred, threshold = 10, xlab="1-Specificity (false positives)",
  ylab="Sensitivity (true positives)", main="ROC plot", color=TRUE,
  find.auc=TRUE, opt.thresholds=TRUE, opt.methods=9) 

A partir de esto, determiné que el umbral que me gustaría usar para clasificar la presencia de las probabilidades pronosticadas es 0.7, no el valor predeterminado de 0.5. No entiendo totalmente qué hacer con esta información. ¿Simplemente uso este umbral al crear un mapa de mi salida? Podría crear fácilmente una salida mapeada con probabilidades continuas y luego simplemente reclasificar aquellos con valores mayores que 0.7 como presentes, y aquellos <0.7 como ausentes.

¿O quiero tomar esta información y volver a ejecutar mi modelado randomForests, usando el parámetro de corte? ¿Qué está haciendo exactamente el parámetro de corte? ¿Cambia el voto resultante? (actualmente dice que es "mayoría"). ¿Cómo uso este parámetro de corte? ¡No entiendo la documentación! ¡Gracias!


2
Diría que esto puede pertenecer aquí: la cuestión de (1) estimaciones de probabilidad de RF, (2) si puede imponer una función de costo en el modelo o si tiene que incorporarla al modelo, y (3) cómo implementar funciones de costo en RF son problemas recurrentes que no están simplemente relacionados con la programación.
charles

Respuestas:


7

# establecer umbral o valor de corte a 0.7

cutoff=0.7

# todos los valores inferiores al valor de corte 0.7 se clasificarán como 0 (presente en este caso)

RFpred[RFpred<cutoff]=0

#todos los valores mayores que el valor de corte 0.7 se clasificarán como 1 (ausente en este caso)

 RFpred[RFpred>=cutoff]=1

1
¿Podría ampliar un poco su respuesta? Por lo menos, sería útil anotar su código.
Patrick Coulombe

2
FWIW, creo que esto es perfectamente suficiente.
Sycorax dice Reinstate Monica

Esta respuesta es perfectamente sólida. Estoy de acuerdo.
Seanosapien

7

Lo siento, no has recibido e intentos de respuestas. Recomendaría el libro de Max Kuhn para la cobertura de este tema. Este es un tema bastante amplio. Solo agrega algunos bits:

  1. Las curvas ROC son populares, pero solo tienen sentido si está tratando de comprender el equilibrio entre el costo Falso negativo y los resultados Falso positivo. Si CostFN = CostFP, entonces no estoy seguro de que tengan sentido. La estadística c y otras medidas derivadas todavía tienen uso. Si desea maximizar la precisión, simplemente ajuste su modelo para esto (el paquete de caret lo hace fácil), no vaya a hacer una curva ROC.
  2. Todos usan las probabilidades derivadas de los modelos de RF. Creo que se debe pensar en hacer esto: estos no son modelos probabilísticos, no están diseñados para hacer esto. A menudo funciona Como mínimo, produciría una gráfica de validación de las probabilidades de RF en nuevos datos si realmente estuviera interesado en las probabilidades
  3. La forma más simple sería usar "simplemente reclasificar aquellos con valores mayores que 0.7 como presentes, y aquellos <0.7 como ausentes".
  4. Si el costo (FN) no es igual al costo (FP), entonces debe hacer que la RF sea rentable. R no lo hace fácil. La función de ponderación en el paquete RandomForest no funciona. La mejor opción es jugar con el muestreo, el caso de la mayoría de ejemplo para obtener la función de costo que desea. Pero la relación entre la relación muestral y el costo no es directa. Por lo tanto, es posible que desee seguir con (3)

Actualización sobre los pesos de la clase Andy Liaw:
"La opción" classwt "actual en el paquete randomForest ha estado allí desde el principio, y es diferente de cómo el código oficial de Fortran (versión 4 y posterior) implementa los pesos de la clase. Simplemente da cuenta de la clase ponderaciones en el cálculo del índice de Gini al dividir nodos, exactamente como se hace un solo árbol CART cuando se dan ponderaciones de clase. El profesor Breiman ideó el nuevo esquema de ponderación de clase implementado en la versión más nueva de su código Fortran después de descubrir que simplemente usando los pesos en el índice de Gini no parecían ayudar mucho en datos extremadamente desequilibrados (digamos 1: 100 o peor). Si usar Gini ponderado ayuda en su situación, hágalo de todas maneras. Solo puedo decir que en el pasado no nos dio el resultado que esperábamos ".


¿Podría dar más detalles sobre el subpunto (4) por qué el argumento de ponderación no funciona?
Sycorax dice Reinstate Monica

2
Según tengo entendido, está implementado adecuadamente en el código Fortran ( stat.berkeley.edu/~breiman/RandomForests/cc_software.htm ) pero no en el paquete R. Esto se discute: ( stat.ethz.ch/pipermail/r-help/2011-September/289769.html ) y se centra en la necesidad de usar pesos en todas las etapas de la construcción de árboles, no solo en la división de Gini. Entonces, la implementación actual de R, que solo usa ponderación en la división, no funciona muy bien
charles
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.