我正在尝试做什么?

我正在尝试使用 GaussianNB 分类器训练具有 10 个标签的数据集,但是在调整我的 gaussianNB 先验参数时出现此错误:-

文件“/home/mg/anaconda2/lib/python2.7/site-packages/sklearn/naive_bayes.py”,第367行,_partial_fit
raise ValueError('先验的总和应该是 1.')
ValueError:先验之和应为 1。

代码:-
clf = GaussianNB(先验 = [0.08, 0.14, 0.03, 0.16, 0.11, 0.16, 0.07, 0.14, 0.11, 0.0])

你可以看到总和显然是 1 但它向我显示了这个错误,你能指出错误吗?

最佳答案

这看起来像是 sklearn 中一个非常糟糕的设计决策,因为他们正在做通常的 不比较浮点数 的东西( what every computer scientist should know about floating-point arithmetic ),这让我感到惊讶(因为 sklearn 通常是高质量的代码)!

(尽管使用了列表,但我没有看到您的任何错误用法。文档需要一个数组,而不是像许多其他情况下的数组一样, 他们的代码仍然在进行数组转换)

Their code :

if self.priors is not None:
    priors = np.asarray(self.priors)
    # Check that the provide prior match the number of classes
    if len(priors) != n_classes:
        raise ValueError('Number of priors must match number of'
                         ' classes.')
    # Check that the sum is 1
    if priors.sum() != 1.0:
        raise ValueError('The sum of the priors should be 1.')
    # Check that the prior are non-negative
    if (priors < 0).any():
        raise ValueError('Priors must be non-negative.')
    self.class_prior_ = priors
else:
    # Initialize the priors to zeros for each class
    self.class_prior_ = np.zeros(len(self.classes_),
                                 dtype=np.float64)

所以:
  • 你给出一个列表,但他们的代码会创建一个 numpy-array
  • 因此 np.sum() 将用于求和
  • 在对 求和时可能存在 fp 数学相关的数值错误,就像您的情况一样
  • 你的总和在技术上是 != 1.0;但非常接近它!
  • fp-comparison x == 1.0 被认为是坏的!
  • numpy 带来 np.isclose() 这是执行此操作的常用方法

  • 演示:
    import numpy as np
    
    priors = np.array([0.08, 0.14, 0.03, 0.16, 0.11, 0.16, 0.07, 0.14, 0.11, 0.0])
    my_sum = np.sum(priors)
    print('my_sum: ', my_sum)
    print('naive: ', my_sum == 1.0)
    print('safe: ', np.isclose(my_sum, 1.0))
    

    输出:
    ('my_sum: ', 1.0000000000000002)
    ('naive: ', False)
    ('safe: ', True)
    

    编辑:

    因为我认为这段代码不好,所以我发布了一个问题 here 你可以关注它,看看他们是否遵守。

    numpy.random.sample() 也采用这样的向量,实际上也在做一个 fp 安全的方法(数值上更稳定的求和 + epsilon-check;但不使用 np.isclose() ),如 here 所见。

    关于python-2.7 - GaussianNB :- ValueError: The sum of the priors should be 1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45896410/

    10-10 10:28