当预测变量不是二进制时,Sklearn 朴素贝叶斯伯努利分类器如何工作?

Posted

技术标签:

【中文标题】当预测变量不是二进制时,Sklearn 朴素贝叶斯伯努利分类器如何工作?【英文标题】:How does Sklearn Naive Bayes Bernoulli Classifier work when the predictors are not binary? 【发布时间】:2021-09-25 11:49:30 【问题描述】:

众所周知,伯努利朴素贝叶斯分类器使用二元预测变量(特征)。我没有得到的是 scikit-learn 中的 BernoulliNB 如何给出结果,即使预测变量不是二进制的。以下示例逐字取自documentation:

import numpy as np
rng = np.random.RandomState(1)
X = rng.randint(5, size=(6, 100))
Y = np.array([1, 2, 3, 4, 4, 5])
from sklearn.naive_bayes import BernoulliNB
clf = BernoulliNB()
clf.fit(X, Y)

print(clf.predict(X[2:3]))

输出

array([3])

这里是X的前10个特征,它们显然不是二进制的:

3   4   0   1   3   0   0   1   4   4   1
1   0   2   4   4   0   4   1   4   1   0
2   4   4   0   3   3   0   3   1   0   2
2   2   3   1   4   0   0   3   2   4   1
0   4   0   3   2   4   3   2   4   2   4
3   3   3   3   0   2   3   1   3   2   3

即使预测变量不是二元的,BernoulliNB 在这里如何工作?

【问题讨论】:

请尽量使您的问题尽可能简洁和重点突出,避免不必要的粗体(尤其适用于整个段落)。请参阅上面的编辑结果。 【参考方案1】:

这是由于binarize 参数;来自docs:

二值化:浮动或无,默认=0.0

样本特征二值化(映射到布尔值)的阈值。如果为 None,则假定输入已经包含二进制向量。

当使用其默认值binarize=0.0 调用时,就像您的代码中的情况一样(因为您没有明确指定它),它将导致将大于0 的X 的每个元素转换为1,因此转换X 将用作 BernoulliNB 分类器的实际输入,实际上将包含二进制值。

binarize 参数的工作方式与独立的preprocessing function of the same name 完全相同;这是一个简化的示例,您可以自行调整:

from sklearn.preprocessing import binarize
import numpy as np

rng = np.random.RandomState(1)
X = rng.randint(5, size=(6, 1))
X
# result
array([[3],
       [4],
       [0],
       [1],
       [3],
       [0]])

binarize(X) # here as well, default threshold=0.0
# result (binary values):
array([[1],
       [1],
       [0],
       [1],
       [1],
       [0]])

【讨论】:

以上是关于当预测变量不是二进制时,Sklearn 朴素贝叶斯伯努利分类器如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

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

机器学习 | Sklearn中的朴素贝叶斯全解

统计学习方法朴素贝叶斯对鸢尾花(iris)数据集进行训练预测

实战|朴素贝叶斯分类对文档进行分类

Sklearn:为连续特征、多个标签选择朴素贝叶斯模型

sklearn中的朴素贝叶斯模型及其应用