¿Cómo interpretar OOB y la matriz de confusión para bosque aleatorio?

35

Recibí un script R de alguien para ejecutar un modelo de bosque aleatorio. Lo modifiqué y lo ejecuté con algunos datos de empleados. Estamos tratando de predecir separaciones voluntarias.

Aquí hay información adicional: este es un modelo de clasificación donde 0 = empleado suspendido, 1 = empleado despedido, actualmente solo estamos viendo una docena de variables predictoras, los datos están "desequilibrados" en el sentido de que los registros terminados representan aproximadamente 7 % del conjunto de registros total.

Ejecuté el modelo con varias selecciones de mtry y ntree pero me decidí por lo siguiente. El OOB es de 6.8%, lo que creo que es bueno, pero la matriz de confusión parece contar una historia diferente para predecir términos, ya que la tasa de error es bastante alta en 92.79%. Estoy en lo cierto al suponer que no puedo confiar y usar este modelo porque ¿La alta tasa de error para predecir términos? ¿O hay algo que también puedo hacer para usar RF y obtener una tasa de error menor para predecir los términos?

 FOREST_model <- randomForest(theFormula, data=trainset, mtry=3, ntree=500, importance=TRUE, do.trace=100)
ntree      OOB      1      2
  100:   6.97%  0.47% 92.79%
  200:   6.87%  0.36% 92.79%
  300:   6.82%  0.33% 92.55%
  400:   6.80%  0.29% 92.79%
  500:   6.80%  0.29% 92.79%
> print(FOREST_model)

Call:
 randomForest(formula = theFormula, data = trainset, mtry = 3,      ntree = 500, importance = TRUE, do.trace = 100) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 3

        OOB estimate of  error rate: 6.8%
Confusion matrix:
     0  1 class.error
0 5476 16 0.002913328
1  386 30 0.927884615
> nrow(trainset)
[1] 5908
daniellopez46
fuente

Respuestas:

20

La matriz de confusión se calcula en un punto específico determinado por el corte de los votos. Dependiendo de sus necesidades, es decir, mejor precisión (reducir falsos positivos) o mejor sensibilidad (reducir falsos negativos) puede preferir un punto de corte diferente.

Para este propósito, recomiendo trazar (i) una curva ROC , (ii) una precisión de recuperación y (iii) una curva de calibración para seleccionar el límite que mejor se adapte a sus propósitos. Todo esto se puede trazar fácilmente utilizando las 2 siguientes funciones de la biblioteca ROCR R (disponible también en CRAN ):

pred.obj <- prediction(predictions, labels,...)
performance(pred.obj, measure, ...)

Por ejemplo:

rf <- randomForest (x,y,...);
OOB.votes <- predict (rf,x,type="prob");
OOB.pred <- OOB.votes[,2];

pred.obj <- prediction (OOB.pred,y);

RP.perf <- performance(pred.obj, "rec","prec");
plot (RP.perf);

ROC.perf <- performance(pred.obj, "fpr","tpr");
plot (ROC.perf);

plot  (RP.perf@alpha.values[[1]],RP.perf@x.values[[1]]);
lines (RP.perf@alpha.values[[1]],RP.perf@y.values[[1]]);
lines (ROC.perf@alpha.values[[1]],ROC.perf@x.values[[1]]);
Itamar
fuente
Estoy interesado en tu respuesta, tracé el código que compartiste. ¿podría darme algunos recursos para encontrar un pequeño detalle sobre la trama que sugirió? o escribirá algunas oraciones sobre cómo interpretarlo. Muchas gracias de antemano.
MKS
Le sugiero que comience con la entrada para la curva ROC que se vinculó a las entradas anteriores y otras mencionadas allí.
Itamar
La respuesta no aborda directamente la limitación del árbol de decisión en un conjunto de datos muy sesgado.
SmallChess
19

Su conjunto está muy desequilibrado: la RF generalmente falla en este escenario (es decir, predice bien solo la clase más grande).

Debe intentar equilibrar su conjunto ya sea muestreando la clase "0" solo para tener aproximadamente el mismo tamaño que la clase "1" o jugando con el classwtparámetro.


fuente
1
A pesar de que hay un classwtparámetro, no creo que esté implementado todavía en la randomForest()función del randomForestpaquete en R. Per Link . ¿Lo has usado anteriormente? Lo probé con diferentes valores pero obtuve resultados idénticos a los predeterminados classwt=NULL.
Zhubarb
9

Según su matriz de confusión, tiene 5.908 puntos de datos y la gran mayoría de ellos son del tipo 0 ('empleado se quedó'). Por lo tanto, el clasificador puede salirse con la suya al ser "flojo" y elegir la clase mayoritaria a menos que sea absolutamente seguro que un ejemplo pertenece a la otra clase. Tenga en cuenta que su tasa de error general es de ~ 7%, ¡lo cual está bastante cerca del porcentaje de ejemplos de Clase1!

Tienes algunas opciones:

  • Descarte los ejemplos de Class0 hasta que tenga clases más o menos equilibradas. No sé si hay literatura sobre cómo elegir un subconjunto óptimamente representativo (¿tal vez alguien más puede influir?), Pero podría comenzar soltando ejemplos al azar. Puede pasar un subsetargumento a randomForest, lo que debería hacer que esta prueba sea trivial.

  • Ajuste su función de pérdida / ponderaciones de clase para compensar el número desproporcionado de Clase0. Esencialmente, desea que sea mucho más costoso para el clasificador clasificar erróneamente un ejemplo de Clase1 que uno de Clase0. Puede tener sentido intentar Class0 = 1 / 0.07 ~ = 14x Class1 para comenzar, pero es posible que desee ajustar esto en función de las demandas de su negocio (cuánto peor es un tipo de error). Creo que el classwtparámetro es lo que estás buscando aquí.

  • Utilice el muestreo estratificado para asegurarse de que tiene ejemplos de ambas clases en los datos de capacitación de los árboles. Es posible que algunos de sus árboles se hayan entrenado solo con datos de Clase 0, lo que obviamente será un mal augurio para su rendimiento de generalización. Mira el strataargumento.

Matt Krause
fuente
Seleccionar al azar de la clase dominante suena razonable. No necesitan ser iguales: incluso una proporción de 1: 5 debería ser una mejora.
Itamar
@ Itmar, eso es definitivamente lo que intentaría primero. Sin embargo, parece que debe haber alguna forma de garantizar que los ejemplos que conserve sean representativos del conjunto de datos más grande.
Matt Krause
1
Una opción podría ser para funcionar PCA (principio de análisis de componentes) en el conjunto más grande, agrupar los puntos de acuerdo con la primera componente de principio y recoger una muestra de cada clúster.
Itamar