классификация sklearn с выводом нескольких меток

Привет, я изучаю ИИ для создания чат-бота, сейчас я тестирую классификацию с помощью sklearn, мне удается получить хорошие результаты с помощью следующего кода.

def tuned_nominaldb():
    global Tuned_Pipeline
    pipeline = Pipeline([
    ('tfidf', TfidfVectorizer(analyzer=text_process)),
    ('clf', OneVsRestClassifier(MultinomialNB(
        fit_prior=True, class_prior=None))),
    ])
    parameters = {
        'tfidf__max_df': (0.25, 0.5, 0.75),
        'tfidf__ngram_range': [(1, 1), (1, 2), (1, 3)],
        'clf__estimator__alpha': (1e-2, 1e-3)
    }

    Tuned_Pipeline = GridSearchCV(pipeline, parameters, cv=2, n_jobs=2, verbose=10)
    Tuned_Pipeline.fit(cumle_train, tur_train)

мои ярлыки:

  • Сквернословие
  • Политика
  • религиозный
  • Общий

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

Я попытался добавить следующий код, но получил ошибку, что строка не ожидалась для подходящего метода.

multiout = MultiOutputClassifier(Tuned_Pipeline, n_jobs=-1)
multiout.fit(cumle_train, tur_train)
print(multiout.predict(cumle_test))

Спасибо большое за вашу помощь


person GurhanCagin    schedule 02.04.2018    source источник
comment
Вам нужны результаты с несколькими метками, но я не думаю, что вы можете просто начать выводить несколько классов, пока ваши данные Y не станут единым вектором, а вместо этого будут иметь несколько столбцов (по одному для каждой из ваших четырех меток). Вот хороший пример. Вот ответ, который может помочь.   -  person Jarad    schedule 02.04.2018
comment
Привет, Джарад, большое спасибо за информацию, поэтому позвольте мне сказать, что я понимаю, если вы не тренируетесь с несколькими метками, то невозможно объединить результаты с методом обучения с одной меткой. у меня есть данные о поездах по вышеупомянутым темам, которые я упомянул, но у меня нет их по комбинированным. Я думал, что будет способ, например, если значение оценки предложения выше некоторой точки, вы можете добавить эту метку к выводу.   -  person GurhanCagin    schedule 02.04.2018
comment
Правильный. Если я ошибаюсь, я очень удивлюсь. Единственные примеры вывода с несколькими метками, которые я видел, всегда имели Y, который обычно кодировался MultiLabelBinarizer. Я никогда не видел пример, в котором есть какой-то параметр, который вы устанавливаете, который может автоматически расширить вашу выходную переменную от одного прогнозируемого значения до внезапного множества значений только с обучением на одномерном входе Y.   -  person Jarad    schedule 02.04.2018
comment
Привет, Джарад, если вы напечатаете Tuned_Pipeline.predict_proba([choice]), где выбор — это предложение, которое вы ввели для тестирования. он дает вам результаты вероятности для каждого класса, результата недостаточно, чтобы объединить что-либо   -  person GurhanCagin    schedule 03.04.2018
comment
Сумма строк в строке predict_proba равна 1. Если это тот тип вывода, к которому вы стремились, отлично! На мой взгляд, predict_proba не является заменой реальной проблемы классификации с несколькими метками, потому что вам нужно будет определить пороги вероятности, и вы не можете просто слепо взять n, потому что у вас может быть 3 метки около 0 prob и 1 с высокой вероятностью. что даст вам 1 хороший ярлык, 1 плохой ярлык. Хотя это креативная идея.   -  person Jarad    schedule 03.04.2018


Ответы (1)


Поскольку вы используете OneVsRestClassifier, он обучает один двоичный классификатор для каждой используемой метки, это означает, что вы можете использовать несколько оценок в одном предложении и получать от него несколько меток. Я предлагаю вам проверить эти ссылки:

person LeandroHumb    schedule 02.04.2018