partial_fit with scikit-learn返回值ValueError:先验的总和应为1

时间:2017-08-01 09:59:55

标签: python numpy scikit-learn sum naivebayes

我正在尝试使用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是完整数据集的批处理。 ylabels每个类都至少有100个示例。

1 个答案:

答案 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