【问题标题】:partial_fit with scikit-learn returns ValueError: The sum of the priors should be 1带有 scikit-learn 的 partial_fit 返回 ValueError:先验之和应为 1
【发布时间】:2018-01-08 03:21:14
【问题描述】:

我正在尝试使用partial_fit 运行sklearn.naive_bayes.GaussianNB 模型。为此,我像这样计算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: The sum of the priors should be 1, but I have check and the priors sum up to 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 个来自每个类的示例。

【问题讨论】:

  • 一点帮助都没有,但在 Python 2.7.10、sklearn 0.18.2 和 numpy 1.13.1 上对我来说效果很好。这不太可能是 Python 的事情,但可能是。您能否发布一些数据,看看我是否可以使用您的数据重新创建?
  • 您在y 中是否有不在unique_lbls 中的值? (根据partial_fit的文档)
  • 创建数据示例很复杂,因此我尝试使用一组创建为X = numpy.random.rand(10000,100)y = numpy.random.int(10000) 的随机值来重现错误。我按照与上述相同的步骤进行操作,并且没有任何问题。所以我的数据一定有什么东西。尽管priors.sum() 如何返回1.0 并且partial_fit 仍然抱怨它并非如此,但问题仍然存在。 @kazemakase y 中的所有课程都可以在 unique_lbls 中找到
  • 我不再认为是数据。我强烈怀疑如果你这样做priors.sum() == 1.0,你会得到False。我说的对吗?

标签: python numpy scikit-learn sum naivebayes


【解决方案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

【讨论】:

  • 一个非常奇怪的问题。我尝试实施您的解决方案,但也失败了。我实际上尝试了您上面的确切示例,但最后也失败了。会不会只出现在某些版本的 scikit-learn 或 numpy 中?
  • 可能......我很有想法,抱歉。
  • 为了测试,请问您使用的是哪个版本的python、scikit-learn和python?也许我可以这样想。
  • 哦,不用err,你也可以试试priors[0] = 1 - priors[1:].sum()
猜你喜欢
  • 2018-02-04
  • 2016-08-11
  • 2023-04-06
  • 2015-12-18
  • 2019-07-23
  • 2017-06-12
  • 2016-08-09
  • 2017-12-23
  • 2020-02-07
相关资源
最近更新 更多