再次加载时存储的 Tfidf-Vectorizer ValueError

Posted

技术标签:

【中文标题】再次加载时存储的 Tfidf-Vectorizer ValueError【英文标题】:Stored Tfidf-Vectorizer ValueError when loaded again 【发布时间】:2018-08-29 20:12:12 【问题描述】:

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

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.dump 保存矢量化器和分类器存在一些问题。当我同时使用 joblib.dump/load 时,它就像一个魅力!显然在这里使用 pickle 进行数据持久性不是一个好主意!

【讨论】:

以上是关于再次加载时存储的 Tfidf-Vectorizer ValueError的主要内容,如果未能解决你的问题,请参考以下文章

如何加载列表,向其中添加元素然后再次存储?

如何简单地将关卡数据存储为数组并再次加载?

HTML5 本地存储 - 存储和加载已下载一次的 CSS

在触发单击 Extjs 3.4 时重新加载 ComboBox 存储

将许多 PropertyList 放入 Google App Engine 数据存储区(在 Go 中)并使用 Query.GetAll 再次加载它们

目标C - 再次点击标签栏项目时,如何再次重新加载网页视图?