Как рассчитать feature_log_prob_ в наивном мноюNB - PullRequest
1 голос
/ 04 мая 2020

Вот мой код:

# Load libraries
import numpy as np
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer
# Create text
text_data = np.array(['Tim is smart!',
                      'Joy is the best',
                      'Lisa is dumb',
                      'Fred is lazy',
                      'Lisa is lazy'])
# Create target vector
y = np.array([1,1,0,0,0])
# Create bag of words
count = CountVectorizer()
bag_of_words = count.fit_transform(text_data)    # 

# Create feature matrix
X = bag_of_words.toarray()

mnb = MultinomialNB(alpha = 1, fit_prior = True, class_prior = None)
mnb.fit(X,y)

print(count.get_feature_names())
# output:['best', 'dumb', 'fred', 'is', 'joy', 'lazy', 'lisa', 'smart', 'the', 'tim']


print(mnb.feature_log_prob_) 
# output 
[[-2.94443898 -2.2512918  -2.2512918  -1.55814462 -2.94443898 -1.84582669
  -1.84582669 -2.94443898 -2.94443898 -2.94443898]
 [-2.14006616 -2.83321334 -2.83321334 -1.73460106 -2.14006616 -2.83321334
  -2.83321334 -2.14006616 -2.14006616 -2.14006616]]

Мой вопрос:
Скажем, для слова: "лучший": вероятность для class 1 : -2.14006616.
Что такое формула для расчета, чтобы получить этот балл.

Я использую LOG (P(best|y=class=1)) -> Log(1/2) -> не могу получить -2.14006616

1 Ответ

0 голосов
/ 04 мая 2020

Из документации мы можем сделать вывод, что feature_log_prob_ соответствует эмпирической логарифмической вероятности объектов данного класса. Давайте возьмем пример функции «лучший» для целей этой иллюстрации, вероятность log этой функции для класса 1 равна -2.14006616 (как вы указали), теперь, если бы мы преобразовали ее в фактическую оценку вероятности это будет np.exp(1)**-2.14006616 = 0.11764. Давайте сделаем еще один шаг назад, чтобы увидеть, как и почему вероятность «лучшего» в классе 1 равна 0.11764. Согласно документации Полиномиальный Наивный Байес , мы видим, что эти вероятности рассчитываются по следующей формуле:

enter image description here

Где, числитель примерно соответствует числу раз, когда признак «лучший» появляется в классе 1 (который представляет наш интерес в этом примере) в обучающем наборе, а знаменатель соответствует общему количеству всех признаков для класса 1. Кроме того, мы добавляем небольшое значение сглаживания, alpha, чтобы предотвратить снижение вероятностей до нуля, а n соответствует общему количеству признаков, т.е. размеру словаря. Вычисляя эти числа для нашего примера,

N_yi = 1  # "best" appears only once in class `1`
N_y = 7   # There are total 7 features (count of all words) in class `1`
alpha = 1 # default value as per sklearn
n = 10    # size of vocabulary

Required_probability = (1+1)/(7+1*10) = 0.11764

Вы можете сделать математику аналогичным образом для любой заданной функции и класса.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...