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
相关产品推荐
相关产品推荐

