¿Por qué el bosque aleatorio (scikit-learn) usa tanta memoria? ¿Existen otras implementaciones además de scikit-learn que son más eficientes en memoria?

Me he encontrado con un problema similar en el pasado. ¿Está intentando utilizar el paralelismo de scikit-learn modificando el argumento ‘n_jobs’ al clasificador (consulte la descripción en la documentación)? Si es así, debe tener en cuenta que su matriz de entrada se copiará en cada núcleo en el que la ejecute. Entonces, si ejecuta 4 trabajos, en realidad está entrenando en 4 copias completas de los datos de entrada, que en su caso consumirán de inmediato toda la RAM disponible.

Algo peor ocurre si está intentando utilizar la búsqueda de cuadrícula para ajustar sus hiperparámetros: ¡sus datos se copian una vez por punto de cuadrícula por trabajo! Tenga en cuenta que el argumento ‘pre_dispatch’ complica aún más las cosas (de esa misma página de documentación):

Si n_jobs se estableció en un valor superior a uno, los datos se copian para cada punto de la cuadrícula (y no para n_jobs veces). Esto se hace por razones de eficiencia si los trabajos individuales toman muy poco tiempo, pero pueden generar errores si el conjunto de datos es grande y no hay suficiente memoria disponible. Una solución en este caso es establecer pre_dispatch. Luego, la memoria solo se copia pre_dispatch muchas veces. Un valor razonable para pre_dispatch es 2 * n_jobs.

Desafortunadamente, si desea usar Python, no conozco ninguna otra implementación sólida de código abierto de bosques aleatorios. Existen compañías de ML como servicio como Wise.io | Aprendizaje automático como servicio y análisis de Big Data que le permitirán enviar datos, entrenar modelos y obtener resultados utilizando python, y podrían ser gratuitos para los académicos (la respuesta de Joshua Bloom a la Clasificación (Aprendizaje automático): ¿Cuáles son buenas bibliotecas para bosques aleatorios? ?) Si no está vinculado a Python, hay muchas implementaciones excelentes de bosques aleatorios en muchos otros idiomas: recomendaría Weka, que es una biblioteca de Java (y creo que también tiene un enlace R).

  • El bosque aleatorio no es ideal para grandes problemas de matriz dispersa (con más de 1000 columnas). Use algo más, como Naive Bayes o SVM.
  • Si desea utilizar RF por cualquier motivo (para problemas que no sean de bolsa de palabras), reduzca la profundidad de los árboles, así como el número o los árboles. A menudo puedes hacerlo sin sacrificar el poder predictivo
  • Definitivamente no es necesario reescribir RF usted mismo en C ++ (como alguien sugirió aquí). La implementación en scikit-learn es una de las bibliotecas numéricas más optimizadas disponibles y que utiliza altamente eficiente. Cualquier código C ++ personalizado será más lento y requerirá más memoria, solo porque será nuevo y no se pulirá con el tiempo.

Aparentemente, la implementación de bosque aleatorio sklearn copia la matriz de características para cada árbol, lo que lleva a un consumo de memoria loco.
Tengo algunos puntos de referencia sobre eso:
constantinpape / rf_benchmarks

La implementación de bosque aleatorio vigra (ver arriba en el repositorio) tiene un rendimiento similar con el uso de memoria RAM.

Una nota en el documento de sklearn relacionada con esto estará en la próxima versión.

Aquí la nota relacionada:

El tamaño del modelo con los parámetros predeterminados es `O (M * N * log (N))` donde `M` es el número de árboles y` N` es el número de muestras.

Para reducir el tamaño del modelo, puede cambiar estos parámetros: “min_samples_split“, “min_samples_leaf“, “max_leaf_nodes“ y “max_depth“.

Por lo tanto, en cualquier caso, cuanto mayor sea el número de muestras, más necesita memoria.

Puedes intentar preguntar en la página de información de scikit-learn Scikit-learn-general

asegúrese de que el árbol de decisión NO se implemente de forma recursiva. En otras palabras, debe construir el árbol utilizando una cola en lugar de crearlo de forma recursiva.