加载训练好的情感分类器预测时出现NotFittedError:TF-IDF向量器未拟合
问题原因
你训练模型时,依赖的是经过训练数据拟合的TF-IDF向量器来生成文本特征,但预测时重新初始化了一个全新的TfidfVectorizer对象——这个对象从未接触过训练数据(没调用过fit/fit_transform),自然无法完成特征转换,因此抛出NotFittedError。
解决方法
以下两种方案都能彻底解决问题,推荐第二种更简洁的流水线方案:
方案一:同时保存训练好的TF-IDF向量器和模型
训练阶段修改:
把拟合后的向量器和模型一起打包保存:
# 训练时的代码示例 from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import SVC import pickle # 初始化并拟合TF-IDF向量器 tfidf_vectorizer = TfidfVectorizer(max_features=5000,ngram_range=(2,2)) X_train_tfidf = tfidf_vectorizer.fit_transform(train_texts) # 训练SVM模型 model = SVC(probability=True) # 需要predict_proba的话必须设probability=True model.fit(X_train_tfidf, train_labels) # 打包保存向量器和模型 with open('./models/model_and_vectorizer.pickle', 'wb') as f: pickle.dump({'vectorizer': tfidf_vectorizer, 'model': model}, f)
预测阶段修改:
加载保存好的向量器和模型,替换掉你新建的空向量器:
import pickle # 加载打包好的文件 loaded_data = pickle.load(open('./models/model_and_vectorizer.pickle','rb')) tfidf_vectorizer = loaded_data['vectorizer'] HotelModel = loaded_data['model'] test_str = input('') prediction(test_str,HotelModel)
你的prediction函数无需修改,现在使用的是训练时拟合好的向量器。
方案二:用Pipeline打包向量器和模型(推荐)
用sklearn.pipeline.Pipeline把TF-IDF转换和SVM模型整合成一个流水线,保存/加载时只需操作一个对象,避免分开保存的同步问题:
训练阶段修改:
from sklearn.pipeline import Pipeline from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.svm import SVC import pickle # 构建完整流水线 pipeline = Pipeline([ ('tfidf', TfidfVectorizer(max_features=5000,ngram_range=(2,2))), ('svm', SVC(probability=True)) # 启用概率预测 ]) # 用流水线直接训练(自动完成TF-IDF拟合和模型训练) pipeline.fit(train_texts, train_labels) # 保存整个流水线 with open('./models/TripAdvisorHotels_SVM_Pipeline.pickle', 'wb') as f: pickle.dump(pipeline, f)
预测阶段修改:
加载流水线后直接调用预测,无需单独处理向量转换:
import pickle # 加载流水线 pipeline = pickle.load(open('./models/TripAdvisorHotels_SVM_Pipeline.pickle','rb')) test_str = input('') # 直接用流水线完成所有步骤 result = pipeline.predict([test_str]) print("Expected rating:",int(result)) print("\nThe confidence of the prediction is:",pipeline.predict_proba([test_str])[0][int(result)-1])
这种方式连prediction函数都可以省略,代码更简洁且不易出错。
注意事项
- 确保训练和预测时的文本预处理函数(
clean_string、tokenize)完全一致,否则即使向量器拟合正确,特征也会不匹配导致预测结果异常。 - 如果使用方案一,必须保证预测时向量器的参数(如
max_features、ngram_range)和训练时完全相同。
内容的提问来源于stack exchange,提问作者JK Jin
相关产品推荐
相关产品推荐

