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

CountVectorizer未拟合词汇表报错:新数据转换预测失败求助

解决CountVectorizer的NotFittedError问题

我一眼就看出问题出在哪了——你肯定是在处理新数据的时候,要么用了一个全新的CountVectorizer实例,要么没把训练时拟合好的向量器和模型一起保存加载!

错误原因拆解

你用训练集拆分的测试集能正常预测,是因为当时你用的是**同一个已经在训练数据上拟合过的CountVectorizer**来处理训练和测试数据的(训练时用fit_transform(),测试时用transform())。但处理新数据时,你大概率是重新创建了一个CountVectorizer,或者只加载了模型,没加载那个已经拟合好的向量器——这个新的向量器根本没有训练数据的词汇表,自然会报"Vocabulary wasn't fitted"。

正确的解决方案

第一步:训练时同时保存向量器和模型

训练阶段,你需要把拟合好的CountVectorizer和分类模型一起用joblib保存,而不是只存模型:

from sklearn.externals import joblib
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB  # 替换成你实际使用的分类模型
import pandas as pd

# 读取训练数据
traindf = pd.read_csv('train_data.csv')

# 初始化并拟合向量器
vectorizer = CountVectorizer()
X_train = vectorizer.fit_transform(traindf['text_column'])  # fit_transform同时完成拟合和转换
y_train = traindf['label_column']

# 训练模型
model = MultinomialNB()
model.fit(X_train, y_train)

# 保存向量器和模型到文件
joblib.dump(vectorizer, 'trained_vectorizer.pkl')
joblib.dump(model, 'trained_classifier.pkl')

第二步:预测新数据时加载向量器和模型

处理新数据时,必须加载之前保存的拟合好的向量器,用它来转换新数据(注意用transform()而不是fit_transform()!):

from sklearn.externals import joblib
import pandas as pd

# 读取新数据
testdf = pd.read_csv('new_data.csv')

# 加载保存的向量器和模型
vectorizer = joblib.load('trained_vectorizer.pkl')
model = joblib.load('trained_classifier.pkl')

# 转换新数据(这里用transform,不能用fit_transform!)
X_new = vectorizer.transform(testdf['text_column'])

# 进行预测
predictions = model.predict(X_new)

避坑提醒

  • 绝对不要在预测新数据时重新创建CountVectorizer()实例,哪怕参数和训练时一样也不行——因为它没有训练数据的词汇表。
  • 一定要保证训练和预测用的是同一个拟合过的向量器,通过保存和加载是最稳妥的方式。

内容的提问来源于stack exchange,提问作者Ken Hsieh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:46:08