多项朴素贝叶斯参数alpha设置? scikit学习

时间:2015-11-20 15:59:14

标签: python scikit-learn classification naivebayes

在进行朴素贝叶斯分类时,有没有人知道如何设置alpha的参数?

E.g。我首先使用了一些单词来构建特征矩阵,矩阵的每个单元格都是单词的数量,然后我使用tf(术语频率)对矩阵进行归一化。

但是当我使用朴素贝叶斯构建分类器模型时,我选择使用多项N.B(我认为这是正确的,而不是伯努利和高斯)。默认的alpha设置是1.0(文档说拉普拉斯平滑,我不知道是什么)。

结果非常糟糕,就像只有21%的人回忆起找到积极的类(目标类)。但是当我设置alpha = 0.0001(我随机选择)时,结果得到95%的回忆分数。

此外,我检查了多项NB formula,我认为这是因为alpha问题,因为如果我使用单词计数作为特征,则alpha = 1不会影响结果,但是,由于tf在0-1之间,因此α= 1确实会影响该公式的结果。

我也测试过结果不使用tf,只使用了一堆字数,结果也是95%,那么,有没有人知道如何设置alpha值?因为我必须使用tf作为特征矩阵。

感谢。

2 个答案:

答案 0 :(得分:8)

在Multinomial朴素贝叶斯中,alpha参数就是所谓的hyperparameter;即控制模型本身形式的参数。在大多数情况下,确定超参数最佳值的最佳方法是通过grid search可能的参数值,使用cross validation评估模型在每个值上的数据性能。请阅读以上链接,了解有关如何使用scikit-learn执行此操作的详细信息。

答案 1 :(得分:0)

为什么使用alpha?

用于在NB P(Y = 1 | W)或P(Y = 0 | W)中对查询点进行分类(考虑二进制分类) 这里W是单词W的向量W = [w1,w2,w3 .... wd] d =功能数量

因此,要找出所有这些在训练时的概率
P(w1 | Y = 1)* P(w2 | Y = 1)* ..... P(wd | Y = 1))* P(Y = 1)

对于Y = 0,应执行相同的操作。

有关朴素贝叶斯公式,请参考此(https://en.wikipedia.org/wiki/Naive_Bayes_classifier

现在在测试时,请考虑您遇到的单词在训练集中不存在,那么它在一个类中的存在概率为零,这会使整个概率为0,这不是很好。

考虑在训练集中不存在W *单词

P(W * | Y = 1)= P(W *,Y = 1)/ P(Y = 1)

      = Number of training points such that w* word present and Y=1 / Number of training point where Y=1
      = 0/Number of training point where Y=1

因此,要摆脱此问题,我们进行拉普拉斯平滑。 我们在分子和分母字段中添加alpha。

     = 0 + alpha / Number of training point where Y=1 + (Number of class labels in classifier * alpha)
  1. 它发生在现实世界中,在上面的公式(P(W |Y=1) = P(W,Y = 1)/ P(Y = 1)中,某些单词出现的时间很少,发生的次数更多,或者以不同的方式思考))如果分子和分母字段较小,则很容易受到离群值或噪声的影响。在这里,alpha也会有所帮助,因为随着alpha的增加,我的可能性概率将移动到均匀分布。

因此alpha是超参数,您必须使用网格搜索(如jakevdp所述)或随机搜索等技术对其进行调整。 (https://towardsdatascience.com/hyperparameter-tuning-c5619e7e6624