Python 如何在scikit学习中保存TFIDF矢量器?

Python 如何在scikit学习中保存TFIDF矢量器?,python,scikit-learn,pickle,tfidfvectorizer,Python,Scikit Learn,Pickle,Tfidfvectorizer,我正在使用scikit learn开发一个垃圾邮件分类器 这是我的矢量化代码 vectorizer=TfidfVectorizer( “单词”, 次线性_tf=真, strip_accents='unicode', 令牌\u模式=r'\w{1,}', ngram_范围=(1,1), 最大(功能=10000) tfidf=vectorizer.fit(数据['text']) features=vectorizer.transform(数据['text']) 进口泡菜 pickle.dump(tfi

我正在使用scikit learn开发一个垃圾邮件分类器

这是我的矢量化代码

vectorizer=TfidfVectorizer(
“单词”,
次线性_tf=真,
strip_accents='unicode',
令牌\u模式=r'\w{1,}',
ngram_范围=(1,1),
最大(功能=10000)
tfidf=vectorizer.fit(数据['text'])
features=vectorizer.transform(数据['text'])
进口泡菜
pickle.dump(tfidf,open('tfidf.pickle','wb'))
下面是我预测新输入的步骤

导入作业库
model=joblib.load('model')
vect=pickle.load(打开('tfidf.pickle','rb'))
new=vect.transform(['somenewtext…'))
修正预测(新)
当我打开矢量器文件(tfidf.pickle)并尝试预测一条新消息时,它会将错误显示为

ValueError:X.shape[1]=7148应等于38011,即训练时的特征数


错误消息表示您的模型需要大小为38011的输入,而您的TF-IDF矢量器输出尺寸为7148的向量。您的模型/预处理器不匹配,即您的模型是在38011维的向量上训练的,而TF-IDF输出的向量是7148维的

避免这种预处理/模型不匹配的一个好方法是使用。例如,在这里,您可以使用以下代码对模型和TF-IDF矢量器进行训练(例如逻辑回归):

然后您可以使用pickle或joblib序列化并加载管道(例如,
pickle.dump(管道,打开('spam\u pipeline.pickle','wb'))
,然后
pipeline=pickle.load(打开('spam\u pipeline.pickle','rb'))
,类似于您已经在做的事情

您可以直接使用管道的
predict
方法来获得预测

如果你需要更多的细节,请告诉我

from sklearn.preprocessing import make_pipeline

vectorizer = TfidfVectorizer(...your TF-IDF arguments...)
model = LogisticRegression(...your model arguments...)
pipeline = make_pipeline(vectorizer, model)

pipeline.fit(X, y)