Модель SkLearn для классификации текстовых мультиклассов - PullRequest
3 голосов
/ 28 апреля 2020

У меня есть классификатор мультикласс, обученный по модели LinearSVC, предоставленной библиотекой Sklearn. Эта модель предоставляет метод decision_function, который я использую с библиотечными функциями numpy для правильной интерпретации набора результатов.

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

Я ожидал другое поведение моего классификатора.

Я имею в виду, например, что у меня есть короткий фрагмент текста, подобный этому:

"There are a lot of types of virus and bacterias that cause disease."

Но мой классификатор был обучен трем типам текстов, скажем, "математика", «история» и «технология».

Итак, я думаю, что у каждого из трех субъектов есть вероятность, очень близкая к нулю (и, следовательно, к сумме 1), когда я пытаюсь это классифицировать.

Есть ли более подходящий метод или модель для получения результатов, которые я только что описал?

Неправильно ли я использую decision_function?

Иногда вы можете иметь текст, который не имеет ничего общего с какими-либо предметами, используемыми для обучения классификатора или наоборот, это может быть вероятность около 1 для более чем одного предмета.

Я думаю, мне нужно найти немного света на эти вопросы (текстовая классификация, отсутствие двоичной классификации и т. д. c.)

Заранее большое спасибо за любую помощь!

Ответы [ 3 ]

2 голосов
/ 29 апреля 2020

На ваш вопрос есть несколько частей, на которые я постараюсь ответить как можно больше.

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

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

Для решения вашей проблемы, т. е. существование примеров не относится ни к одному из классов, вы всегда можете создать псевдокласс с именем others когда вы тренируете модель, таким образом, даже если ваша точка данных не соответствует ни одному из ваших реальных классов, например maths, history и technology, в соответствии с вашим примером она будет привязана к классу other .

Решение проблемы, связанной с тем, что ваша точка данных может принадлежать нескольким классам.

Это то, для чего обычно используется классификация с несколькими метками .

Надеюсь это поможет!

1 голос
/ 02 мая 2020

Что вы ищете, так это модель классификации по нескольким меткам. См. здесь , чтобы узнать понимание классификации по нескольким меткам и список моделей, которые поддерживают задачу классификации по нескольким меткам.

Простой пример демонстрации классификации по нескольким меткам:

from sklearn.datasets import fetch_20newsgroups

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
from sklearn.preprocessing import OneHotEncoder
categories = ['sci.electronics', 'sci.space', 'talk.religion.misc',]
newsgroups_train = fetch_20newsgroups(subset='all',
                                      remove=('headers', 'footers', 'quotes'),
                                      categories=categories)

from sklearn.multioutput import MultiOutputClassifier
from sklearn.pipeline import make_pipeline

X, y = newsgroups_train.data, OneHotEncoder(sparse=False)\
    .fit_transform([[newsgroups_train.target_names[i]]
                      for i in newsgroups_train.target])

model = make_pipeline(TfidfVectorizer(stop_words='english'),
                      MultiOutputClassifier(LinearSVC()))

model.fit(X, y)

print(newsgroups_train.target_names)
# ['sci.electronics', 'sci.space', 'talk.religion.misc']


print(model.predict(['religion followers of jesus']))
# [[0. 0. 1.]]


print(model.predict(['Upper Atmosphere Satellite Research ']))
# [[0. 1. 0.]]


print(model.predict(['There are a lot of types of virus and bacterias that cause disease.']))
# [[0. 0. 0.]]

0 голосов
/ 29 апреля 2020

Обычный способ справиться с этим - попытаться привести ваш текстовый образец в некое векторное пространство и измерить «расстояние» между ним и некоторыми архетипическими позициями в том же векторном пространстве, которые представляют классификации.

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

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

И, наконец, определив несколько кластерных центров, вы можете просто подсчитать, какой из этих топических c -кластеров ваш выбранный образец находится ближе всего - но у вас также есть под рукой относительные расстояния между вашей выборкой и всеми остальными центрами кластеров - так что это меньше вероятности c, больше пространственная мера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...