训练和开发数据,ValueError:维度不匹配

时间:2018-03-16 19:31:52

标签: python scikit-learn

我构建了以下分类模型:

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

1 个答案:

答案 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)
相关问题