49

对于如何保存训练有素的分类器,我有点困惑。例如,每次我想使用它时重新训练一个分类器显然真的很糟糕而且很慢,我如何保存它并在需要时再次加载它?代码如下,提前感谢您的帮助。我正在使用带有 NLTK 朴素贝叶斯分类器的 Python。

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)
4

3 回答 3

92

保存:

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

稍后加载:

import pickle
f = open('my_classifier.pickle', 'rb')
classifier = pickle.load(f)
f.close()
于 2012-04-04T22:05:23.033 回答
5

我遇到了同样的问题,您无法保存该对象,因为它是一个 ELEFreqDistr NLTK 类。无论如何,NLTK 非常慢。在一个不错的集合上训练花了 45 分钟,我决定实现我自己的算法版本(使用 pypy 运行它或将其重命名为 .pyx 并安装 cython)。使用相同的设置大约需要 3 分钟,它可以简单地将数据保存为 json(我将实现更快/更好的 pickle)。

我开始了一个简单的github项目,在这里查看代码

于 2012-04-04T18:39:43.140 回答
1

重新训练腌制分类器:

f = open('originalnaivebayes5k.pickle','rb')
classifier = pickle.load(f)
classifier.train(training_set)
print('Accuracy:',nltk.classify.accuracy(classifier,testing_set)*100)
f.close()
于 2018-01-31T12:30:56.797 回答