ValueError in while predict where Test data is have different shape of word vector [重复]
Posted
技术标签:
【中文标题】ValueError in while predict where Test data is have different shape of word vector [重复]【英文标题】:ValueError in while predict where Test data is having different shape of word vector [duplicate] 【发布时间】:2020-10-29 21:23:38 【问题描述】:下面是我正在为文本分类模型尝试的代码;
from sklearn.feature_extraction.text import TfidfVectorizer
ifidf_vectorizer = TfidfVectorizer()
X_train_tfidf = ifidf_vectorizer.fit_transform(X_train)
X_train_tfidf.shape
(3, 16)
from sklearn.svm import LinearSVC
clf = LinearSVC()
clf.fit(X_train_tfidf,y_train)
到目前为止,只有训练集被向量化为完整的词汇表。为了对测试集进行分析,我需要将其提交给相同的程序。 所以我做到了
X_test_tfidf = ifidf_vectorizer.fit_transform(X_test)
X_test_tfidf.shape
(2, 12)
最后在尝试预测其显示错误时;
predictions = clf.predict(X_test_tfidf)
ValueError: X has 12 features per sample; expecting 16
但是当我使用管道from sklearn.pipeline import Pipeline
时,它工作正常;
我不能按照我尝试的方式编码吗?
【问题讨论】:
【参考方案1】:错误在于fit_transform
的测试数据。你fit_transform
训练数据和只有transform
测试数据:
# change this
X_test_tfidf = ifidf_vectorizer.fit_transform(X_test)
X_test_tfidf.shape
(2, 12)
# to
X_test_tfidf = ifidf_vectorizer.transform(X_test)
X_test_tfidf.shape
原因:
当你做fit_transform
时,你用fit
教你的模型向量。该模型学习用于转换数据的向量。您使用训练数据来学习向量,然后使用transform
将它们应用于训练和测试
如果您对测试数据执行fit_transform
,则您替换了在训练数据中学习的向量并将它们替换为测试数据。鉴于您的测试数据小于您的训练数据,您可能会得到两种不同的向量化。
更好的方法 最好的方法是使用 管道,这将使您的流程易于理解
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
clf = Pipeline(steps=[
('vectorizer', TfidfVectorizer()),
('model', LinearSVC()),
])
# train
clf.fit(X_train,y_train)
# predict
clf.predict(X_test)
这更容易,因为转换正在照顾您。拟合模型时无需担心fit_transform
,预测或评分时无需担心transform
。
如果你使用 with,你可以独立访问这些功能
clf.named_steps('vectorizer') # or 'model'
在后台,当您执行clf.fit
时,您的数据将使用fit_transform
传递给您的矢量化器,然后传递给model
。当您进行预测或评分时,您的数据将通过 transform
传递给您的矢量化器,然后再到达您的模型。
【讨论】:
谢谢 Prayson W. Daniel。我理解这个问题。我尝试了两种方式; x_test 和 sklean 管道的单独转换。然而,这引发了质疑;模型仅使用单词向量或训练数据的词汇,测试数据中不属于词汇一部分的任何单词都会被遗漏,不是吗? 是的。您的初始模型是在测试数据标记上训练的。当您 fit_transform 测试数据时,将训练数据替换为测试数据。除非您非常幸运,因为训练和测试数据集包含相似的标记,否则您很可能会得到错误的形状矢量化器;)我们通常不使用测试数据来训练模型,而是评估模型如何在看不见的数据中执行。最后,您可以在所有数据上结合训练模型。【参考方案2】:您的代码失败,因为您再次在测试集X_test
上使用.fit_transform()
重新安装矢量化器。但是,您应该只使用矢量化器转换数据:
X_test_tfidf = ifidf_vectorizer.transform(X_test)
现在它应该可以按预期工作了。您只根据X_train
拟合ifidf_vectorizer
并根据此转换所有数据。它确保使用相同的词汇表并获得相同形状的输出。
【讨论】:
以上是关于ValueError in while predict where Test data is have different shape of word vector [重复]的主要内容,如果未能解决你的问题,请参考以下文章
ValueError:在进行加权预测时,操作数无法与形状 (7,) (624,3) 一起广播
ValueError: ('Unrecognized keyword arguments:', dict_keys(['ragged'])) while loading keras model
tf.while_loop - ValueError:这两个结构的元素数量不同
使用 pip 降级包会产生 ValueError('Expected Version spec in',
ValueError: feature_names mismatch: in xgboost in the predict() function
ValueError: (‘Unexpected parameters in params‘, dict_keys([‘cv‘]))