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

加载训练好的情感分类器预测时出现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:09:34