如何通过保存经过训练的模型来减少使用 pickle 的编译时间?

Posted

技术标签:

【中文标题】如何通过保存经过训练的模型来减少使用 pickle 的编译时间?【英文标题】:How to reduce compilation time using pickle by saving trained model? 【发布时间】:2017-08-08 12:45:58 【问题描述】:

这是一个情绪分析代码,每次我更改输入时,编译需要 10-15 分钟。我可以通过哪些方法来减少它?通过保存分类器或任何其他方法使用泡菜更好? 其他功能这里就不说了。

inpTweets = csv.reader(open('training_neatfile_4.csv', 'r' ,encoding='ISO-8859-1'), delimiter=',')
stopWords = getStopWordList('stopwords.txt')
count = 0;
featureList = []
tweets = []
for row in inpTweets:
    sentiment = row[0]
    tweet = row[1]
    processedTweet = processTweet(tweet)
    featureVector = getFeatureVector(processedTweet, stopWords)
    featureList.extend(featureVector)
    tweets.append((featureVector, sentiment));
#end loop

# Remove featureList duplicates
featureList = list(set(featureList))

# Generate the training set
training_set = nltk.classify.util.apply_features(extract_features, tweets)

# Train the Naive Bayes classifier
nb_classifier = nltk.NaiveBayesClassifier.train(training_set)

# Test the classifier
testTweet = 'He is a brainless kid'
processedTestTweet = processTweet(testTweet)
sentiment = nb_classifier.classify(extract_features(getFeatureVector(processedTestTweet, stopWords)))
print ("testTweet = %s, sentiment = %s\n" % (testTweet, sentiment))

【问题讨论】:

【参考方案1】:

训练一个 NaiveBayesClassifier(或任何)需要很多时间(取决于训练数据的输入),如果你保存分类器的对象(NBClassifier),一旦你通过省略 re 来训练它以节省时间,它会变得更容易-培训。

以下是使用pickle保存对象的方法,您可以在代码中使用它来保存训练或加载分类器。

import pickle
pickle.dump(object, file)

你可以通过如下保存它的对象(nb_classifier)来保存 NaiveBayesClassifier。

with open('model.pkl', 'wb') as nb_classifier_model:
    pickle.dump(nb_classifier, nb_classifier_model)

然后,您可以将其检索为:

with open('model.pkl', 'rb') as nb_classifier_model:
    nb_classifier = pickle.load(nb_classifier_model)

这就是您可以通过相应的使用来实现目标的方式。

希望对你有帮助!

【讨论】:

感谢您的回答!但是我应该在 pickle.dump() 中传递什么对象? 我已经在示例代码中提到了这一点,请传递 NBClassifier,因为它用于根据您的代码对推文进行分类,即NBClassifier.classify() @A.Bora 您可能会感到困惑,因为您没有遵循 Python 的变量命名约定。您问题中的NBClassifier 不是类型,而是NaiveBayesClassifier 类型的对象。称它为nb_classifier(或其他),代码会更清晰。 @abhinav,出于同样的原因,您的代码让读者感到困惑。看起来好像您正在转储分类器 class,但当然是经过训练的对象被转储了。我建议您编辑您的答案以澄清。 (我会使用适当的大小写,即使它与问题中的变量名不匹配。) @alexis,你知道为什么没有Classifier.save() 方法吗?

以上是关于如何通过保存经过训练的模型来减少使用 pickle 的编译时间?的主要内容,如果未能解决你的问题,请参考以下文章

R 保存朴素贝叶斯进行训练,R 相当于 Python 的 pickle。

如何在 Keras 中保存经过训练的模型以在应用程序中使用它?

keras 如何保存训练集与验证集正确率的差最小那次epoch的网络及权重

如何对经过训练的目标检测模型进行剪枝?

如何保存经过训练的模型(估计器)并将其加载回来以使用 Tensorflow 中的数据对其进行测试?

如何在 theano 中保存/序列化经过训练的模型?