Dimensione proibitiva della foresta casuale quando salvata su disco


9

Quando salvato su disco usando cPickle: /programming/20662023/save-python-random-forest-model-to-file , la mia foresta casuale è di 6.57 GB.

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

Voglio usare la foresta stessa per fare previsioni tramite un'API python ospitata su Heroku - ovviamente, la dimensione del file è inaccettabile.

Perché la dimensione del file è così grande? Ci sono 500 alberi nell'insieme - tutto quello che voglio salvare sono gli alberi completati stessi, poiché saranno usati come previsione. Sono i nodi e i bordi effettivi che compongono ciascuno dei 500 alberi che richiedono quasi 7 GB di spazio su disco?

Ho usato il randomforestregressor di scikitlearn:

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

Inoltre, se esiste un modo migliore per rendere accessibile il mio modello tramite API, sarebbe bene saperlo.

Aggiornamento: l'ho ridotto a 100 alberi senza perdere molta potenza predittiva, e quindi ora la dimensione salvata è di 1,3 GB - molto più gestibile, ma ancora non eccezionale.


1
Lol e io pensavamo che il mio fosse grande. La mia foresta casuale ha preso 330 Mb, l'ho trovata strana, pensavo che fosse una dimensione enorme per un file, quindi sono venuto qui e ho visto che il tuo richiede 6.57 Gb, quindi ora mi sento meglio grazie. Non conosco il tuo numero di record, ma suppongo che questo farà la differenza. Sto anche usando 500 alberi, ho provato con 100, 500 e 1000, non ho notato una notevole differenza di precisione, quindi sono tornato a 500.
AndroidMarshmallow

Risposte:


5

La dimensione di ogni albero dipende molto dalla sua profondità. Quindi, cambia la profondità massima ( max_depth). Prova a impostarlo su un numero finito (al contrario del predefinito "Nessuno") e quindi prova a ridurre questo numero. Inoltre (o in alternativa) prova ad aumentare min_samples_splito min_samples_split.

Puoi anche analizzare le tue funzionalità e conservarne solo quelle importanti. Il modo più semplice sarebbe quello di dare un'occhiata alla clf.feature_importances_tua foresta. (In generale, trovare elementi importanti è un'arte e una scienza in sé.) Escludere elementi non rilevanti e ricostruire la foresta.


2

Prova questo:

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

Avviso: con il parametro "-1" la dimensione del file del modello sarà in gran parte ridotta.

Secondo la documentazione:

pickle.dump (obj, file [, protocol])

La versione 0 del protocollo è il protocollo ASCII originale ed è retrocompatibile con le versioni precedenti di Python. La versione 1 del protocollo è il vecchio formato binario compatibile anche con le versioni precedenti di Python. Il protocollo versione 2 è stato introdotto in Python 2.3. Fornisce un decapaggio molto più efficiente delle classi di nuovo stile.

Se il parametro del protocollo viene omesso, viene utilizzato il protocollo 0. Se il protocollo viene specificato come valore negativo o HIGHEST_PROTOCOL, verrà utilizzata la versione del protocollo più alta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.