' idf矢量未适合'使用保存的分类器/模型时出错

时间:2017-06-30 22:57:08

标签: python-2.7 scikit-learn naivebayes

请原谅我,如果我使用错误的术语,但我想要的是训练一组数据(使用来自Scikit Learn的GaussianNB朴素贝叶斯),保存模型/分类器,然后在需要时加载它并预测一个类别。 / p>

from sklearn.externals import joblib
from sklearn.naive_bayes import GaussianNB
from sklearn.feature_extraction.text import TfidfVectorizer

self.vectorizer = TfidfVectorizer(decode_error='ignore')
self.X_train_tfidf = self.vectorizer.fit_transform(train_data)

# Fit the model to my training data
self.clf = self.gnb.fit(self.X_train_tfidf.toarray(), category)

# Save the classifier to file
joblib.dump(self.clf, 'trained/NB_Model.pkl')

# Save the vocabulary to file
joblib.dump(self.vectorizer.vocabulary_, 'trained/vectorizer_vocab.pkl')


#Next time, I read the saved classifier
self.clf = joblib.load('trained/NB_Model.pkl')

# Read the saved vocabulary
self.vocab =joblib.load('trained/vectorizer_vocab.pkl')

# Initializer the vectorizer
self.vectorizer = TfidfVectorizer(vocabulary=self.vocab, decode_error='ignore')

# Try to predict a category for new data
X_new_tfidf = self.vectorizer.transform(new_data)
print self.clf.predict(X_new_tfidf.toarray())

# After running the predict command above, I get the error
'idf vector is not fitted'

谁能告诉我我失踪了什么?

注意:模型的保存,已保存模型的读取以及尝试预测新类别都是类的不同方法。我把它们全部折叠成一个屏幕,以便于阅读。

由于

1 个答案:

答案 0 :(得分:3)

您需要挑选self.vectorizer并重新加载它。目前,您只保存矢量化器学习的词汇。

更改程序中的以下行:

joblib.dump(self.vectorizer.vocabulary_, 'trained/vectorizer_vocab.pkl')

为:

joblib.dump(self.vectorizer, 'trained/vectorizer.pkl')

以下一行:

self.vocab =joblib.load('trained/vectorizer_vocab.pkl')

到:

self.vectorizer =joblib.load('trained/vectorizer.pkl')

删除此行:

self.vectorizer = TfidfVectorizer(vocabulary=self.vocab, decode_error='ignore')

问题解释

你的想法是正确的,只是保存学到的词汇并重复使用它。但是scikit-learn TfidfVectorizer也有idf_属性,其中包含已保存词汇表的IDF。所以你也需要保存它。但是,即使您将两者都保存并在新的TfidfVectorizer实例中加载它们,那么您也会收到“not_fitted”错误。因为这就是大多数scikit变换器和估算器的定义方式。所以没有做任何“hacky”保存整个矢量化器是你最好的选择。如果您仍想继续保存词汇表路径,那么请看看如何正确地执行此操作:

上面的页面将vocabulary保存到json和idf_中为一个简单的数组。你可以在那里使用泡菜,但你会了解TfidfVectorizer的工作。

希望它有所帮助。