保存并使用 TFIDF 矢量化器以供将来的示例使用,然后导致尺寸错误

Posted

技术标签:

【中文标题】保存并使用 TFIDF 矢量化器以供将来的示例使用,然后导致尺寸错误【英文标题】:Saving and using TFIDF vectorizer for future examples, then leading to error with dimension 【发布时间】:2014-07-16 22:26:39 【问题描述】:

所以我正在训练来自 Skilearn 的多项朴素贝叶斯分类器。实际上,我现在可以使用 from sklearn.externals import joblib 保存该分类器。

我现在想编写一个脚本来对新示例进行分类。我唯一的问题是获取新数据,作为字符串并将它们传递到 classifier.predict( ... ) 要求数据采用矢量化形式。

在我创建矢量化器之前,通过以下方式:

vectorizer = TfidfVectorizer(min_df=2, ngram_range=(1, 2),  stop_words='english', strip_accents='unicode', norm='l2',decode_error="ignore")

现在 TFIDF 进行矢量化的方式是需要许多文档。但是通过创建一个新的矢量化器,我不能只传递一个数据结构然后对其进行分类。我显然需要保存这个矢量化器。

这真的涉及到如何将数据转换为我训练分类器时使用的相同形式!?

我是否正确使用了转换 vectorizer.transform(X_test_title)

编辑:

似乎我在上面的最后一条评论中是对的。但是,当现在将分类器和矢量化器加载到我的脚本中时,我似乎在将矢量化数据传递给分类器时遇到了问题。这是我的函数,它带有一个标题和文档,它们都是干净的字符串:

def predict_function(title_data, document_data):
    data =  ((title + ' ') * number_repeat_title(title_data, document_data)) + document_data
    # requires a list
    data = [data, 'testing another element works']
    print data
    data_vector = vectorizer.transform(data)
    print data_vector # checking data is good!
    predicted = classifier.predict(data_vector) 
    return predicted

调用该函数的示例如下:

predict_function('mr sponge bob square pants', 'SpongeBob SquarePants is an American animated television series created by marine biologist and animator Stephen Hillenburg for Nickelodeon. The series chronicles the adventures and endeavors of the title character and his various friends in the fictional underwater city of Bikini Bottom. The series' popularity has made it a media franchise, as well as Nickelodeon network's highest rated show, and the most distributed property of MTV Networks. The media franchise has generated $8 billion in merchandising revenue for Nickelodeon.')

我得到一个错误,我预测:

predicted = classifier.predict(data_vector) 

给予....

/Library/Python/2.7/site-packages/scikit_learn-0.15_git-py2.7-macosx-10.9-intel.egg/sklearn/naive_bayes.pyc in predict(self, X)
     61             Predicted target values for X
     62         """
---> 63         jll = self._joint_log_likelihood(X)
     64         return self.classes_[np.argmax(jll, axis=1)]
     65 

/Library/Python/2.7/site-packages/scikit_learn-0.15_git-py2.7-macosx-10.9-intel.egg/sklearn/naive_bayes.pyc in _joint_log_likelihood(self, X)
    455         """Calculate the posterior log probability of the samples X"""
    456         X = atleast2d_or_csr(X)
--> 457         return (safe_sparse_dot(X, self.feature_log_prob_.T)
    458                 + self.class_log_prior_)
    459 

/Library/Python/2.7/site-packages/scikit_learn-0.15_git-py2.7-macosx-10.9-intel.egg/sklearn/utils/extmath.pyc in safe_sparse_dot(a, b, dense_output)
    189     from scipy import sparse
    190     if sparse.issparse(a) or sparse.issparse(b):
--> 191         ret = a * b
    192         if dense_output and hasattr(ret, "toarray"):
    193             ret = ret.toarray()

/Library/Python/2.7/site-packages/scipy-0.14.0.dev_572aaf0-py2.7-macosx-10.9-intel.egg/scipy/sparse/base.pyc in __mul__(self, other)
    337 
    338             if other.shape[0] != self.shape[1]:
--> 339                 raise ValueError('dimension mismatch')
    340 
    341             result = self._mul_multivector(np.asarray(other))

ValueError: dimension mismatch

【问题讨论】:

能否请您发布其余的代码? cleanTitle 和 cleanDocument 没有定义,我不知道你的数据是什么样的。至少发布一个样本。如果没有所有方法/输入样本,很难进行故障排除。 矢量化器的 fitfit_transform 学习其输入数据的词汇,以确定问题中的特征数量。 transform 在测试时只选择这些功能。 @flyingmeatball 我在建议信息中添加了。我删除了这些函数,因为它们实际上只是在清理传入的字符串! @larsmans 是的,我同意,但您也可以将矢量化器保存在内存中并在以后使用,通过使用转换,就像我所做的那样! 这和我说的有什么矛盾? 【参考方案1】:

查看此处的 scikit-learn 文档 (http://scikit-learn.org/stable/auto_examples/document_classification_20newsgroups.html) 我相信你是对的。

scikit-learn 示例中的训练数据向量化如下:

vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5,
                             stop_words='english')
X_train = vectorizer.fit_transform(data_train.data)

这意味着矢量化器现在将记住 TFxIDF 权重。

然后使用以下代码行将这些权重应用于测试数据:

X_test = vectorizer.transform(data_test.data)

【讨论】:

谢谢!我刚刚做了这个,现在数据被矢量化了,但是分类器有问题!将编辑帖子!

以上是关于保存并使用 TFIDF 矢量化器以供将来的示例使用,然后导致尺寸错误的主要内容,如果未能解决你的问题,请参考以下文章

存储 TfidfVectorizer 以供将来使用

保存 ML 模型以供将来使用

保存 ML 模型以供将来使用

如何存储用户的信息以供MySQL将来使用

保存/导出输出列表以供将来在 R 中直接使用?

再次加载时存储的 Tfidf-Vectorizer ValueError