Taille prohibitive de la forêt aléatoire lors de l'enregistrement sur le disque

9

Lorsqu'il est enregistré sur le disque à l'aide de cPickle: /programming/20662023/save-python-random-forest-model-to-file , ma forêt aléatoire est de 6,57 Go.

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

Je veux utiliser la forêt elle-même pour faire des prédictions via une API python hébergée sur Heroku - bien sûr, cette taille de fichier est inacceptable.

Pourquoi la taille du fichier est-elle si grande? Il y a 500 arbres dans l'ensemble - tout ce que je veux sauver, ce sont les arbres achevés eux-mêmes, car ils seront utilisés comme prédiction. Est-ce que ce sont les nœuds et les bords réels qui composent chacune des 500 arbres qui nécessitent près de 7 Go d'espace sur le disque?

J'ai utilisé randomforestregressor 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

De plus, s'il existe un meilleur moyen de rendre mon modèle accessible via l'API, ce serait également bon à savoir.

Mise à jour: je l'ai réduit à 100 arbres sans perdre beaucoup de puissance prédictive, et maintenant la taille enregistrée est de 1,3 Go - beaucoup plus gérable, mais toujours pas génial.

compguy24
la source
1
Lol et moi pensions que le mien était gros. Ma forêt aléatoire a pris 330 Mo, je l'ai trouvé bizarre, je pensais que c'était énorme pour un fichier, alors je suis venu ici et j'ai vu le vôtre prend 6,57 Go alors maintenant je me sens mieux lol merci. Je ne connais pas votre nombre d'enregistrements mais je suppose que cela fera une différence. J'utilise également 500 arbres, j'ai essayé avec 100, 500 et 1000, je n'ai pas remarqué de différence de précision considérable, alors je suis revenu à 500.
AndroidMarshmallow

Réponses:

5

La taille de chaque arbre dépend beaucoup de sa profondeur. Ainsi, changez la profondeur maximale ( max_depth). Essayez de le définir sur un nombre fini (par opposition à la valeur par défaut "Aucun"), puis essayez de réduire ce nombre. De plus (ou comme alternative) essayez d'augmenter min_samples_splitou min_samples_split.

Vous pouvez également analyser vos fonctionnalités et n'en conserver que les plus importantes. La façon la plus simple serait de jeter un œil à la clf.feature_importances_forêt. (En général, trouver des éléments importants est un art et une science en soi.) Exclure les éléments non pertinents et reconstruire la forêt.

lanenok
la source
2

Essaye ça:

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

Remarque: avec le paramètre "-1", la taille du fichier modèle sera largement réduite.

Selon la documentation:

pickle.dump (obj, fichier [, protocole])

La version 0 du protocole est le protocole ASCII d'origine et est rétrocompatible avec les versions antérieures de Python. Le protocole version 1 est l'ancien format binaire qui est également compatible avec les versions antérieures de Python. La version 2 du protocole a été introduite dans Python 2.3. Il fournit un décapage beaucoup plus efficace des classes de nouveau style.

Si le paramètre de protocole est omis, le protocole 0 est utilisé. Si le protocole est spécifié comme une valeur négative ou HIGHEST_PROTOCOL, la version de protocole la plus élevée sera utilisée.

elecjack
la source