Ponderación de datos más recientes en el modelo de bosque aleatorio

14

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!

Nikolay Nenov
fuente
Puede considerar publicar una pregunta sobre el desbordamiento de la pila. Le ayudarán más con los problemas de implementación. El enfoque de este sitio está más basado en la teoría.
Alex Williams
Probablemente no estoy lo suficientemente claro en mi escritura, pero mis preguntas no están relacionadas con el problema de implementación. Por ejemplo, en la parte en la que pregunto sobre la creación de la variable de peso, no quiero preguntar qué comando en R puede ayudarme a hacer eso. Simplemente me preguntaba si con eso estaría violando cualquiera de los supuestos del bosque aleatorio.
Nikolay Nenov
1
La respuesta es no, creo. Puede asignar pesos a diferentes grupos como lo expliqué en mi respuesta a continuación. Entiendo que esto no es lo que le interesa, pero es una idea similar. Podría intentar usar observaciones duplicadas como sugiero.
Alex Williams

Respuestas:

5

El rangerpaquete en R ( pdf ), que es relativamente nuevo, lo hará. La implementación de guardabosques de bosques aleatorios tiene un case.weightsargumento que toma un vector con pesos de caso / observación individuales.

GrantRWHumphries
fuente
¡Ordenado! A las costuras les gusta la solución que estaba buscando. ¿Tiene un enlace a los detalles de cómo se calcula la probabilidad case.weights?
Nikolay Nenov
1
No estoy 100% seguro de cómo calculan las probabilidades, pero creo que, si quieres comenzar, echa un vistazo a este artículo: Malley, JD, Kruppa, J., Dasgupta, A., Malley, KG y Ziegler , A. (2012). Máquinas de probabilidad: estimación de probabilidad consistente usando máquinas de aprendizaje no paramétricas. Methods Inf Med 51: 74-81. dx.doi.org/10.3414/ME00-01-0052
GrantRWHumphries
7

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.

Ryan Bressler
fuente
4

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.

Alex Williams
fuente
1
Muchas gracias por los enlaces, Alex. El documento ofrece buenos ejemplos de casos en los que desearía ponderar sus clasificadores. Sin embargo, me temo que esto no funciona para mí, ya que uno no puede usar el parámetro "classwt" para nada más que ponderar los clasificadores, es decir, necesita un peso por clase, de lo contrario, randomForest devolvería un error.
Nikolay Nenov
1
Sí, no creo que pueda usar "classwt" directamente. Desea algún parámetro como "pesos de observación" pero no creo que exista.
Alex Williams