Python while中的ValueError预测测试数据具有不同字向量形状的位置

Python while中的ValueError预测测试数据具有不同字向量形状的位置,python,machine-learning,scikit-learn,text-classification,Python,Machine Learning,Scikit Learn,Text Classification,下面是我的代码,我正在尝试文本分类模型 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 = Linear

下面是我的代码,我正在尝试文本分类模型

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)
到目前为止,只有一个训练集被矢量化为完整的词汇表。为了对测试集进行分析,我需要将其提交到相同的程序中。 所以我做了

最后,当试图预测其显示错误时

predictions = clf.predict(X_test_tfidf)

ValueError: X has 12 features per sample; expecting 16
但是当我使用sklearn.pipeline import pipeline中的pipeline
时,它工作得很好


我不能按我尝试的方式编码吗?

当您再次在测试集
X\u test
上使用
.fit\u transform()
重新安装矢量器时,您的代码失败。但是,应仅使用矢量器变换数据:

X_test_tfidf = ifidf_vectorizer.transform(X_test) 


现在,它应该像预期的那样工作。您只需根据
X\u列
安装
ifidf\u矢量器
,并根据此设置转换所有数据。它确保使用相同的词汇表,并且您得到相同形状的输出。

错误在于测试数据的
fit\u变换。您可以
fit_transform
训练数据,并且仅
transform
测试数据:

#更改此选项
X_测试\u tfidf=ifidf\u矢量器.拟合变换(X_测试)
X_测试_tfidf.shape
(2, 12)
#到
X_测试\u tfidf=ifidf\u矢量器.transform(X_测试)
X_测试_tfidf.shape
原因: 当您进行
fit\u变换时
,您可以使用
fit
来教授模型向量。模型学习用于转换数据的向量。使用训练数据学习向量,然后使用
transform

如果对测试数据执行
fit_变换
,则将在训练数据中学习的向量替换为测试数据。鉴于您的测试数据小于列车数据,您可能会得到两种不同的矢量化

更好的方法 最好的方法是使用管道,这将使您的流程易于理解

从sklearn.feature\u extraction.text导入TfidfVectorizer
从sklearn.svm导入LinearSVC
从sklearn.pipeline导入管道
clf=管道(步骤=[
('vectorizer',TfidfVectorizer()),
('model',LinearSVC()),
])
#训练
clf.fit(X_系列、y_系列)
#预测
clf.预测(X_检验)
这很容易,因为转换正在照顾您。在拟合模型或预测或评分时,您不必担心
fit\u transform

如果使用,则可以独立访问这些功能


clf.命名步骤(“矢量器”)或“模型”

在引擎盖下,当您执行
clf.fit
时,您的数据将通过使用
fit\u transform
的矢量器传递,然后传递到
模型
。当您预测或评分时,您的数据将在到达您的模型之前通过
转换

谢谢Prayson W.Daniel。我理解这个问题。我试了两种方法;一个单独的x_测试转换和一个sklean管道。然而,这导致了一个问题;该模型仅使用列车数据的单词vector或Vocab,测试数据中不属于Vocab的任何单词都将丢失,不是吗?是的。您的初始模型接受了测试数据标记的培训。当您将列车数据替换为测试数据时,请调整并转换测试数据。除非您非常幸运地发现train和test数据集包含类似的标记,否则您很可能最终得到一个错误的形状矢量器;)我们通常不使用测试数据来训练模型,而是评估模型在不可见数据中的表现。最后,您可以在所有数据上组合列车模型。
X_test_tfidf = ifidf_vectorizer.transform(X_test)