Pandas y Scikit: uso de memoria al cortar DataFrame

Tengo un DataFrame DataFrame , cargado desde un archivo csv (alrededor de 300MB).

De esto, estoy extrayendo algunas docenas de funciones para usar en un RandomForestClassifier : algunas de las funciones simplemente se derivan de columnas en los datos, por ejemplo:

  feature1 = data["SomeColumn"].apply(len) feature2 = data["AnotherColumn"] 

Y otros se crean como nuevos DataFrame s a partir de matrices numpy, utilizando el índice en el dataframe original:

 feature3 = pandas.DataFrame(count_array, index=data.index) 

Todas estas características se unen en un DataFrame :

 features = feature1.join(feature2) # etc... 

Y entreno a un clasificador de bosques al azar:

 classifier = RandomForestClassifier( n_estimators=100, max_features=None, verbose=2, compute_importances=True, n_jobs=n_jobs, random_state=0, ) classifier.fit(features, data["TargetColumn"]) 

El RandomForestClassifier funciona bien con estas características, la construcción de un árbol requiere O (cientos de megabytes de memoria). Sin embargo : si después de cargar mis datos, tomo un pequeño subconjunto de ellos:

 data_slice = data[data['somecolumn'] > value] 

Luego, la construcción de un árbol para mi bosque aleatorio de repente requiere muchos gigabytes de memoria, aunque el tamaño de las características DataFrame ahora es O (10%) del original.

Puedo creer que esto podría deberse a que una vista dividida en los datos no permite que se realicen más porciones de manera eficiente (aunque no veo cómo esto podría propagarse en la matriz de características), así que lo intenté:

 data = pandas.DataFrame(data_slice, copy=True) 

pero esto no ayuda.

  • ¿Por qué tomar un subconjunto de los datos boostía masivamente el uso de la memoria?
  • ¿Hay alguna otra forma de compactar / reorganizar un DataFrame que pueda hacer las cosas más eficientes nuevamente?

El RandomForestClassifier está copiando el conjunto de datos varias veces en la memoria, especialmente cuando n_jobs es grande. Somos conscientes de esos problemas y es una prioridad solucionarlos:

  • Actualmente estoy trabajando en una subclase de la clase multiprocessing.Pool de la biblioteca estándar que no hará ninguna copia de memoria cuando numpy.memmap instancias numpy.memmap se pasen a los trabajadores de subproceso. Esto permitirá compartir la memoria del conjunto de datos de origen + algunas estructuras de datos precalculadas entre los trabajadores. Una vez que esto esté solucionado, cerraré este problema en el rastreador de github .

  • Hay una refactorización en curso que reducirá aún más el uso de memoria de RandomForestClassifier en dos. Sin embargo, el estado actual de la refactorización es dos veces más lento que el maestro, por lo que aún se requiere más trabajo.

Sin embargo, ninguna de esas correcciones llegará a la versión 0.12 que se lanzará la próxima semana. Lo más probable es que se hagan por 0.13 (previsto para el lanzamiento en 3 a 4 meses), pero el curso estará disponible en la sucursal maestra mucho antes.