繁体   English   中英

更新 Python Pickle 对象

[英]Updating Python Pickle Object

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

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

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

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

解压您的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的数据training_set ,然后classifier为“naivebayes.pickle”。 每次运行此程序时,它都会加载旧classifier并向其应用更多训练数据。


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

import pickle 

import cPickle as pickle

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM