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
fuente
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
classwt
parámetro.fuente
classwt
parámetro, no creo que esté implementado todavía en larandomForest()
función delrandomForest
paquete en R. Per Link . ¿Lo has usado anteriormente? Lo probé con diferentes valores pero obtuve resultados idénticos a los predeterminadosclasswt=NULL
.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
subset
argumento 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
classwt
pará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
strata
argumento.fuente