朴素贝叶斯分类算法的sklearn实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了朴素贝叶斯分类算法的sklearn实现相关的知识,希望对你有一定的参考价值。

参考技术A 1、背景

《机器学习实战》当中,用python根据贝叶斯公式实现了基本的分类算法。现在来看看用sklearn,如何实现。还拿之前的例子,对帖子的分类。数据如下:

补充:题目的值左边是几个人的评论,右边是评论属于侮辱类(1)、正常类(0),需要进行文本分类,且再有新的文本过来时能自动划分至0或1。

2、分类

(1)算法的准备

通过查看sklearn的训练模型函数,fit(X, Y),发现只需要准备两个参数。一个是数据的矩阵,另一个是数据的分类数组。首先就是将以上的文本转化成矩阵。

在前一章其实已经讲解过如何将文本转化成矩阵。这里将示意的再补充下。

a.首先选取所有的单词,形成列,也可理解为属性。例如:

b.其次将遍历每个文本,填满上述列的值。文本出现过列的次,填一。没有出现过填0。比如第一句就是:my dog has flea problems help please,可表示为:

同理所有的文本都可如此表示,所以就形成了一个数字的矩阵。

(2)beyes模型的选择

在完成数据的准备以后,就可以直接调用sklearn的模型和函数完成模型的训练啦。但在beyes模型的选择的时候发现,beyes下有多个模型可选择,所以这个会让人纠结。接下来共同了解下这些模型:

a.高斯模型(GaussianNB)

高斯模型是对于每个属性的值是连续的,且服从高斯分布时可使用:

比如人的身高,比如花的高度等等。当然你也可将这些数据离散化,比如按等距划分、等频划分成离散的值,但可能效果都没有直接用高斯模型来计算的好。

用法:class sklearn.naive_bayes.GaussianNB

参数:无

b.多项式模型(MultinominalNB)

如果大部分是多元离散值,则采用多项式模型要好些。多项式模型,通常就是构造参数向量,然后通过极大似然估计来寻求参数的最有值。

这里只简单的略列一些公式,具体可查询更多资料。从这个计算过程中可得出,这里引入啦一个平滑先验值alpha,这个值在模型训练的时候也会用到。通常alpha>0,可引入不在训练集的特征,尤其当alpha=1,成为拉普拉丝平滑。具体alpha取值对模型的影响可附件的图。

用法:class sklearn.naive_bayes.MultinomialNB(alpha=1.0,fit_prior=True,class_prior=None) 

参数:

alpha:浮点数,就是上述说的引入平滑的值;

fit_prior:bool值,如果为Ture,则不用去学习P(y=ck),以均匀分布替代,否则则去学习P(y=ck)(不懂)

class_prior:一个数组。它指定了每个分类的先验概率P(y=c1),P(y=c2)…..,若指定了该参数 

则每个分类的先验概率无需学习 (不懂)

c.伯努利模型(BernoulliNB)

如果特征值为二元离散值或是稀疏的多元离散值,则可采用伯努利模型。

公式:class sklearn.naive_bayes.BernoulliNB(alpha=1.0,binarize=0.0,fit_prior=Ture, 

class_prior=None) 

参数:

binarize:一个浮点数或者None,如果为浮点数则以该数值为界,特征值大于它的取1,小于的为0 。如果为None,假定原始数据已经二值化 

其它参数同上。

通过以上的模型对比和分析,由于文本分析转化后是很多二项取值的稀疏矩阵,因此选取伯努利模型效果会更佳。

补充:alpha、binarize值对模型效果的影响

以上是关于朴素贝叶斯分类算法的sklearn实现的主要内容,如果未能解决你的问题,请参考以下文章

python sklearn 朴素贝叶斯分类

朴素贝叶斯(Naive Bayes)及python实现(sklearn)

实战|朴素贝叶斯分类对文档进行分类

Sklearn 中的朴素贝叶斯分类器

基于朴素贝叶斯的乳腺癌数据集分类

实战:朴素贝叶斯对文档进行分类