Я реализую наивный байесовский классификатор для обнаружения текстовых категорий. У меня 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 раз.
Похоже, такой метод очень чувствителен к количеству слов в обучающих данных и размеру словарного запаса. Как это побороть? Может быть, биграммы / триграммы помогут?