基于概率论的分类方法——朴素贝叶斯分类器的Python实现

 

 

最近一直在看机器学习相关的书籍和视频,感觉这个东西搭配Python和Java可以做出很多有意思的东西啊!这两天把朴素贝叶斯分类器的理论以及代码差不多搞懂了,该分类器在文本分类(比如过滤垃圾邮件)上得作用尤为显著,优势和缺点都很明显,之前优化本体组的代码时候,带我的(才华横溢的)学姐就用了这个方法进行了本体的分类识别,效果还挺好的,不过继续有待优化,还有很多问题要解决~~~~(>_<)~~~~。

算法优缺点:

优点:在训练集少的情况下仍然有效,可以处理多类别问题

缺点:对于输入数据的准备方式比较敏感。

之前说过了KNN和决策树(ID3)的分类算法,KNN的缺点在于计算量太大,决策树的话,容易造成过度拟合,而通过概率比较的朴素贝叶斯分类,是相比前两者更好的分类算法的选择。

贝叶斯决策理论和核心思想,就是选择具有最高概率的决策。For Example,我看到志玲姐姐,根据她的头发长短,有木有胸、喉结等,判断她是女生的概率大于她是男生的概率。那么我就断定她是女的。这里的头发长短,胸部大小,喉结有无等,都是判断概率大小的因素。

NB_9

再来说说条件概率公式和贝叶斯准则公式,这个后面要用到。

NB_1

NB_4

 

意思是,条件B时 A发生的概率P(A|B)是多少。证明如上图,应该看得懂吧?

接下来是贝叶斯准则公式

NB_5

 

证明如下,用到了上面的条件概率:

NB_6

c为类别,x为向量。意思是,X向量成立的条件下的该事件为c类别的概率是多少(听起来是挺变扭的)。
如果
NB_7大于NB_8

且c只有两个分类,那么x归类到c1.

以上就是理论部分,接下是用朴素贝叶斯对文档进行分类,在用这个分类器的时候,要注意,我们是假设每个特征同等重要,并且特征之间相互独立。那文本举个例子,就是没个词出现的频率不被其他的词语所影响,出现的概率是相同的。

我们需要做以下5个步骤:

    1.收集文本

    2处理文本

    3训练算法

    4测试算法

    5使用算法

1收集文本

我们尽量找区分比较明显的文本,可以自己寻找垃圾邮件作为语料,也可以自己构建(朴素贝叶斯的优势就在于,需要的训练集不是很多),训练一定要精准,否则会导致后续训练出来的分类器不准确哦,在这里我们把文本分成两类(其实可以N多类),一类用1标记,一类用0标记。

2处理文本

2.1分词这里我们采用先分词再去噪音(形容词量词等,无关文章主旨,删除不影响分类)的方式。这里推荐的一个分词工具hanlp 。 Java开发的,很强大,可以识别词性,方便过滤,有其他好用的分词工具欢迎留言推荐~

2.2建立词表

首先,我们需要一个词表,存储所有分词后的语料里出现过的单词,且不重复。
NB_2

2.3建立向量

为每条文本建立向量,向量长度为单词表长度,如果文章中出现了该单词表中的单词,就把该位置的向量记成1(有兴趣的可以研究下是不是要考虑频率,以及会有什么不一样的结果,这里就不多说了),否则就置0。

NB_3

3.训练算法

NB_5

接下来就是建立分类器,根据之前的公式我们可以根据属于ci的文档数除以总文档数算出p(ci),这里用到了朴素贝叶斯假设,之前提到过。假设这里的词都相互独立,那么p(x|ci) =p(x1|ci)p(x2|ci)…p(xn|ci)

我们得到了两个分类中关于每个出现词组的概率,这2个概率用于计算P(x|ci),参考上面的贝叶斯假设。同时我们也得到了分类为c1的概率,分类为c2的概率就是p(1-c1)。,为什么要计算这个概率呢,防止你寻找的训练集的每个分类不够均衡,所以引入了这个参数,做权重调整,如果你是五篇c1类型的文本,五篇c2类型的文本,那概率pAb就是五五开,各0.5。

4.测试算法

其实分类器还有2个问题,第一个是 当向量中有单词的出现概率为0时候,概率乘积为0,这明显不对,为了避免这类异常,我们将初始的文本向量置为1,分母初始化为2。

还有个问题,就是当每个单词的概率都足够小的时候,容易产生“下溢出”,乘积后概率值四舍五入后趋向于0,为了解决这个问题,我们采用对数。根据公式ln(a*b)=ln(a)+ln(b)来放大原来的概率值,结果并不影响。

5.使用算法

不费话了,直接上代码。给一个训练集之外的处理好的语料所对应的向量,判定属于哪一类就行了。

大致就是这样子吧,步骤有点多,不过代码写出来自己断点调试下应该还是看得懂的

 

(完)

By——Snake

snake

作者: snake

我们需要为这个社会做一点贡献,失去了才懂得去珍惜。

《基于概率论的分类方法——朴素贝叶斯分类器的Python实现》有3个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注