sklearn ComplementNB:仅对完全可分离数据进行 0 类预测

问题描述 投票:0回答:1

如下所示,下面平衡的一维数据可以通过

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] 
python scikit-learn classification naivebayes
1个回答
0
投票

当只有一个可用的特征时,补朴素贝叶斯实际上失去了它的力量,想想由一个重复单词组成的几本书,由正类和负类创建的语言模型每个都会以概率 1 产生该单词,因此该特征将使没有意义。

为了更精确,请考虑 sklearn 文档中的权重计算:

正如你所看到的,当只有一个特征时,k 的求和只会得到一个值,因此 theta 的值为 1,其对数为零,对分类没有贡献。正如您可以通过以下代码的输出看到的:

cnb.feature_log_prob_

这表示特征将被加权为零。

© www.soinside.com 2019 - 2024. All rights reserved.