提问者:小点点

再次加载时存储的Tfidf矢量器值错误


我训练了一个Tfidf矢量器,用于被动-主动分类器,并对其进行了测试,一切正常。然后,我保存了合适的矢量器和经过训练的分类器,以供以后使用。当我再次加载矢量器时,我在其上转换了一个新的数据集(因为我想用分类器对看不见的数据进行分类),并尝试预测新的数据集。当我运行代码时,我得到:

ValueError: X has 1375913 features per sample; expecting 1373084

这是我用来获取矢量和分类器的代码:

X_train, X_test, y_train, y_test = train_test_split(df['Processed_text'], y, test_size=0.2)
tfidf_vectorizer = TfidfVectorizer()
tfidf_train = tfidf_vectorizer.fit_transform(X_train)
with open('vectorizer.pkl', 'wb') as fin:
    pickle.dump(tfidf_vectorizer, fin)
tfidf_test = tfidf_vectorizer.transform(X_test)
linear_clf = PassiveAggressiveClassifier(n_iter=50)
linear_clf.fit(tfidf_train, y_train)
pred = linear_clf.predict(tfidf_test)
with open('topic_classifier.pkl', 'wb') as fid:
    pickle.dump(linear_clf, fid)  

这就是我再次打开并使用它的方式:

classifier = pickle.load(open('topic_classifier.pkl', 'rb'))
vectorizer = pickle.load(open('vectorizer.pkl', 'rb'))
tfidf_vectorizer = vectorizer
tfidf_articles = tfidf_vectorizer.transform(texts)
topics = classifier.predict(tfidf_articles)

我还再次检查了培训分类器的文件,查看了词汇表的长度,得到了

len(tfidf_vectorizer.vocabulary_)
1371569

所以另一个数字...我真的不知道这里出了什么问题。我以完全相同的方式处理训练/测试数据集的文本和加载所有内容后需要分类的文本,所以我不认为这与我给矢量化器的输入有关。我不能再次安装矢量化器或再次训练分类器,因为我在应用程序中使用两者-所以它需要以某种方式与保存的版本一起工作。


共1个答案

匿名用户

在一次又一次地检查所有内容之后,发现使用pickle保存向量器和分类器时存在一些问题。倾倒当我使用joblib时。卸载/装载这两个,它就像一个魅力!显然,在这里使用pickle进行数据持久化不是一个好主意!