更新Python Pickle对象

时间:2016-04-22 14:20:56

标签: python pickle

我在机器学习中正在做一个项目,因为我正在使用Python的pickle模块。

基本上,我正在解析一个庞大的数据集,这在一次执行中是不可能的,这就是为什么我需要保存分类器对象并在下次执行时更新它。

所以我的问题是,当我使用新数据集再次运行程序时,将修改(或更新)已创建的pickle对象。如果没有,那么每次运行程序时如何更新相同的pickle对象。

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

1 个答案:

答案 0 :(得分:1)

取消挑选classifier对象将以与腌制时相同的状态重新创建它,因此您可以使用数据集中的新数据继续更新它。在程序运行结束时,再次挑选classifier并再次将其保存到文件中。不要覆盖同一个文件但保留备份(甚至更好,一系列备份)是个好主意,万一你搞砸了。这样,您就可以轻松回到classifier的已知良好状态。

你应该尝试使用一个简单的程序和一个简单的对象来进行酸洗,直到你对这一切的运作方式完全有信心。

以下是如何更新pickle classifier数据的草图。

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)

第一次运行此程序时,它会创建一个新的classifier,使用training_set中的数据对其进行训练,然后将classifier挑选到" naivebayes.pickle&#34 ;。每次运行此程序时,它都会加载旧classifier并向其应用更多训练数据。

顺便说一句,如果你在Python 2中这样做,你应该使用更快的cPickle模块;你可以通过替换

来做到这一点
import pickle 

import cPickle as pickle