You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加载已保存的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:11:44