如何在 naive_bayes MultinomialNB 中计算 feature_log_prob_

Posted

技术标签:

【中文标题】如何在 naive_bayes MultinomialNB 中计算 feature_log_prob_【英文标题】:How to calculate feature_log_prob_ in the naive_bayes MultinomialNB 【发布时间】:2020-08-18 13:37:12 【问题描述】:

这是我的代码:

# 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】:

从documentation 我们可以推断出feature_log_prob_ 对应于给定类别的特征的经验对数概率。让我们举一个“最佳”的例子来说明这个例子,log1 的这个特征的概率是 -2.14006616 (正如你所指出的),现在如果我们将它转​​换成实际的概率分数它将是np.exp(1)**-2.14006616 = 0.11764。让我们后退一步,看看1 类中“最佳”的概率如何以及为什么是0.11764。根据Multinomial Naive Bayes 的文档,我们看到这些概率是使用以下公式计算的:

其中,分子大致对应于特征“best”在训练集中出现在类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

您可以对任何给定的功能和类以类似的方式进行数学运算。

希望这会有所帮助!

【讨论】:

我认为您可以将np.exp(1)**-2.14006616 简化为np.exp(-2.14006616) ,不是吗?

以上是关于如何在 naive_bayes MultinomialNB 中计算 feature_log_prob_的主要内容,如果未能解决你的问题,请参考以下文章

使用 Sklearn.naive_bayes.Bernoulli 的朴素贝叶斯分类器;如何使用模型进行预测?

如何在 naive_bayes MultinomialNB 中计算 feature_log_prob_

sklearn.naive_bayes.GaussianNB 中的 ValueError

sklearn.naive_bayes中Bernoulli NB几种朴素贝叶斯分类器

如何在多文本分类中添加更多特征?

如何计算精度和F1?