加载已保存的Tfidf-Vectorizer时出现特征数量不匹配ValueError
解决PassiveAgressive分类器加载后预测的特征数不匹配问题
这个问题我之前也碰到过,核心原因就是训练时的特征空间和预测时的特征空间不一致,咱们一步步拆解解决:
问题根源分析
报错里的两个数字很关键:训练时向量器拟合出1373084个特征,但处理新数据时生成了1375913个特征。这说明预测时的特征映射和分类器训练时用的完全不一样,大概率是以下两种情况:
- 处理新数据时,不小心对向量器调用了
fit_transform(重新拟合了词汇表),而不是用训练好的向量器直接transform - 保存/加载向量器的过程出错,比如保存的是未拟合的向量器实例,或者加载后没有正确复用训练好的特征映射
正确的保存与加载流程示例
用joblib(sklearn官方推荐的序列化工具)来保存拟合后的向量器和分类器,代码如下:
训练并保存模型
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.linear_model import PassiveAggressiveClassifier import joblib # 1. 拟合向量器(生成训练集的特征映射) vectorizer = TfidfVectorizer() X_train = vectorizer.fit_transform(your_train_texts) # 2. 训练分类器 classifier = PassiveAggressiveClassifier() classifier.fit(X_train, your_train_labels) # 3. 保存拟合后的向量器和训练好的分类器 joblib.dump(vectorizer, "tfidf_vectorizer_fitted.pkl") joblib.dump(classifier, "pa_classifier_trained.pkl")
加载并预测新数据
import joblib # 1. 加载保存好的向量器和分类器 vectorizer = joblib.load("tfidf_vectorizer_fitted.pkl") classifier = joblib.load("pa_classifier_trained.pkl") # 2. 处理新数据:必须用transform,绝对不能用fit_transform! X_new = vectorizer.transform(your_new_texts) # 3. 执行预测 predictions = classifier.predict(X_new)
关键注意事项
- 绝对禁止对新数据用fit_transform:
fit_transform会重新分析新数据的词汇,生成新的特征空间,和分类器训练时的特征数必然不匹配 - 确认保存的是拟合后的向量器:一定要保存
vectorizer(已经执行过fit或fit_transform的实例),而不是新建的TfidfVectorizer() - 保持sklearn版本一致:不同版本的sklearn对序列化的处理可能有差异,尽量保证训练和预测环境的sklearn版本相同
内容的提问来源于stack exchange,提问作者user5791200
相关产品推荐
相关产品推荐

