2012-04-04 12 views
46

Jestem nieco zdezorientowany jeśli chodzi o sposób, w jaki zapisuję wyszkolonego klasyfikatora. Ponowne szkolenie klasyfikatora za każdym razem, gdy chcę go używać, jest oczywiście bardzo złe i powolne, jak je zapisać i załadować ponownie, gdy jest to potrzebne? Kod jest poniżej, z góry dzięki za pomoc. Używam Pythona z NLTK Naive Bayes Classifier.Save Naive Bayes Trained Classifier w NLTK

classifier = nltk.NaiveBayesClassifier.train(training_set) 
# look inside the classifier train method in the source code of the NLTK library 

def train(labeled_featuresets, estimator=nltk.probability.ELEProbDist): 
    # Create the P(label) distribution 
    label_probdist = estimator(label_freqdist) 
    # Create the P(fval|label, fname) distribution 
    feature_probdist = {} 
    return NaiveBayesClassifier(label_probdist, feature_probdist) 
+2

Czy y pytasz o jakąś strategię wytrwałości? Jak zapisać w DB, plik i załadować ponownie? Możesz po prostu pobrać dane i załadować je później. – EdChum

Odpowiedz

80

zapisać:

import pickle 
f = open('my_classifier.pickle', 'wb') 
pickle.dump(classifier, f) 
f.close() 

załadować później:

import pickle 
f = open('my_classifier.pickle', 'rb') 
classifier = pickle.load(f) 
f.close() 
+0

jak bym go obejść, jeśli chcę przekwalifikować mój model przy użyciu już marynowany model? import pickle f = open ('my_classifier.pickle', 'rb') klasyfikator = pickle.load (f) ..... następnie? – Mohsin

5

Przeszedłem przez ten sam problem i nie można zapisać obiektu, ponieważ jest to klasa ELEFreqDistr NLTK. W każdym razie NLTK jest piekielnie wolny. Trening trwał 45 minut na przyzwoitym zestawie i zdecydowałem się na implementację własnej wersji algorytmu (uruchom z pypy lub zmień jego nazwę na .pyx i zainstaluj cython). Trwa to około 3 minuty z tego samego zestawu i może po prostu zapisać dane jako json (zaimplementuję pikle, które jest szybsze/lepsze).

zacząłem prosty projekt GitHub, sprawdź kod here

+0

Dzięki @ luke14free, czy masz dokumentację, jak z niego korzystać? Z góry dziękuję. – Istvan

+0

Widzę Cię kodu, ale nie zaimplementować cython jeszcze –

0

przekwalifikować marynowane klasyfikujący:

f = open('originalnaivebayes5k.pickle','rb') 
classifier = pickle.load(f) 
classifier.train(training_set) 
print('Accuracy:',nltk.classify.accuracy(classifier,testing_set)*100) 
f.close() 
Powiązane problemy