Estoy entrenando un modelo de clasificación con Random Forest para discriminar entre 6 categorías. Mis datos transaccionales tienen aproximadamente 60k + observaciones y 35 variables. Aquí hay un ejemplo de cómo se ve aproximadamente.
_________________________________________________
|user_id|acquisition_date|x_var_1|x_var_2| y_vay |
|-------|----------------|-------|-------|--------|
|111 | 2013-04-01 | 12 | US | group1 |
|222 | 2013-04-12 | 6 | PNG | group1 |
|333 | 2013-05-05 | 30 | DE | group2 |
|444 | 2013-05-10 | 78 | US | group3 |
|555 | 2013-06-15 | 15 | BR | group1 |
|666 | 2013-06-15 | 237 | FR | group6 |
Una vez que se crea el modelo, me gustaría calificar las observaciones de las últimas semanas. Como ha habido cambios en el sistema, las observaciones más recientes se parecerán más al entorno de las observaciones actuales que me gustaría predecir. Por lo tanto, quiero crear una variable de peso para que el Bosque aleatorio otorgue más importancia a las observaciones recientes.
¿Alguien sabe si el paquete randomForest en R puede manejar pesos por observación?
Además, ¿podría sugerir cuál es un buen método para crear la variable de peso? Por ejemplo, como mis datos son de 2013, estaba pensando que puedo tomar el número del mes desde la fecha como peso. ¿Alguien ve un problema con este método?
¡Muchas gracias de antemano!
fuente
Respuestas:
El
ranger
paquete en R ( pdf ), que es relativamente nuevo, lo hará. La implementación de guardabosques de bosques aleatorios tiene uncase.weights
argumento que toma un vector con pesos de caso / observación individuales.fuente
Puede volver a muestrear los datos para representar en exceso los puntos de datos más recientes. Rf implica un paso de sampel con reemplazo de todos modos y el "embolsado más o menos equilibrado" para las clases desequilibradas utiliza el muestreo para representar en exceso la clase minoritaria y produce resultados tan buenos o mejores que el bosque aleatorio ponderado por clase en mi experiencia.
Podrías volver a muestrear al nivel de construir tu matriz de entrenamiento ( referencia ) en lugar de durante el ensacado para mantener la implementación fácil, aunque sugeriría hacer muchas repeticiones en ese caso.
Internamente, algunas implementaciones de bosque aleatorio, incluido scikit-learn, en realidad usan pesos de muestra para realizar un seguimiento de cuántas veces cada muestra está en bolsa y debería ser equivalente a sobremuestreo a nivel de embolsado y cerca de sobremuestreo a nivel de entrenamiento en validación cruzada.
fuente
Debería buscar el parámetro "classwt". Esto no parece ser lo que le interesa directamente, pero podría darle una idea de lo que quiere hacer.
Ver aquí: Pregunta de intercambio de pila # 1
Y aquí: Stack Exchange pregunta # 2
Artículo sobre bosques aleatorios ponderados: PDF
La idea básica es ponderar las clases de tal manera que los grupos / clasificaciones raramente observados sean más propensos a ser seleccionados en sus muestras de arranque. Esto es útil para datos desequilibrados (cuando las probabilidades anteriores de diferentes clases son muy diferentes).
Me parece que quieres hacer algo similar, pero para eventos recientes (no para ciertos grupos / clasificaciones). Una manera simple de hacer esto sería crear observaciones duplicadas (es decir, ponerlas en filas repetidas e idénticas) para observaciones más recientes. Sin embargo, esto podría ser potencialmente ineficiente. No conozco una forma de ponderar directamente cada observación en R, pero podría no ser consciente de ello.
Puede intentar buscar implementaciones alternativas, por ejemplo, en C; en el peor de los casos, estas se pueden personalizar con un poco de codificación.
fuente