多项朴素贝叶斯参数alpha设置? scikit-learn

问题描述 投票:8回答:2

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

例如我首先使用词袋来构建特征矩阵,矩阵的每个单元都是词数,然后使用tf(词频)对矩阵进行归一化。

但是当我使用朴素贝叶斯模型建立分类器模型时,我选择使用多项式N.B(我认为这是正确的,而不是Bernoulli和Gaussian)。默认Alpha设置为1.0(文档说这是Laplace平滑,我不知道是什么。)

结果是非常糟糕的,就像只有21%的人回想找到肯定类别(目标类别)一样。但是当我将alpha设置为0.0001(我随机选择)时,结果获得了95%的回忆率。

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

我还测试了结果,不使用tf,仅使用了数袋单词,结果也是95%,所以,有人知道如何设置alpha值吗?因为我必须使用tf作为特征矩阵。

谢谢。

python scikit-learn classification naivebayes
2个回答
9
投票

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


0
投票

在这里,我只补充为什么要使用alpha?

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

因此,要找出所有这些在训练时的概率(https://en.wikipedia.org/wiki/Naive_Bayes_classifier)P(w1 | Y = 1)* P(w2 | Y = 1)* ..... P(wd | Y = 1))* P(Y = 1)

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

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

P(W |Y=1) = P(W,Y = 1)/ P(Y = 1)=出现w'个单词且Y = 1的训练点数/ Y = 1的训练点数= 0 /训练点数,其中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

© www.soinside.com 2019 - 2024. All rights reserved.