Повторное использование модели классификации текста 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()