python-2.7 - 使用保存的分类器/模型时出现“idf vector is not fitted”错误

标签 python-2.7 scikit-learn naivebayes

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

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'

谁能告诉我我错过了什么?

注意:模型的保存、保存模型的读取和尝试预测一个新类别都是一个类的不同方法。为了便于阅读,我已将它们全部折叠到一个屏幕中。

谢谢

最佳答案

您需要 pickle 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 的工作原理。

希望对您有所帮助。

关于python-2.7 - 使用保存的分类器/模型时出现“idf vector is not fitted”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44855780/

相关文章:

machine-learning - 具有多项式朴素贝叶斯的大量类 (scikit-learn)

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

python - 类型错误 : __init__() takes exactly 2 arguments (3 given)

python - 多行正则表达式

scikit-learn - 校准分类器 ValueError : could not convert string to float

python - scikit learn TSNE 转换应用于词向量时返回奇怪的结果

python - 我可以在Python中设置Prometheus标签的默认值吗?

python - 元类的 __getattr__ 未被调用

python - TypeError : unorderable types: str() > float()

machine-learning - 朴素贝叶斯模型