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

11

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

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

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

结果非常糟糕,只有21%的召回率才能找到正类(目标类)。但是当我将alpha设置为0.0001(我随机选择的)时,结果得到95%的召回分数。

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

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

你能分享一下当召回率达到95%时所获得的精度吗? - shanmuga
你有没有看过 http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.MultinomialNB.html ? - James Tobin
@shanmuga,我在另一个数据集上进行了实验,使用tf,alpha = 1.0,'positive'的召回率为0.11,'positive'的精确度为1.00(奇怪吗?)。然后我将alpha设置为0.0001,tf,'positive'的召回率和精确度都为1.00。之后,我删除了tf,只使用单词计数作为特征,并将alpha设置为1.0,'positive'的召回率为0.98,'positive'的精确度为0.97。我使用的数据集中,负面情感有4243个实例,正面情感有900个实例。 - HAO CHEN
@JamesTobin,是的,我查了一下网上的资料,实际上,像tf-idf这样的分数计算方法也可能有效。至于如何设置alpha值,没有其他参考资料。 - HAO CHEN
3个回答

11
在多项式朴素贝叶斯中,alpha参数是所谓的超参数,即控制模型形式的参数。在大多数情况下,确定超参数最佳值的最佳方法是通过网格搜索来搜索可能的参数值,并使用交叉验证来评估每个值上模型在您的数据上的性能。有关如何使用scikit-learn执行此操作的详细信息,请阅读上述链接。

谢谢,这是一个很好的调整alpha值的方法 @jakevdp。您能否多说一点关于参数和超参数之间的区别?干杯 - HAO CHEN
1
超参数是定义模型的参数,必须在模型看到任何数据之前选择(例如,在初始化时设置“alpha”)。另一方面,正常的模型参数是自由浮动的,并通过将模型拟合到数据来设置。一个有用的思考方式是,超参数定义了模型:因此,在某些意义上,“alpha=1”的“MultinomialNB”和“alpha=2”的“MultinomialNB”实际上应该被认为是根本不同的模型。 - jakevdp
为了测试不同的超参数alpha的结果,我们应该考虑哪些值?就像在KNN中,我们可以取[3, 15, 25, 51, 101]这样的值。 - Dipen Gajjar

5

为什么要使用alpha?

对于在NB P(Y=1|W)或P(Y=0|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)。

现在在测试时,假设你遇到了一个未出现在训练集中的单词,那么它在类中存在的概率为零,这将使整个概率为零,这是不好的。

考虑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

为了解决这个问题,我们进行Laplace平滑处理。我们在分子和分母字段中加入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))如果分子和分母字段很小,意味着它很容易受到异常值或噪声的影响。α也可以帮助,因为随着α的增加,我的似然概率会移动到均匀分布。

因此,α是超参数,您需要使用诸如网格搜索(由jakevdp提到)或随机搜索等技术进行调整。(https://towardsdatascience.com/hyperparameter-tuning-c5619e7e6624)


0

在自动化超参数时,最好使用Gridsearchcv或RandomSearchcv(如果使用低规格模型,则使用此方法),这适用于MultinomialNB中的alpha。

操作步骤如下:

 model=MultinomialNB()
 param={'alpha': [0.00001, 0.0001, 0.001, 0.1, 1, 10, 100,1000]}
    
 clf=GridSearchCV(model,param,scoring='roc_auc',cv=10,return_train_score=True)  
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接