Tamaño prohibitivo del bosque aleatorio cuando se guarda en el disco

9

Cuando se guarda en el disco usando cPickle: /programming/20662023/save-python-random-forest-model-to-file , mi bosque aleatorio es de 6.57 GB.

with open('rforest.cpickle', 'wb') as f:
    cPickle.dump(rforest, f)

Quiero usar el bosque mismo para hacer predicciones a través de una API de Python alojada en Heroku; por supuesto, ese tamaño de archivo es inaceptable.

¿Por qué el tamaño del archivo es tan grande? Hay 500 árboles en el conjunto; todo lo que quiero guardar son los árboles completos, ya que se usarán como predicción. ¿Son los nodos y bordes reales que componen cada uno de los 500 árboles que requieren casi 7 GB de espacio en el disco?

Utilicé el progreso aleatorio de scikitlearn:

def buildForest(self, X_train, y_train):
    rf = RandomForestRegressor(n_estimators=500, verbose=1)
    rf.fit_transform(X_train, y_train)
    return rf

Además, si hay una mejor manera de hacer que mi modelo sea accesible a través de API, también sería bueno saberlo.

Actualización: lo reduje a 100 árboles sin perder mucho poder predictivo, por lo que ahora el tamaño guardado es de 1.3 GB, mucho más manejable, pero aún no excelente.

compguy24
fuente
1
Lol y yo pensamos que el mío era grande. Mi bosque aleatorio tomó 330 Mb, lo encontré extraño, pensé que era un tamaño enorme para un archivo, así que vine aquí y vi que el tuyo toma 6.57 Gb, así que ahora me siento mejor, jaja, gracias. No sé su número de registros, pero supongo que eso hará la diferencia. También estoy usando 500 árboles, probé con 100, 500 y 1000, no noté una diferencia considerable en la precisión, así que volví a 500.
AndroidMarshmallow

Respuestas:

5

El tamaño de cada árbol depende mucho de su profundidad. Por lo tanto, cambie la profundidad máxima ( max_depth). Intente establecerlo en un número finito (en oposición al "Ninguno" predeterminado) y luego intente reducir este número. Además (o como alternativa) intenta aumentar min_samples_splito min_samples_split.

También puede analizar sus características y conservar solo las importantes. La forma más sencilla sería echar un vistazo a clf.feature_importances_tu bosque. (En general, encontrar características importantes es un arte y una ciencia en sí mismo). Excluir características no relevantes y reconstruir el bosque.

Lanenek
fuente
2

Prueba esto:

import pickle
with open('rforest.pickle', 'wb') as f:
    pickle.dump(rforest, f, -1)

Aviso: con el parámetro "-1", el tamaño del archivo del modelo se reducirá en gran medida.

De acuerdo con la documentación:

pickle.dump (obj, archivo [, protocolo])

La versión 0 del protocolo es el protocolo ASCII original y es compatible con versiones anteriores de Python. La versión 1 del protocolo es el antiguo formato binario que también es compatible con versiones anteriores de Python. La versión 2 del protocolo se introdujo en Python 2.3. Proporciona una preparación mucho más eficiente de las clases de estilo nuevo.

Si se omite el parámetro de protocolo, se usa el protocolo 0. Si el protocolo se especifica como un valor negativo o HIGHEST_PROTOCOL, se utilizará la versión más alta del protocolo.

elecjack
fuente