如何指定scikit-learn的朴素贝叶斯的先验概率

时间:2015-06-17 15:45:17

标签: python syntax machine-learning scikit-learn

我正在使用scikit-learn机器学习库(Python)进行机器学习项目。我正在使用的算法之一是高斯朴素贝叶斯实现。 GaussianNB()函数的一个属性如下:

class_prior_ : array, shape (n_classes,)

我想先手动更改类,因为我使用的数据非常偏斜,其中一个类的调用非常重要。通过为该类分配较高的先验概率,召回应该增加。

但是,我无法弄清楚如何正确设置属性。我已经阅读了以下主题,但他们的答案对我不起作用。

How can the prior probabilities manually set for the Naive Bayes clf in scikit-learn?

How do I know what prior's I'm giving to sci-kit learn? (Naive-bayes classifiers.)

这是我的代码:

gnb = GaussianNB()
gnb.class_prior_ = [0.1, 0.9]
gnb.fit(data.XTrain, yTrain)
yPredicted = gnb.predict(data.XTest)

我认为这是正确的语法,我可以通过播放值找出哪个类属于数组中的哪个位置,但结果保持不变。也没有给出任何错误。

从scikit-learn库设置 GaussianNB 算法属性的正确方法是什么?

Link to the scikit documentation of GaussianNB

2 个答案:

答案 0 :(得分:10)

@Jianxun Li:实际上有一种方法可以在GaussianNB中设置先验概率。它被称为“先锋”。并且它可用作参数。见文档: "参数:priors:array-like,shape(n_classes,)     类的先验概率。如果指定,则不根据数据调整先验。" 那么,让我举个例子:

from sklearn.naive_bayes import GaussianNB
# minimal dataset
X = [[1, 0], [1, 0], [0, 1]]
y = [0, 0, 1]
# use empirical prior, learned from y
mn = GaussianNB()
print mn.fit(X,y).predict([1,1])
print mn.class_prior_

>>>[0]
>>>[ 0.66666667  0.33333333]

但是如果你改变了先前的概率,它会给出一个不同的答案,这就是我所相信的。

# use custom prior to make 1 more likely
mn = GaussianNB(priors=[0.1, 0.9])
mn.fit(X,y).predict([1,1])
>>>>array([1])

答案 1 :(得分:9)

在scikit-learn中实现的GaussianNB()不允许您先设置类。如果您阅读在线文档,则会看到.class_prior_是属性而不是参数。一旦适合GaussianNB(),就可以访问class_prior_属性。它的计算方法是简单计算训练样本中不同标签的数量。

from sklearn.datasets import make_classification
from sklearn.naive_bayes import GaussianNB


# simulate data with unbalanced weights
X, y = make_classification(n_samples=1000, weights=[0.1, 0.9])
# your GNB estimator
gnb = GaussianNB()
gnb.fit(X, y)

gnb.class_prior_
Out[168]: array([ 0.105,  0.895])

gnb.get_params()
Out[169]: {}

您认为估算工具足够聪明,可以考虑不平衡的重量问题。因此,您不必手动指定先验。