2013-11-24 2 views
2

Я пытаюсь создать классификатор Наивного Байеса, который берет документ и обрабатывает документ как мешок слов и разные книги как отдельные классы, дает вероятность того, что документ эта книга (я знаю, это немного смешно, но это отправная точка для чего-то еще). Я использую это: http://www.stanford.edu/class/cs124/lec/naivebayes.pdf как о своем решении, как это сделать.Naive Bayes Классификатор - документы разной длины

Так, например, если бы у нас был документ d как «Возвращение Шерлока Холмса», то, глядя на кучу p (b | d) для кучки книг, «Возвращение Шерлока Холмса» было бы как «Приключения Шерлока Холмса», в то время как «Улисс» Джеймса Джойса будет гораздо менее вероятным.

Чтобы сделать это, я делаю p(b|d) α p(d|b)p(b), где p(b) = 1/(# of books) и p(d|b)=sum over all words w in document[log(p(w|b))], где p(w|b) = (# of times word w appears in book b + 1)/(# of words in book b + vocabularysize).

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

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

+0

Хотя вы реализуете это как упражнение для машинного обучения, я считаю, что неотъемлемый ответ на ваш вопрос является математическим, основанным на вероятностях. Возможно, вам повезло на сайте Mathematics StackExchange. Если вы считаете, что это связано с некоторой ошибкой/реализацией вашего кода, вы должны, вероятно, поделиться проблематичным битом кода. – cm2

+0

Я подумал об этом, но здесь я увидел много вопросов Наивного Байеса, и никто из них не предложил перейти к Math StackExchange. Это скорее вопрос, связанный с алгоритмом, чем математический вопрос, поэтому я считаю, что более подходящим для него является то, что StackOverflow охватывает не просто программирование, но и алгоритмы. –

ответ

0

Ваш знаменатель в p(w|b) кажется странным. Вы должны попытаться использовать только

p(w|b) = (# of times word w appears in book b + 1)/(# of words in book b)

+0

Нет, его знаменатель прав. Если вы будете следовать своему предложению, ваши вероятности не будут суммироваться с одним. –

2

Очень длинные книги будет много слов. Наивный Байес будет одобрять эти документы, потому что все слова, которые вы используете в своем материале, скорее всего, произошли много раз в очень длинных книгах. Поскольку его вектор-функция (и я предполагаю, что вы используете униграммы), порядок слов не имеет значения. Таким образом, слова на вашем входе могут быть сопоставлены с длинной книгой просто потому, что слова появились во всей этой действительно длинной книге.

1) Если вам нужны хорошие вероятности, вам следует уйти от наивных заливов. Предположение о независимости приводит к очень плохим результатам. Существует many papers о его проблемах относительно значений вероятности.

2) Изменение порядка изменения длины документа может быть затруднено. Вы можете найти функцию подобия косинуса для ряда пояснений относительно того, почему мы используем нормализацию при работе с текстом - и попробуйте применить его к вашим векторам объектов.

3) Если вы хотите придерживаться наивных заливов, вы можете попытаться использовать распределение Бернулли вместо Multinomial. Это должно быть меньше результатом длины слов/длины документа, поскольку это, по-видимому, является вашей проблемой.

4) Вы, вероятно, захотите применить stop words к вашему корпусу.

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

1

Это стандартная проблема с многокомпонентным классификатором, как упоминает Рафф, из-за того, что более крупные документы собирают итоговые суммы при обучении. Кажется, что вы получаете правильный результат в качестве высшего класса большую часть времени, но хотите, чтобы задний был точным? Наивный Байес - очень плохая вероятностная модель, надеясь на реалистичную заднюю часть, маловероятна.

Модель вероятностных вероятностей для документов - это многочленное соединение Дирихле и скрытое распределение Дирихле. Они являются генеративными. Поскольку вас интересует только задняя часть над классами, вы должны рассмотреть дискриминационную модель. Дискриминационная версия Naive Bayes - это MaxEnt/Logistic Regression/Log-Linear model (все это одно и то же, но вы можете услышать один используемый термин). Вы также можете использовать SVM с методом Platt для получения вероятности или Neural Net с выходом softmax и потерей кросс-энтропии. Для дискриминационных моделей я бы рекомендовал вам нормализовать ваши счета на сумму слов в каждом документе, так как это сделает все документы одинаковыми. Однако вы не можете сделать это для генеративных моделей, поскольку они определены для данных подсчета.

Смежные вопросы