Unzulässige Größe der zufälligen Gesamtstruktur beim Speichern auf der Festplatte

9

Beim Speichern auf der Festplatte mit cPickle: /programming/20662023/save-python-random-forest-model-to-file beträgt meine zufällige Gesamtstruktur 6,57 GB.

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

Ich möchte die Gesamtstruktur selbst verwenden, um Vorhersagen über eine auf Heroku gehostete Python-API zu treffen - natürlich ist diese Dateigröße nicht akzeptabel.

Warum ist die Datei so groß? Es gibt 500 Bäume im Ensemble - alles, was ich retten möchte, sind die fertigen Bäume selbst, da sie als Vorhersage verwendet werden. Sind es die tatsächlichen Knoten und Kanten, aus denen jeder der 500 Bäume besteht, die fast 7 GB Speicherplatz auf der Festplatte benötigen?

Ich habe den Randomforestregressor von scikitlearn verwendet:

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

Wenn es eine bessere Möglichkeit gibt, mein Modell über die API zugänglich zu machen, wäre dies ebenfalls gut zu wissen.

Update: Ich habe es auf 100 Bäume reduziert, ohne viel Vorhersagekraft zu verlieren. Die gespeicherte Größe beträgt jetzt 1,3 GB - viel besser handhabbar, aber immer noch nicht großartig.

compguy24
quelle
1
Lol und ich fanden meine groß. Mein zufälliger Wald hat 330 Mb gedauert, ich fand es komisch, dachte, das wäre eine riesige Größe für eine Datei, also bin ich hierher gekommen und habe gesehen, dass deine 6,57 Gb nimmt, also fühle ich mich jetzt besser lol danke. Ich kenne Ihre Anzahl von Datensätzen nicht, aber ich nehme an, das wird einen Unterschied machen. Ich benutze auch 500 Bäume, ich habe es mit 100, 500 und 1000 versucht, habe keinen nennenswerten Unterschied in der Genauigkeit bemerkt und bin auf 500 zurückgegangen.
AndroidMarshmallow

Antworten:

4

Die Größe jedes Baumes hängt sehr stark von seiner Tiefe ab. Ändern Sie daher die maximale Tiefe ( max_depth). Versuchen Sie, eine endliche Zahl festzulegen (im Gegensatz zur Standardeinstellung "Keine"), und versuchen Sie dann, diese Zahl zu verringern. Zusätzlich (oder alternativ) versuchen zu erhöhen min_samples_splitoder min_samples_split.

Sie können Ihre Funktionen auch analysieren und nur wichtige behalten. Der einfachste Weg wäre, einen Blick auf clf.feature_importances_Ihren Wald zu werfen . (Im Allgemeinen ist das Finden wichtiger Merkmale eine Kunst und Wissenschaft für sich.) Schließen Sie nicht relevante Merkmale aus und bauen Sie den Wald wieder auf.

lanenok
quelle
2

Versuche dies:

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

Hinweis: Mit dem Parameter "-1" wird die Modelldateigröße stark reduziert.

Laut Dokumentation:

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

Protokollversion 0 ist das ursprüngliche ASCII-Protokoll und abwärtskompatibel mit früheren Versionen von Python. Protokollversion 1 ist das alte Binärformat, das auch mit früheren Versionen von Python kompatibel ist. Protokoll Version 2 wurde in Python 2.3 eingeführt. Es bietet ein viel effizienteres Beizen von Klassen neuen Stils.

Wenn der Protokollparameter weggelassen wird, wird Protokoll 0 verwendet. Wenn das Protokoll als negativer Wert oder als HIGHEST_PROTOCOL angegeben ist, wird die höchste Protokollversion verwendet.

elecjack
quelle