提问者:小点点

如何将新数据传递给保存的多媒体分类器?


我已经能够制作一个MultinomialNB分类器,并将其保存到泡菜文件中供以后使用(这要归功于youtube视频:https://www.youtube.com/watch?v=0kPRaYSgblM

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文件,一个用于矢量器,另一个用于分类器。但是,最方便和推荐的解决方案是将矢量器和分类器组合成一个管道对象,然后可以对其进行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)