我如何将新数据传递给保存的多项式分类器?

Posted

技术标签:

【中文标题】我如何将新数据传递给保存的多项式分类器?【英文标题】:how i pass new data to a saved multinomialnb classifier? 【发布时间】:2021-06-17 11:41:14 【问题描述】:

我已经能够制作一个 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 文件并与用户共享吗?或者它已经与分类器文件本身一起使用,我错过了从分类器获取它的过程?

【问题讨论】:

【参考方案1】:

您确实可以保存两个 pickle 文件,一个用于矢量化程序,一个用于分类器。但是,最方便和推荐的解决方案是将矢量化器和分类器组合成一个 Pipeline 对象,然后您可以腌制它。

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)

【讨论】:

以上是关于我如何将新数据传递给保存的多项式分类器?的主要内容,如果未能解决你的问题,请参考以下文章

使用保存的 sklearn 模型进行预测

如何将解析器中的数据传递给函数

如何将保存的 localStorage Web 数据传递给 php 脚本?

如何通过数组将数据传递给表格视图?

Primeng - 对话服务将数据传递给对话组件

Android:如何将数据传递给子活动?