Повторное использование модели классификации текста sklearn с выбором функции tf-idf

Я относительно новичок в области sk-learning и машинного обучения, поэтому прощаю любое возможное невежество. Я делаю модель для классификации активов на основе текстового описания (в Python). Существует только один предиктор (текст) и одна прогнозируемая (категория) переменная. Для меток, я делю на категории, их около 30, поэтому каждая из них представлена ​​числом от 0 до 29. Для функций я использую оценку tf-idf. Моделирование и точность в порядке, и я сохраняю модель, используя дамп рассола.

Однако модель должна быть многократно используемой, поэтому она должна иметь возможность снова загружаться в определенный момент времени, чтобы пометить новый набор данных. Пожалуйста, смотрите код для сохранения / загрузки модели ниже.

## Save the linear SVC model
filename = 'SVM_model.sav'
pickle.dump(model, open(filename, 'wb'))

## Load model and test prediction accuracy
tfidf = TfidfVectorizer(analyzer='word',sublinear_tf=True, min_df=3, 
norm='l2', ngram_range=(1, 2), encoding='latin-1', stop_words='english')
testdf=pd.read_excel('learning_df.xlsx').tail(54068)
testdf['input']=testdf['item_description'].astype(str)+'- 
'+testdf['category_name_client'].astype(str)
testdf=testdf[['input','category_id_D&P']].dropna()
testdf['factor']=testdf['category_id_D&P'].apply(lambda x: cat_dict[x])
loaded_model = pickle.load(open(filename, 'rb'))
X_test1=tfidf.fit_transform(testdf.input).toarray()
y_test1=testdf['factor']
result = loaded_model.score(X_test1, y_test1)
print(result)

Обратите внимание, что настройки векторизатора tfidf точно такие же, как и при обучении / проверке модели. Cat_dict - это начальная факторизация категорий, и здесь я просто проверяю, чтобы текстовые категории были преобразованы в те же числа, что и модель, на которой была обучена / проверена модель.

Когда я попытался это, я пришел к этой ошибке:

ValueError: X has 24008 features per sample; expecting 20012

Это понятно, потому что tf-idf нового набора данных не дает того же числа функций, что и первоначально использованный набор данных обучения / проверки.

Так что мне было интересно, есть ли обходной путь для этого? Разве я не должен использовать tf-idf в первую очередь при обучении модели? Если нет, то каковы альтернативные способы выбора функций, которые впоследствии не привели бы к этой проблеме?

Заранее спасибо и еще раз извините, если я упускаю что-то очевидное.

1 ответ

Решение

Вы не можете установить новый векторизатор, потому что вы не будете выбирать те же функции, что и раньше. Вы должны прекратить использование .fit_transform() и вместо этого использовать .fit(), сохраните векторизатор, а затем запустите точно такой же встроенный векторизатор для каждого набора данных с .transform()

Другие вопросы по тегам