Python 2.7 ';未拟合idf矢量';使用保存的分类器/模型时出错
如果我使用了错误的术语,请原谅,但我想要的是训练一组数据(使用Scikit Learn中的GaussianNB Naive Bayes),保存模型/分类器,然后在需要时加载它并预测类别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
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')