Как сохранить векторизатор TFIDF в Scikit Learn? - PullRequest
0 голосов
/ 24 октября 2019

Я разрабатываю классификатор спама с использованием 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 Ответ

1 голос
/ 24 октября 2019

В сообщении об ошибке говорится, что ваша модель ожидает вход с размером 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 конвейера, чтобы получить прогноз.

Дайте мне знать, если вам нужно больше деталей.

...