我构建了以下分类模型:
def buildData(x):
count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(x)
tf_transformer = TfidfTransformer().fit(X_train_counts)
X_train_tf = tf_transformer.transform(X_train_counts)
return X_train_tf
x, y = parseXml('data/training.xml')
xDev, yDev = parseXml('data/dev.xml')
x = buildData(x)
clf = MultinomialNB().fit(x, y)
predicted = clf.predict(x)
print( 'Accuracy: ', accuracy_score(y, predicted))
我使用训练数据拟合模型" x"我也在" x"上测试它..
问题是,如果我想在xDev上预测它(predict = clf.predict(xDev)),则显示错误。
并且我认为这是因为没有准备好数据(采用Tf_idf矩阵形状),所以我将xDev数据传递给了同一个函数:
xDev = buildData(xDev)
准备它,但不幸的是,出现了这个错误:
Traceback (most recent call last): File "C:/Users/BG/Desktop/P2/E2.py", line 43, in <module>
predicted = clf.predict(xDev) File "C:\Python35\lib\site-packages\sklearn\naive_bayes.py", line 66, in predict
jll = self._joint_log_likelihood(X) File "C:\Python35\lib\site-packages\sklearn\naive_bayes.py", line 725, in
_joint_log_likelihood
return (safe_sparse_dot(X, self.feature_log_prob_.T) + File "C:\Python35\lib\site-packages\sklearn\utils\extmath.py", line 135, in safe_sparse_dot
ret = a * b File "C:\Python35\lib\site-packages\scipy\sparse\base.py", line 476, in
__mul__
raise ValueError('dimension mismatch') ValueError: dimension mismatch
答案 0 :(得分:1)
您需要在第一次(训练)呼叫中保存并保留tf_transformer。 tf_transformer取决于您提供的数据的词汇表。在您的情况下,语料库词汇表(即组合文档中所有唯一单词的集合)在x和xDev之间可能不同。这在文本分类用例中很常见。例如,训练x可能有1000个单词,xDev可能有800个单词(不同或相似)。
如果你在第一次调用buildData()时保持tf_transformer并使用相同的tf_transformer转换xDev数据而不是在buildData()中再次重新创建另一个,则错误将消失。
换句话说,tf_transformer应该创建一次,适合训练数据并重复使用。不应每次为测试或生产数据重新创建它,就像您在测试数据上再次调用buildData时所做的那样。这里是a blog关于创建NLP /分类管道的另一种方法,该管道重用一次创建的变换器。
TL; DR - 在应用程序工作流程中将变量设置为低于一次,而不是多次
tf_transformer = TfidfTransformer().fit(X_train_counts)