В ваших рассуждениях есть два основных элемента, которые нужно улучшить.
Во-первых, вы должны улучшить свой метод сглаживания:
- При применении сглаживания Лапласа его следует применять ко всем измерениям.не только тем, у кого нулевой знаменатель.
- Кроме того, сглаживание Лапласа для таких случаев обычно дается выражением (c + 1) / (N + V), где V - размер словаря (например, см. В Wikipedia ).
Поэтому, используя определенную вами функцию вероятности (которая может быть не самой подходящей, см. Ниже):
p(sad loose|pos) = (0+1)/(3+8) * (0+1)/(3+8) = 1/121
p(sad loose|neu) = (0+1)/(3+8) * (0+1)/(3+8) = 1/121
p(sad loose|neg) = (1+1)/(3+8) * (1+1)/(3+8) = 4/121 <-- would become argmax
Кроме того, более распространенный способ вычисления вероятностиво-первых, было бы:
(number of tweets in class containing term c) / (total number of tweets in class)
Например, в приведенном выше ограниченном наборе поездов без учета сглаживания p (sad | pos) = 0/1 = 0 и p (sad |neg) = 1/1 = 1. Когда размер набора поездов увеличивается, числа будут более значимыми.Например, если бы у вас было 10 твитов для отрицательного класса, в 4 из которых появилось «грустное», то p (sad | neg) было бы 4/10.
Относительно фактического числа, выведенного наивным Байесомалгоритм: не следует ожидать, что алгоритм назначит фактическую вероятность каждому классу;скорее, порядок категорий имеет большее значение.Конкретно, использование argmax даст вам лучшее предположение алгоритма для класса, но не вероятность для него.Присвоение вероятностей результатам NB - другая история;например, см. статью , в которой обсуждается эта проблема.