2016-04-22 2 views
1

Я делаю проект в Machine Learning, и для этого я использую модуль Python для pickle.Обновление Python Pickle Object

В принципе, я разбираюсь в огромном наборе данных, который невозможен в одном исполнении, поэтому мне нужно сохранить объект-классификатор и обновить его при следующем выполнении.

Так что я задаю вопрос, когда я снова запускаю программу с новым набором данных, тогда будет изменен (или обновлен) уже созданный объект pickle. Если нет, то как я могу обновить один и тот же объект рассола каждый раз, когда я запускаю программу.

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

Ничего не происходит автоматически. Следующий запуск программы должен открыть файл, загрузить рассол в него обратно в обычный объект Python, изменить этот объект, а затем сохранить его обратно так же, как вы сделали выше. –

+0

@KirkStrauser Вот что я говорю. Я должен оставить свой код, как это, только правильно? Для следующего прогона. Уже созданный файл naivebayes.pickle будет обновлен правильно? – Arqam

+0

Включает ли классификатор в ОЗУ без ущерба для остальной части ваших расчетов? – sobek

ответ

0

Unpickling ваш 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 pickle 

с

import cPickle as pickle 
+0

Таким образом, ранее сохраненный объект-классификатор не будет удален, когда я запустил 'pickle.dump' на том же объекте, вместо этого он будет изменен правильно? – Arqam

+1

@Arqam: зависит от того, укажите ли вы другое имя файла при сохранении классификатора. Используйте одно и то же имя каждый раз, и оно эффективно удалит предыдущую версию при перезаписывании файла. – martineau

+0

Когда вы делаете 'pickle.dump (классификатор, save_classifier)', он сохранит маринованное представление текущего объекта 'classifier' в открытый файл' save_classifier', перезаписывая старое содержимое, если этот файл уже существует. И поэтому я предложил сохранить ваши маринованные данные в серии файлов. Например, 'naivebayes000.pickle',' naivebayes001.pickle' и т. Д. –