Нормализация длины в наивном байесовском классификаторе для документов - PullRequest
5 голосов
/ 09 сентября 2011

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

Я внимательно следил за Ренни, эт. и др. бумага на http://www.aaai.org/Papers/ICML/2003/ICML03-081.pdf,, но я столкнулся с проблемой, которая, кажется, не решена. А именно, классификация коротких документов приводит к гораздо большей апостериорной вероятности из-за того, что документы имеют меньшее количество признаков; наоборот для длинных документов.

Это потому, что апостериорные вероятности определены как (игнорируя знаменатель):

P(class|document) = P(class) * P(document|class)

, который расширяется до

P(class|document) = P(class) * P(feature1|class) * ... * P(featureK|class)

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

Например, предположим, что функции "foo", "bar" и "baz" все обнаруживаются в положительных наблюдениях за тренировками. Тогда документ с одним признаком «foo» будет иметь более высокую апостериорную вероятность быть классифицированным в положительном классе, чем документ с признаками {«foo», «bar», «baz»}. Это кажется нелогичным, но я не совсем уверен, как решить эту проблему.

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

1 Ответ

4 голосов
/ 10 сентября 2011

Это хороший вопрос; Теперь я не совсем уверен, что здесь есть проблема. Апостериорная вероятность просто дает вам вероятность каждого класса данного документа (то есть вероятности класса каждого документа). Таким образом, при классификации документа вы сравниваете только исходные данные для одного и того же документа, и поэтому число функций не изменится (поскольку вы не просматриваете документы), то есть:

P(class1|document) = P(class1) * P(feature1|class1) * ... * P(featureK|class1)
...
P(classN|document) = P(classN) * P(feature1|classN) * ... * P(featureK|classN)

Класс с наивысшим апостериором будет называться меткой для документа. Поэтому, поскольку количество функций зависит от документа, а не от класса, нормализация не требуется.

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

P(class1|document) = P(class1) * P(feature1|class1) * ... * P(featureK|class1)/Sum_over_all_numerators

И это корректно нормализуется в документах различной длины.

...