Повторное использование модели классификации текста sklearn с выбором функции tf-idf - PullRequest
0 голосов
/ 16 ноября 2018

Я относительно новичок в области 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 Ответ

0 голосов
/ 16 ноября 2018

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

...