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

问题描述

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

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])

以下是 的前 10 个特征X,它们显然不是二元的:

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 是如何在这里工作的?

标签: pythonscikit-learnclassificationnaivebayes

解决方案


这是由于binarize争论;来自文档

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

样本特征二值化(映射到布尔值)的阈值。如果没有,则假定输入已经由二进制向量组成。

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

binarize参数的工作方式与同名的独立预处理函数完全相同;这是一个简化的示例,您可以自己调整:

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]])

推荐阅读