更新Python Pickle对象

更新Python Pickle对象,python,pickle,Python,Pickle,我正在做一个机器学习项目,为此我使用Python的pickle模块 基本上,我是通过一个巨大的数据集进行解析,这在一次执行中是不可能的,这就是为什么我需要保存分类器对象并在下一次执行中更新它 所以我的问题是,当我使用新的数据集再次运行程序时,是否会修改(或更新)已经创建的pickle对象。如果不是,那么如何在每次运行程序时更新相同的pickle对象 save_classifier = open("naivebayes.pickle","wb") pickle.dump(classifier,sa

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

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

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

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

取消勾选您的
分类器
对象将以与勾选时相同的状态重新创建它,因此您可以继续使用数据集中的新数据更新它。在程序运行结束时,再次pickle
分类器
,并将其再次保存到文件中。最好不要覆盖同一个文件,而是保留一个备份(或者更好的是,保留一系列备份),以防把事情搞砸。这样,您就可以轻松地返回到
分类器的已知良好状态

您应该尝试酸洗,使用一个简单的程序和一个简单的对象来酸洗和取消酸洗,直到您完全相信这一切是如何工作的


下面是如何更新pickled
分类器
数据的大致示意图

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)
第一次运行此程序时,它将创建一个新的
分类器
,使用
训练集
中的数据对其进行训练,然后将
分类器
pickle改为“naivebayes.pickle”。以后每次运行此程序时,它都会加载旧的
分类器
,并向其应用更多的训练数据


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

import pickle 


没有什么事情是自动发生的。下一次运行程序需要打开文件,将其中的pickle加载回一个普通Python对象,修改该对象,然后像上面一样将其保存回去。@KirkStrauser我就是这么说的。我应该让我的代码像这样,对吗?下一次跑步。已经创建的naivebayes.pickle将得到更新,对吗?分类器是否适合RAM而不影响其余的计算?@Arqam保存pickle的文件没有任何“特殊”之处。这只是一个普通文件。如果更新
分类器
,然后再次运行上面的代码,
naivebayes.pickle
将保存新版本。但这不会自行发生:除非运行
pickle.dump
行,否则对
分类器的任何修改都不会写入
naivebayes.pickle
@sobek我不会立即在完整的数据集中执行,这就是为什么它能够适应。我正在破坏数据集,然后通过对每个细分数据集进行训练来修改分类器对象。因此,当我在同一对象上运行
pickle.dump
时,先前保存的分类器对象不会被删除,而是会被修改,对吗?@Arqam:取决于保存分类器时是否指定了不同的文件名。每次使用相同的名称,它将在重写文件时有效地删除以前的版本。执行
pickle.dump(分类器,保存分类器)
时,它将当前
分类器
对象的pickle表示保存到打开的文件
保存分类器
,如果该文件已存在,则覆盖旧内容。这就是为什么我建议将经过pickle处理的数据保存在一系列文件中。例如
naivebayes000.pickle
naivebayes001.pickle
,等等@PM2Ring但最终我将不得不使用经过充分训练的一个分类器对象,从而保存在一个文件中进行分类?马蒂诺说的是对的吗?@PM2Ring一次我可以用一个腌制分类器来训练,对吗?那么,拥有这么多文件会有什么帮助呢?
import cPickle as pickle