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

Python 2.7 ';未拟合idf矢量';使用保存的分类器/模型时出错,python-2.7,scikit-learn,naivebayes,Python 2.7,Scikit Learn,Naivebayes,如果我使用了错误的术语,请原谅,但我想要的是训练一组数据(使用Scikit Learn中的GaussianNB Naive Bayes),保存模型/分类器,然后在需要时加载它并预测类别 from sklearn.externals import joblib from sklearn.naive_bayes import GaussianNB from sklearn.feature_extraction.text import TfidfVectorizer self.vectorizer

如果我使用了错误的术语,请原谅,但我想要的是训练一组数据(使用Scikit Learn中的GaussianNB Naive Bayes),保存模型/分类器,然后在需要时加载它并预测类别

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'
谁能告诉我我错过了什么

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


谢谢

您需要对
self.vectorier
进行pickle处理,然后再次加载它。目前,您仅保存矢量器学习的词汇表

更改程序中的以下行:

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

以及以下一行:

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

删除此行:

self.vectorizer = TfidfVectorizer(vocabulary=self.vocab, decode_error='ignore')
问题解释

你的想法是正确的,只需保存所学的词汇并重复使用即可。但是scikit learn TFIDFvectorier还具有
idf\uz
属性,该属性包含已保存词汇表的idf。所以你也需要保存它。但是,即使您同时保存并将它们加载到新的TfidfVectorizer实例中,也会出现“not_fitted”错误。因为这正是大多数scikit变压器和估计器的定义方式。因此,在不做任何“黑客”的情况下,保存整个矢量器是最好的选择。如果您仍然想进入“保存词汇表”路径,请在此处查看如何正确执行此操作:

上面的页面将
词汇表
保存到json中,并将
idf
保存到一个简单数组中。您可以在那里使用pickles,但您将了解TfidfVectorizer的工作原理

希望能有帮助

self.vectorizer =joblib.load('trained/vectorizer.pkl')
self.vectorizer = TfidfVectorizer(vocabulary=self.vocab, decode_error='ignore')