Python贝叶斯文本分类模型从原理到实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Python贝叶斯文本分类模型从原理到实现
朴素贝叶斯分类器是一种有监督学习,常见有两种模型,多项式模型(multinomial model)即为词频型和伯努利模型(Bernoulli model)即文档型。二者的计算粒度不一样,多项式模型以单词为粒度,伯努利模型以文件为粒度,因此二者的先验概率和类条件概率的计算方法都不同。计算后验概率时,对于一个文档d,多项式模型中,只有在d中出现过的单词,才会参与后验概率计算,伯努利模型中,没有在d中出现,但是在全局单词表中出现的单词,也会参与计算,不过是作为“反方”参与的(避免消除测试文档时类条件概率中有为0现象而做的取对数等问题)。
一、数据集
数据集是有8个分类的文本数据集,使用了结巴分词对每个文本分词,每个单词当作特征,再利用二元词串构造更多特征,然后去掉停用词,去掉出现次数太多和太少的特征,得到了19630个特征。取1998个样本用于训练,509个用于测试。基于词袋模型的思路将每个文本转换为向量,训练集和测试集分别转换为矩阵,并用python numpy模块将其保存为npy格式。数据集共使用了19630个单词作为特征,特征值是词在文本中出现的次数。8个分类,分别是1、2、...、8。训练集共1998个样本,测试集共509个样本。
二、朴素贝叶斯分类器划分邮件算法
朴素贝叶斯分类器,基于贝叶斯定理,是一个表现良好的分类方法。
1、公式原理推导
主要根据事件间的相互影响进行公式推断。
1.1、条件概率:
P(A|B) = P(A,B)/P(B)
A和B是随机事件,P(A|B)也就是在事件B发生的前提下事件A发生的概率。P(A,B)表示A、B都发生的概率。
这样一来,我们可以通过统计结果计算条件概率。例如假设有1000封邮件,垃圾邮件有300封,出现单词购买的邮件为50封,而即是垃圾邮件又同时出现了购买这个单词的邮件共有20封。如果把垃圾邮件看成事件A,邮件里出现单词购买看成事件B,那么P(A)是指垃圾邮件出现的概率,因为没考虑其他的因素对A的影响,也可以将P(A)看做A的先验概率,这里:
P(A) = 300/1000 = 0.3
同理,
P(B) = 50/1000 = 0.05
P(A,B)是指A和B同时发生的概率,
P(A,B) = 20/1000 = 0.02
根据条件概率的公式,能够得到
P(A|B) = 0.02 / 0.05 = 0.4
因为有B的影响,P(A|B)也叫做A的后验概率。
1.2、相互独立事件
如果事件A和B是相互独立的,代表着A发生的可能性对B发生的可能性没有影响,B也对A没有影响,在这种情况下:P(A,B) = P(A)*P(B)。
既然A和B之间没有相互影响,那么:
P(A|B) = P(A,B)/P(B) = P(A)
P(B|A) = P(A,B)/P(A) = P(B)
1.3、贝叶斯定理
由P(A|B) = P(A,B)/P(B)很容易推出:P(A|B) = P(B|A)*P(A)/P(B)
这也就是贝叶斯公式了。
1.4、朴素贝叶斯分类器(naive Bayes classifier)
首先有以下定理:
如果B、C相互独立,那么P(B|C,A) = P(B|A)。
设有事件A、B1、B2,那么在B1、B2同时发生的前提下,A发生的概率是:P(A|B1,B2) = P(B1,B2|A)*P(A) / P(B1,B2)
如果B1和B2相互独立,那么有
P(B1,B2|A) = P(B1|B2,A)*P(B2|A)= P(B1|A)*P(B2|A)
于是,
P(A|B1,B2) = P(B1,B2|A)*P(A) / P(B1,B2)
= P(B1|A)*P(B2|A)*P(A) / P(B1,B2)
根据实际需求,假设某个体有n项特征(可以看着邮件中出现的词语),分别为F1、F2、…、Fn。现有m个类别(可以看着邮件的分类),分别为C1、C2、…、Cm。贝叶斯分类器就是计算出概率最大的那个分类,也就是求下面这个算式的最大值(即算出每个分类的概率,以最大概率为最终分类):
P(C|F1,F2,...,Fn)= P(F1,F2,...,Fn|C)*P(C) / P(F1,F2,...,Fn)
由于P(F1,F2,...,Fn)对于所有的类别都是相同的,可以省略,问题就变成了求P(F1,F2,...,Fn|C)*P(C)的最大值。
朴素贝叶斯分类器则是更进一步,假设所有特征都彼此独立,因此
P(F1,F2,...,Fn|C)*P(C)= P(F1|C)*P(F2|C)* ... *P(Fn|C)*P(C)
朴素贝叶斯分类器假设所有特征都彼此独立存在一定的不合理性,不过该分类器一般能取得很好的分类效果。
2、判断邮件是否为垃圾邮件
假定我们现在有1000封被标识的邮件作为训练集,训练集一般是人工标识,分为“垃圾邮件”、“正常邮件”。注意,训练集不宜人为地从大量邮件中有意挑拣,而应随机挑拣。然后我们从邮件中选取特征,例如我们把单词“购买”是否出现在邮件中看作是该邮件的一个特征,训练时候应该记录含有单词“购买”的垃圾邮件有多少封,含有单词“购买”的正常邮件有多少封,按照这个思路,我们得到以下表格:
特征词统计正常邮件垃圾邮件汇总
“购买”10 50 60
“淘宝”8 56 64
“开心”60 3 63
“编程”20 15 35
汇总98 124 222
好了,现在有一封邮件需要分类,假设它有购买、淘宝、开心、编程四个特征,那么其属于正常邮件的可能性是: