2016-04-22 32 views
1

我正在做一个机器学习项目,我正在使用Python的pickle模块。正在更新Python Pickle对象

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

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

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

没有更换

import pickle 

自动发生。程序的下一次运行需要打开文件,将pickle加载到一个普通的Python对象中,修改该对象,然后像上面那样保存它。 –

+0

@KirkStrauser这就是我所说的。我应该像这样离开我的代码才对吗?为下一次运行。已创建的naivebayes.pickle会更新正确吗? – Arqam

+0

分类器是否适合RAM而不会影响其余的计算? – sobek

回答

0

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

你应该尝试酸洗,使用一个简单的程序和一个简单的对象来腌泡和取下,直到你对这一切如何工作完全自信。


下面是如何更新腌渍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”。随后每次运行此程序时,它都会加载旧的classifier并向其应用更多的训练数据。


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

import cPickle as pickle 
+0

因此,当我在同一个对象上运行'pickle.dump'时,以前保存的分类器对象将不会被删除,而是会被修改吗? – Arqam

+1

@Arqam:取决于保存分类器时是否指定不同的文件名。每次使用相同的名称,它会在重写文件时有效地删除以前的版本。 – martineau

+0

当你执行'pickle.dump(classifier,save_classifier)'时,它会将当前'classifier'对象的pickle表示保存到打开的文件'save_classifier'中,如果该文件已经存在,则覆盖旧的内容。这就是为什么我建议将您的腌制数据保存在一系列文件中。例如'naivebayes000.pickle','naivebayes001.pickle'等 –