2016-04-22 9 views
1

Ich mache ein Projekt in Machine Learning und dafür verwende ich das pickle Modul von Python.Aktualisieren Python Pickle-Objekt

Grundsätzlich analysiere ich einen riesigen Datensatz, der in einer Ausführung nicht möglich ist, deshalb muss ich das Klassifikatorobjekt speichern und in der nächsten Ausführung aktualisieren.

Also meine Frage ist, wenn ich das Programm erneut mit dem neuen Datensatz starte, dann wird das bereits erstellte Pickel-Objekt modifiziert (oder aktualisiert). Wenn nicht, wie kann ich das gleiche Pickle-Objekt jedes Mal aktualisieren, wenn ich das Programm starte.

save_classifier = open("naivebayes.pickle","wb") 
pickle.dump(classifier,save_classifier) 
save_classifier.close() 
+2

Nichts geschieht automatisch. Ihr nächster Lauf des Programms muss die Datei öffnen, den Pickle darin in ein normales Python-Objekt laden, das Objekt modifizieren und dann wie oben wieder speichern. –

+0

@KirkStrauser Das sage ich. Ich sollte meinen Code so lassen, nur richtig? Für den nächsten Lauf. Die schon erstellten naivebayes.pickle werden aktualisiert oder? – Arqam

+0

Passt der Klassifizierer in den Arbeitsspeicher, ohne die restlichen Berechnungen zu beeinflussen? – sobek

Antwort

0

Unpickling Ihr classifier Objekt wird es im gleichen Zustand neu zu erstellen, dass es war, als Sie es gebeizt, so können Sie es mit frischen Daten aus dem Datensatz zu aktualisieren fortfahren. Und am Ende des Programmlaufs stechen Sie wieder in den Ordner classifier und speichern ihn erneut in einer Datei. Es ist eine gute Idee, nicht die gleiche Datei zu überschreiben, sondern eine Sicherungskopie (oder besser noch eine Reihe von Sicherungskopien) zu behalten, falls Sie etwas vermasseln. Auf diese Weise können Sie leicht zu einem bekannten guten Zustand Ihrer classifier zurückkehren.

Sie sollten mit dem Beizen experimentieren, indem Sie ein einfaches Programm und ein einfaches Objekt zum Beizen und Abtrennen verwenden, bis Sie völlig sicher sind, wie das alles funktioniert.


Hier ist eine grobe Skizze, wie die eingelegten classifier Daten zu aktualisieren.

import pickle 
import os 
from os.path import exists 
# other imports required for nltk ... 

picklename = "naivebayes.pickle" 

# stuff to set up featuresets ... 

featuresets = [(find_features(rev), category) for (rev, category) in documents] 
numtrain = int(len(documents) * 90/100) 
training_set = featuresets[:numtrain] 
testing_set = featuresets[numtrain:] 

# Load or create a classifier and apply training set to it 
if exists(picklename): 
    # Update existing classifier 
    with open(picklename, "rb") as f: 
     classifier = pickle.load(f) 
    classifier.train(training_set) 
else: 
    # Create a brand new classifier  
    classifier = nltk.NaiveBayesClassifier.train(training_set) 

# Create backup 
if exists(picklename): 
    backupname = picklename + '.bak' 
    if exists(backupname): 
     os.remove(backupname) 
    os.rename(picklename, backupname) 

# Save 
with open(picklename, "wb") as f: 
    pickle.dump(classifier, f) 

Das erste Mal, wenn Sie dieses Programm ausführen wird es eine neue classifier, trainieren sie mit den Daten in training_set erstellen, Beize dann classifier auf „naivebayes.pickle“. Jedes weitere Mal, wenn Sie dieses Programm ausführen, wird das alte classifier geladen und weitere Trainingsdaten darauf angewendet.


BTW, wenn Sie diese 2 in Python tun sollten Sie viel schneller cPickle Modul verwenden; Sie können das tun

ersetzen
import pickle 

mit

import cPickle as pickle 
+0

Also das zuvor gespeicherte Classifier-Objekt wird nicht entfernt, wenn ich 'pickle.dump' auf dem gleichen Objekt ausführen, stattdessen wird es geändert werden, oder? – Arqam

+1

@Arqam: Hängt davon ab, ob Sie beim Speichern des Klassifikators einen anderen Dateinamen angeben. Verwenden Sie den gleichen Namen jedes Mal und es wird effektiv die vorherige Version entfernen, wenn es die Datei neu schreibt. – martineau

+0

Wenn du 'pickle.dump (classifier, save_classifier) ​​'tust, speichert es die eingelegte Darstellung des aktuellen' classifier'-Objekts in der offenen Datei' save_classifier' und überschreibt den alten Inhalt, wenn diese Datei bereits existiert. Und deshalb habe ich vorgeschlagen, Ihre gebeizten Daten in einer Reihe von Dateien zu speichern. ZB 'naivebayes000.pickle',' naivebayes001.pickle', etc. –

Verwandte Themen