Как модель машинного обучения может обрабатывать невидимые данные и невидимые метки? - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь решить проблему классификации текста.У меня есть ограниченное количество меток, которые фиксируют категорию моих текстовых данных.Если входящие текстовые данные не соответствуют ни одной метке, они помечаются как «Другие».В приведенном ниже примере я построил классификатор текста, чтобы классифицировать текстовые данные как «завтрак» или «итальянский».В тестовом сценарии я включил пару текстовых данных, которые не вписываются в метки, которые я использовал для обучения.Это проблема, с которой я сталкиваюсь.В идеале, я хочу, чтобы модель сказала - «Другое» для «я люблю походы» и «все должны понимать математику».Как я могу это сделать?

import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfTransformer

X_train = np.array(["coffee is my favorite drink",
                    "i like to have tea in the morning",
                    "i like to eat italian food for dinner",
                    "i had pasta at this restaurant and it was amazing",
                    "pizza at this restaurant is the best in nyc",
                    "people like italian food these days",
                    "i like to have bagels for breakfast",
                    "olive oil is commonly used in italian cooking",
                    "sometimes simple bread and butter works for breakfast",
                    "i liked spaghetti pasta at this italian restaurant"])

y_train_text = ["breakfast","breakfast","italian","italian","italian",
                "italian","breakfast","italian","breakfast","italian"]

X_test = np.array(['this is an amazing italian place. i can go there every day',
                   'i like this place. i get great coffee and tea in the morning',
                   'bagels are great here',
                   'i like hiking',
                   'everyone should understand maths'])

classifier = Pipeline([
    ('vectorizer', CountVectorizer()),
    ('tfidf', TfidfTransformer()),
    ('clf', MultinomialNB())])

classifier.fit(X_train, y_train_text)
predicted = classifier.predict(X_test)
proba = classifier.predict_proba(X_test)
print(predicted)
print(proba)

['italian' 'breakfast' 'breakfast' 'italian' 'italian']
[[0.25099411 0.74900589]
 [0.52943091 0.47056909]
 [0.52669142 0.47330858]
 [0.42787443 0.57212557]
 [0.4        0.6       ]]

Я считаю категорию «Другие» шумом и не могу смоделировать эту категорию.

Ответы [ 4 ]

0 голосов
/ 02 октября 2018

Нет, вы не можете этого сделать.

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

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

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

Не подходите к манипулированию вероятностями самостоятельно, вероятность 50-50% означает, что модель перепутана между двумя классами, которые вы определили, она не имеет представления о третьем «другом классе». Допустим, предложение «Я хочу итальянский завтрак», модель будет запутана, относится ли это предложение к категории «итальянский» или «завтрак», но это не означает, что оно относится к «другой» категории ».

0 голосов
/ 26 сентября 2018

Вы не можете этого сделать.

Вы обучили модель предсказывать только две метки, т.е. breakfast или italian.Таким образом, модель не имеет никакого представления о третьем лейбле или четвертом и т. Д.

Вы и я знаем, что "i like hiking" не является ни breakfast, ни italian.Но как модель узнала бы это?Он знает только breakfast & italian.Таким образом, должен быть способ сообщить модели, что: Если вы запутались между breakfast & italian, то предсказывайте метку как other

Вы можете достичь этогообучая модель, имеющую метку other, с некоторыми текстами, такими как "i like hiking" и т. д.

Но в вашем случае немного hack можно сделать следующим образом.


Так что же это значит, когда модель предсказывает метку с вероятностью 0,5 (или приблизительно 0,5)?Это означает, что модель путается между метками breakfast и italian.Так что здесь вы можете воспользоваться этим.

Вы можете взять все предсказанные значения вероятности и присвоить метку other, если значение вероятности находится в диапазоне от 0,45 до 0,55.Таким образом, вы можете предсказать метку other (очевидно, с некоторыми ошибками), не позволяя модели знать, что есть метка под названием other

0 голосов
/ 28 сентября 2018

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

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

0 голосов
/ 20 сентября 2018

Вы можете попробовать установить приоры класса при создании MultinomialNB. Вы можете создать фиктивный пример обучения «Другое», а затем установить достаточно высокий предыдущий параметр для «Другое», чтобы экземпляры по умолчанию имели значение «Другой», когда для выбора других классов недостаточно свидетельств.

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