python sklearn 朴素贝叶斯分类

Posted

tags:

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

参考技术A 朴素贝叶斯分类器(Naïve Bayes classifier)是一种相当简单常见但是又相当有效的分类算法,在监督学习领域有着很重要的应用。这个算法叫做Naïve Bayes,但是它到底naive(朴素)在哪里呢?朴素贝叶斯分类器采用了“属性条件独立假设”(attribute conditional independent assumption),用通俗的话来讲,就是一个属性,或者是我们所说的特征,相互之间是独立的;也正是有了这个假设,朴素贝叶斯分类器才能做这么多事情,在监督学习的世界里有着这么广泛的应用

简单来说:基于概率思想的简单有效的分类模型。

参考资料:
https://scikit-learn.org/stable/user_guide.html
https://scikit-learn.org/stable/modules/naive_bayes.html
https://zhuanlan.zhihu.com/p/26055646
https://zhuanlan.zhihu.com/p/26262151
https://blog.csdn.net/YangWei_19/article/details/79971257

举个例子:西瓜书里面,有好多不同属性的西瓜。我们从一片瓜地里做出的大量西瓜得出数据

买瓜的阿姨挑了一个,发现是 花条纹清晰、敲击清脆、瓜蒂枯老,(可能这个混合还是样本9999中没出现的组合类型) 请问这个瓜甜/不甜的概率 ?

假设花条纹、敲击声音、瓜蒂鲜嫩度之间是无关的属性(朴素),利用贝叶斯概率公式,我们可以得到某些熟悉出现的概率。
对于未出现的组合属性,有拉普拉斯平滑估算后验概率。

朴素贝叶斯分类算法的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值对模型效果的影响

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

sklearn-朴素贝叶斯

利用sklearn进行朴素贝叶斯分类

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

Sklearn 中的朴素贝叶斯分类器

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

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