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

2024-10-03 19:21:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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时,它工作得很好

我不能用我尝试过的方式编码吗


Tags: 代码fromtestimporttransformtrainsklearnfit
2条回答

错误与测试数据的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

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


clf.named_steps('vectorizer') # or 'model'

在引擎盖下,当您执行clf.fit操作时,您的数据将使用fit_transform传递到向量器,然后传递到model。当您预测或评分时,您的数据将在到达您的模型之前通过transform抛出向量器

在测试集X_test上再次使用.fit_transform()重新安装矢量器时,代码失败。但是,应仅使用矢量器变换数据:

X_test_tfidf = ifidf_vectorizer.transform(X_test) 

现在,它应该像预期的那样工作。您只需要根据X_train来拟合ifidf_vectorizer,并根据此来转换所有数据。它确保使用相同的词汇表,并确保获得相同形状的输出

相关问题 更多 >