2017-08-01 60 views
0

我想运行一个sklearn.naive_bayes.GaussianNB模型与partial_fit。为此,我计算priors这样的:用scikit学习partial_fit返回ValueError:先验的总和应该是1

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 

我只能想象它归结加法值的敏感性,但我试图用再次正常化先验并且它返回相同的错误。

有没有不同的方法来确保先验者和1.0具有更高的容忍度,或者有一些(对我来说不 - )显而易见的原因,这是行不通的?

编辑:labels是一个numpy数组,包含整个数据集的标签表示为整数,X和y是一批完整的数据集。 ylabels都有来自每个班级的至少100个示例。

+0

没有任何帮助,但它在Python 2.7.10,sklearn 0.18.2和numpy 1.13.1上工作正常。这不太可能是Python的事情,但可能是。你可以发布一些数据,看看我能否用你的数据重新创建? – ncfirth

+0

你在'y'中的值不是'unique_lbls'吗? (根据文档['partial_fit'](http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html#sklearn.naive_bayes.GaussianNB.partial_fit)) – kazemakase

+0

这是复杂的创建数据的例子,所以我反而尝试通过使用一组随机值来重现错误,这些随机值的创建方式为'X = numpy.random.rand(10000,100)'和'y = numpy.random.int(10000)'。我遵循上述相同的步骤,这没有任何问题。所以我的数据必须有一些东西。问题依然存在,尽管'priors.sum()'可以返回'1.0',partial_fit仍然抱怨它不是这种情况。 @kazemakase'y'中的所有类都可以在'unique_lbls'中找到 – Tobias

回答

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 
+0

一个非常好奇的问题。我试着实施你的解决方案,但也失败了。我实际上已经尝试了上面的确切示例,并且最终也失败了。难道它只是在某些版本的scikit-learn或numpy中出现的东西吗? – Tobias

+0

可能......我非常想法,对不起。 – kazemakase

+0

对于测试,我可以问你正在使用哪个版本的python,scikit-learn和python?也许我可以这样想。 – Tobias