sklearn ComplementNB:可分离数据仅预测类0

0 投票
1 回答
25 浏览
提问于 2025-04-12 21:40

下面的内容展示了一个平衡的一维数据,这些数据可以被 sklearn GaussianNB 完美地分开。但是,为什么用 sklearn ComplementNB 处理同样的数据时,分类结果全都是零呢?

from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import ComplementNB
import numpy as np

N = 20
np.random.seed(9)
pos = np.random.uniform(size = N, low = 0.7, high = 0.8).reshape(-1, 1)
neg = np.random.uniform(size = N, low = 0.4, high = 0.5).reshape(-1, 1)
X = np.r_[pos, neg]
Y = np.array([1] * N + [0] * N)

gnb = GaussianNB()
cnb = ComplementNB()
gnb.fit(X,Y)
cnb.fit(X,Y)
#predict training data
print(gnb.predict(X))   
print(cnb.predict(X))

高斯朴素贝叶斯模型的预测是100%正确的,而补充朴素贝叶斯模型却只预测出零。这是为什么呢?

[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 

1 个回答

2

补充的朴素贝叶斯其实在只有一个特征的时候效果会变差。想象一下,有几本书里只重复一个词,这样正类和负类的语言模型都会以概率1生成那个词,所以这个特征就没有意义了。

更具体一点,看看sklearn文档中的权重计算:

enter image description here

如你所见,当只有一个特征时,k的求和结果只会得到一个值,因此theta的值也会是1,而它的对数是0,这对分类没有任何帮助。接下来这段代码的输出可以证明这一点:

cnb.feature_log_prob_

这表明特征的权重将会是零。

撰写回答