当预测变量不是二进制时,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 的朴素贝叶斯分类器;如何使用模型进行预测?