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

时间:2019-10-24 14:50:47

标签: python scikit-learn pickle tfidfvectorizer

我正在使用scikit Learn开发垃圾邮件分类器

这是我的矢量化代码

vectorizer = TfidfVectorizer(
    analyzer='word', 
    sublinear_tf=True,
    strip_accents='unicode',
    token_pattern=r'\w{1,}',
    ngram_range=(1, 1),
    max_features=10000)


tfidf = vectorizer.fit(data['text'])
features = vectorizer.transform(data['text'])

import pickle
pickle.dump(tfidf, open('tfidf.pickle', 'wb'))

这就是我要预测新输入的内容

import joblib

model = joblib.load('model')

vect = pickle.load(open('tfidf.pickle', 'rb'))

new = vect.transform(['some new text...'])

mod.predict(new)

当我打开矢量程序文件(tfidf.pickle)并尝试预测一条新消息时,它向我显示错误为

  

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

1 个答案:

答案 0 :(得分:1)

该错误消息表明,您的模型期望输入的大小为38011,而TF-IDF矢量化器输出的尺寸为7148的矢量。您在此处存在模型/预处理器不匹配的情况,即模型是针对38011尺寸的矢量进行训练的而TF-IDF会输出7148维的向量。

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

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)

然后,您可以使用pickle或joblib(例如pickle.dump(pipeline, open('spam_pipeline.pickle', 'wb')),然后pipeline = pickle.load(open('spam_pipeline.pickle', 'rb'))进行序列化和加载管道,类似于您已经在做的事情。

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

如果您需要更多详细信息,请告诉我。

相关问题