我正在使用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,即训练时的特征数量
答案 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
方法来获取预测。
如果您需要更多详细信息,请告诉我。