我使用python创建了一个文本分类模型。我有CountVectorizer,它的结果是2034行和4063列(唯一的单词)的文档术语矩阵。我保存了用于新的测试数据的模型。我的新测试数据
test_data = ['Love', 'python', 'every','time']
但问题是我将上述测试数据令牌转换为特征向量,但它的形状不同。因为模型期望一个4063向量。我知道如何通过使用CountVectorizer词汇表来解决这个问题,并在测试数据中搜索每个令牌并将其放入该索引中。但是在scikit-learn中有没有简单的方法来处理这个问题呢?
你不应该在测试数据上拟合一个新的CountVectorizer,你应该使用你在训练数据上拟合的CountVectorizer,并在其上调用transfrom(test_data)
您有两种方法来解决这个
1。您可以使用与您用于火车功能相同的CountVectorizer,如
cv = CountVectorizer(parameters desired)
X_train = cv.fit_transform(train_data)
X_test = cv.transform(test_data)
2。你也可以创建另一个CountVectorizer,如果你真的想(但不建议,因为你会浪费空间,你仍然想要使用相同的参数CV),并使用相同的功能。
cv_train = CountVectorizer(parameters desired)
X_train = cv_train.fit_transform(train_data)
cv_test = CountVectorizer(vocabulary=cv_train.get_feature_names(),desired params)
X_test = cv_test.fit_transform(test_data)
尝试使用:
test_features = inverse_transform(test_data)
我将.toarray()添加到整个命令中,以便将结果视为矩阵。所以你应该这样写:X_test_analyst = Pipeline.named_steps['count_vectorizer'].transform(X_test).toarray()
我讨论这个太迟了,但我只是想给搜索引擎的人留下一些东西。
对不起,我的英语不好。
;)
正如@Andreas Mueller所提到的,你不应该用你的新数据(集)创建一个新的CountVectorizer,你可以想象count vectorizer所做的是制作一个2d数组(或认为是一个excel表),每列是一个唯一的单词,每一行代表一个文档(或句子),值(i,j)意味着在第i个句子中,第j个单词的频率。
如果使用新数据创建新的CountVectorizer,惟一的单词可能(如果不是必须)是不同的。当你制作模型时。预测使用这些数据,它将报告某种错误,告诉你dim不正确。
我在代码中所做的如下:
如果你在不同的.py/.ipynb文件中训练你的模型,你可以使用import pickle
和dump
函数作为你的拟合计数矢量器。你可以在这篇文章中了解细节。
如果你用相同的。py/。你可以直接按照@Andreas Mueller所说的去做。
import pickle
pk.dump(vectorizer,open(r'/relative path','wb'))
pk.dump(pca,open(r'/relative path','wb'))
# ...
# When you want to use:
import pickle
vectoriser = pk.load(open(r'/relative path','rb'))
pea = pk.load(open(r'/relative path','rb'))
#...
注:如果我没记错的话,您还可以使用pickle导出类或其他东西,但是当您这样做时,请确保在加载对象时已经定义了类。不确定这在这种情况下是否重要,但在我执行pk.load函数之前,我仍然导入PCA和CountVectorizer。我只是一个初学者在编码,所以请测试我的代码之前使用它在您的项目。