作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经能够制作一个 MultinomialNB 分类器并将其保存到 pickle 文件中以备后用(感谢 youtube 视频:https://www.youtube.com/watch?v=0kPRaYSgblM&t=927s 以及更多)。下面是我的代码:
import sklearn.datasets as skd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
import pickle
categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med']
train_data = skd.load_files('E:/Python/Datasets/train', categories=categories, encoding='ISO-8859-1')
test_data = skd.load_files('E:/Python/Datasets/test', categories=categories, encoding='ISO-8859-1')
tf_vect = TfidfVectorizer()
tfidf_train = tf_vect.fit_transform(train_data.data)
clf = MultinomialNB().fit(tfidf_train, train_data.target)
with open('classifier', 'wb') as picklefile:
pickle.dump(clf, picklefile)
现在,在一个单独的代码文件中,我可以将其读回新变量“new_clf”,以将此分类器与新文本数据一起使用:
import pickle
with open('E:\Python\Text Classification\classifier', 'rb') as tm:
new_clf = pickle.load(tm)
现在,如果我直接运行之前的文件/代码并从中获取 tf_vect 变量,其中已经包含我的训练数据,我可以简单地转换其上的新文本集并将其传递给 new_clf 分类器以获得预测。
但在我的例子中,一旦模型被训练好,我想将它发送给另一个用户,该用户将有一个单独的代码文件,该文件必须读取分类器,然后将新文本传递给它进行预测。
我在这里遇到的问题是在下面的代码中(以 ValueError 结尾:维度不匹配):-
new_text = ['God is Love', 'OpenGL is fast on GPU']
new_clf.predict(new_text)
我知道我不是根据训练数据的特征来转换 new_text。但我无法弄清楚如何解决它。
我应该创建另一个包含 tf_vect 的 pickle 文件并与用户共享吗?或者它已经与分类器文件本身一起使用,而我错过了从分类器获取它的过程?
最佳答案
您确实可以保存两个 pickle 文件,一个用于矢量化器,一个用于分类器。但是,最方便和推荐的解决方案是将矢量化器和分类器组合到一个 Pipeline
对象中,然后您可以对其进行 pickle。
from sklearn.pipeline import Pipeline
tf_vect = TfidfVectorizer()
clf = MultinomialNB()
pipe = Pipeline([("vectorizer", tf_vect), ("classifier", clf)])
pipe.fit(train_data.data, train_data.target)
with open('classifier', 'wb') as picklefile:
pickle.dump(pipe, picklefile)
然后加载该 pickle 文件后,您可以像这样将其用于新文本:
with open('/.../classifier', 'rb') as tm:
new_pipe = pickle.load(tm)
new_pipe.predict(new_text)
关于python - 我如何将新数据传递给保存的 multinomialnb 分类器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66718758/
我是一名优秀的程序员,十分优秀!