Прогнозирование ошибок: X имеет n признаков на образец, ожидая m

Я получил следующий код, где я преобразую текст в tf:

...
x_train, x_test, y_train, y_test = model_selection.train_test_split(dataset['documents'],dataset['classes'],test_size=test_percentil)
#Term document matrix
count_vect = CountVectorizer(ngram_range=(1, Ngram), min_df=1, max_features=MaxVocabulary)
x_train_counts = count_vect.fit_transform(x_train)
x_test_counts=count_vect.transform(x_test)
#Term Inverse-Frequency
tf_transformer = TfidfTransformer(use_idf=True).fit(x_train_counts)
lista=tf_transformer.get_params()
x_train_tf = tf_transformer.transform(x_train_counts)
x_test_tf=tf_transformer.transform(x_test_counts)
...

Затем я тренирую модель и сохраняю ее с помощью маринования. Проблема возникает, когда в другой программе я пытаюсь предсказать новые данные. В принципе, я получил:

count_vect = CountVectorizer(ngram_range=(1, 1), min_df=1, max_features=None)
x_counts = count_vect.fit_transform(dataset['documents'])

#Term Inverse-Frequency
tf_transformer = TfidfTransformer(use_idf=True).fit(x_counts)
x_tf = tf_transformer.transform(x_train_counts)

model.predict(x_tf)

Когда я выполняю этот код, вывод

ValueError: X имеет 8933 функции на выборку; ожидая 7488

Я знаю, что это проблема с представлением TfIdf, и я слышал, что мне нужно использовать тот же tf_transformer и vectorizer, чтобы получить ожидаемую форму ввода, но я не знаю, как этого добиться. Я могу хранить другие трансформаторы и векторизаторы, но я попытался использовать разные комбинации, и я ничего не получил.

python,python-3.x,scikit-learn,tf-idf,

0

Ответов: 2


1 принят
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.externals import joblib
a = pd.Series(["hello, this is me", "hello this is me too"])
b = pd.Series(["hello, this is John", "hi it's Doe"])
tfidf = TfidfVectorizer().fit(a)
joblib.dump(tfidf, 'path_to/tfidf.pkl')
tfidf = joblib.load('path_to/tfidf.pkl')
tfidf.transform(b).todense()

0

В другой программе вы создаете экземпляр нового объекта, который не будет знать, что предыдущие данные имеют столько столбцов.

Вам необходимо сохранить CountVectorizerи так TfidfTransformerже, как вы сохранили модель, и загрузить их одинаково в другой программе.

Кроме того, вы можете просто использовать TfidfVectorizer вместо CountVectorizer + TfidfTransformer, потому что он делает комбинированную вещь и сделает вашу работу (экономя и загружая ее проще).

Поэтому во время обучения сделайте следующее:

...
x_train, x_test, y_train, y_test = model_selection.train_test_split(dataset['documents'],dataset['classes'],test_size=test_percentil)
#Term document matrix
tf_vect = TfidfVectorizer(ngram_range=(1, Ngram), min_df=1, max_features=MaxVocabulary, use_idf=True)
x_train_tf = tf_vect.fit_transform(x_train)
x_test_tf = tf_vect.transform(x_test)

...
питон, питон-3.x, scikit учиться, тс-IDF,
Похожие вопросы