我正在尝试使用sklearn.naive_bayes.GaussianNB
运行partial_fit
模型。为此,我像这样计算priors
:
unique_lbls, counts = np.unique(labels, return_counts=True)
counts = counts.astype(float)
priors = counts / counts.sum()
model = GaussianNB(priors=priors)
model.partial_fit(X, y, classes=unique_lbls)
我得到了一个`ValueError:先验的总和应该是1,但是我已经检查过并且先验总结为1.0:
print priors.sum()
> 1.0
我使用以下版本:
Python 2.7.12
scikit-learn 0.18.2
numpy 1.13.1
我只能想象它归结为总和值的灵敏度,但我试图用priors /= priors.sum()
再次标准化先验,并返回相同的错误。
是否有一种不同的方法可以确保先验总和达到1.0并具有更高的容差,或者是否有一些(对我来说不是)明显的原因这不起作用?
编辑:labels
是一个numpy数组,包含整数数据集的标签,表示为整数,X和y是完整数据集的批处理。
y
和labels
每个类都至少有100个示例。
答案 0 :(得分:1)
我的第一个直觉是数据有问题。但是,看起来partial_fit
函数在引发该错误之前甚至没有查看数据。特别是,the implementation看起来像这样:
# Check that the sum is 1
if priors.sum() != 1.0:
raise ValueError('The sum of the priors should be 1.')
他们将先验的总和精确地与1.0进行比较,这在数值上并不十分稳健。如果你有一个不幸的值组合,标准化的先验可能不会精确地汇总到1.0
。考虑一下:
priors = np.array([1, 2, 3, 4, 5, 6], dtype=float)
priors /= priors.sum()
print(priors.sum() == 1.0) # False
这种情况会导致检查失败。让我们试着解决这个问题:
priors[0] = 1.0 - priors[1:].sum()
print(priors.sum() == 1.0) # True