Классификация наивных байесовских текстов терпит неудачу в одной категории. Почему?

Я реализую наивный байесовский классификатор для обнаружения текстовых категорий. У меня 37 категорий, и у меня точность около 36% на моем тестовом наборе.

Я хочу повысить точность, поэтому решил реализовать 37 двусторонних классификаторов, как это предлагается во многих источниках (Способы повышения точности наивного байесовского классификатора? - один из них), эти классификаторы ответят на заданный текст:

specific_category OR everything_else

и я бы определил категорию текста, применяя их последовательно.

Но у меня проблема с первым классификатором, он всегда не работает в категории "specific_category".

У меня есть данные для обучения - 37 категорий, по 100 документов для каждой категории одинакового размера. Для каждой категории я нашел список из 50 функций, которые я выбрал по критериям взаимной информации (функции - это просто слова).

В качестве примера я использую две категории «сельское хозяйство» и «все остальное» (кроме сельского хозяйства).

По категории «сельское хозяйство»:

number of words in all documents of this class 
(first term in denominator in http://nlp.stanford.edu/IR-book/pdf/13bayes.pdf, (13.7))
W_agriculture = 31649.

Size of vocabulary V_agriculture = 6951.
Log probability of Unknown word (UNK) P(UNK|agriculture) = -10.56
Log probability of class P(agriculture) = log(1/37) = -3.61 (we have 37 categories of same-size documents)

Для категории «все_элс»:

W_everything_else = 1030043
V_everything_else = 44221
P(UNK|everything_else) = -13.89
P(everything_else) = log(36/37) = -0.03

Затем у меня есть текст, не связанный с сельским хозяйством, пусть он состоит в основном из Неизвестных слов (UNK). В нем 270 слов, они практически неизвестны как для категорий «сельское хозяйство», так и «все остальное». Предположим, 260 слов UNK для «все_else», остальные 10 известны.

Затем, когда я вычисляю вероятности

P(text|agriculture) = P(agriculture) + SUM(P(UNK|agriculture) for 270 times) 
P(text|everything_else) = P(everything_else) + SUM(P(UNK|everything_else) for 260 times) + SUM(P(word|everything_else) for 10 times)

В последней строке мы насчитали 260 слов как UNK и 10 как известные для категории.

Основная проблема. Поскольку P (UNK | сельское хозяйство) >> P (all_else) (для журнала это намного больше), влияние этих 270 терминов P (UNK | сельское хозяйство) перевешивает влияние суммы для P (word | everything_else) для каждого слова в тексте. . Так как

SUM(P(UNK|agriculture) for 270 times) = -2851.2
SUM(P(UNK|everything_else) for 260 times) = -3611.4

и первая сумма намного больше и не может быть исправлена ​​ни с помощью P (сельское хозяйство), ни SUM (P (word | all_else) для 10 слов), потому что разница огромна. Тогда я всегда терплю неудачу в категории «сельское хозяйство», хотя текст к ней не относится.

Вопрос: я что-то упускаю? Или как мне поступить с большим количеством UNK-слов и их вероятностью значительно выше для небольших категорий?

UPD: Пытался увеличить данные по обучению для категории "сельское хозяйство" (просто объединив документ 36 раз), чтобы они были равны количеству документов. Это помогло для нескольких категорий, не очень для других, я подозреваю, что из-за меньшего количества слов и размера словаря P (UNK | specific_category) становится больше и перевешивает P (UNK | everything_else) при суммировании в 270 раз.

Похоже, такой метод очень чувствителен к количеству слов в обучающих данных и размеру словарного запаса. Как это побороть? Может быть, биграммы / триграммы помогут?


person George    schedule 17.05.2013    source источник
comment
Вы можете попробовать взвешивание tf-idf, если вы этого еще не сделали. 100 документов в классе - это очень мало данных для обучения индивидуальным задачам, а метод «один против всех» - не всегда хорошая идея с наивным байесовским методом.   -  person Fred Foo    schedule 17.05.2013


Ответы (1)


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

Во-первых, даже если вы следуете схеме «1 против всех», у вас не может быть разных словарей для разных классов. Если вы это сделаете, пространства событий случайных величин будут разными, поэтому вероятности не будут сопоставимы. Вам необходимо выбрать единый общий словарный запас для всех классов.

Во-вторых, выбросьте неизвестный жетон. Это тебе не поможет. Игнорируйте любые слова, не входящие в выбранный вами словарь.

Наконец, я не знаю, что вы делаете с суммированием вероятностей. Думаю, вы сбиты с толку, ведя журналы. Эта формула неверна:

P (текст | сельское хозяйство) = P (сельское хозяйство) + СУММ (P (UNK | сельское хозяйство) в 270 раз)

Вместо этого это:

p (текст | сельское хозяйство) = p (сельское хозяйство) * p (unk | сельское хозяйство) ^ 270 * p (все остальные слова в документе | сельское хозяйство)

Если вы возьмете журналы, это станет:

журнал (p (t | a)) = журнал (p (сельское хозяйство)) + 270 * журнал (p (unk | сельское хозяйство)) + журнал (p (все другие слова | сельское хозяйство))

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

person Ben Allison    schedule 17.05.2013
comment
Привет, Бен, спасибо за ответ! Я использовал ваше предложение об общей лексике (я поместил туда все функции из всех категорий) и получил точность 40% на моих тестовых данных и 66% на реальных данных! Меня это более чем устраивает. Надеюсь, я скоро напишу подробный пост об этом. О математике журналов - спасибо за заботу, я тоже говорил о вероятностях журналов, просто не сказал это ясно. - person George; 17.05.2013