Python贝叶斯文本分类模型从原理到实现

上传人:飞*** 文档编号:51023556 上传时间:2018-08-12 格式:PDF 页数:8 大小:78.14KB
返回 下载 相关 举报
Python贝叶斯文本分类模型从原理到实现_第1页
第1页 / 共8页
Python贝叶斯文本分类模型从原理到实现_第2页
第2页 / 共8页
Python贝叶斯文本分类模型从原理到实现_第3页
第3页 / 共8页
Python贝叶斯文本分类模型从原理到实现_第4页
第4页 / 共8页
Python贝叶斯文本分类模型从原理到实现_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《Python贝叶斯文本分类模型从原理到实现》由会员分享,可在线阅读,更多相关《Python贝叶斯文本分类模型从原理到实现(8页珍藏版)》请在金锄头文库上搜索。

1、Python贝叶斯文本分类模型从原理到实现朴素贝叶斯分类器是一种有监督学习,常见有两种模型, 多项式模型 (multinomial model)即为词频型和伯努利模型(Bernoulli model) 即文档型。二者的计算粒度不一样,多项式模型以单词为粒度, 伯努利模型以文件为粒度,因此二者的先验概率和类条件概率的计算方法都不同。计算后验概率时,对于一个文档d,多项式模型中,只有在d 中出现过的单词,才会参与后验概率计算,伯努利模型中,没有在d 中出现, 但是在全局单词表中出现的单词,也会参与计算,不过是作为“反方”参与的 (避免消除测试文档时类条件概率中有为0 现象而做的取对数等问题) 。一

2、、数据集数据集是有8 个分类的文本数据集,使用了结巴分词对每个文本分词,每个单词当作特征,再利用二元词串构造更多特征,然后去掉停用词,去掉出现次数太多和太少的特征,得到了 19630 个特征。取1998 个样本用于训练,509 个用于测试。基于词袋模型的思路将每个文本转换为向量,训练集和测试集分别转换为矩阵,并用python numpy模块将其保存为npy 格式。数据集共使用了19630 个单词作为特征,特征值是词在文本中出现的次数。8 个 分类,分别是1、2、.、8。训练集共1998 个样本,测试集共509 个样本。二、朴素贝叶斯分类器划分邮件算法朴素贝叶斯分类器,基于贝叶斯定理,是一个表现

3、良好的分类方法。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

4、的先验概率,这里: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)

5、/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)

6、= 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(

7、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 封被标识的邮件作为训练集,训练集一般是人工标识,分为“垃圾邮件”、

8、“正常邮件”。注意,训练集不宜人为地从大量邮件中有意挑拣,而应随机挑拣。然后我们从邮件中选取特征,例如我们把单词 “购买” 是否出现在邮件中看作是该邮件的一个特征,训练时候应该记录含有单词“购买”的垃圾邮件有多少封,含有单词“购买”的正常邮件有多少封,按照这个思路,我们得到以下表格:特征词统计正常邮件垃圾邮件汇总“购买”10 50 60 “淘宝”8 56 64 “开心”60 3 63 “编程”20 15 35 汇总98 124 222 好了,现在有一封邮件需要分类,假设它有购买、淘宝、开心、编程四个特征,那么其属于正常邮件的可能性是:10/98 * 8/98 * 60/98 * 20/98 *

9、 98/222= 0.000459 属于垃圾邮件的可能性是:50/124 * 56/124 * 3/124 * 15/124 * 124/222= 0.00029768 结果是该邮件更有可能是正常邮件。如果邮件只有有开心和编程两个特征,那么其属于正常邮件的可能性是:60/98 * 20/98 * 98/222= 0.0551571 属于垃圾邮件的可能性是:3/124 * 15/124 * 124/222= 0.0016346992153443768 结果是该邮件更有可能是正常邮件。3、让分类器更合理如果我们的统计结果是这样的:特征词统计正常邮件垃圾邮件汇总(求和)“购买”10 50 60 “淘

10、宝”8 56 64 “开心”63 0 63 “编程”20 15 35 汇总 (求和 ) 101 121 222 具有特征开心的垃圾邮件有0 封。如果某封邮件具有购买、淘宝、开心这三个特征,按照上面的思路,该邮件属于正常邮件的可能性是:10/101 * 8/101 * 63/101 * 101/222= 0.00222553 属于垃圾邮件的可能性是:50/121 * 56/121 * 0/121 * 121/222= 0 这意味着,只要邮件里有 “开心”, 那么它就不是垃圾邮件(属于垃圾邮件的可能性为0) ,这显然是不合理的。对此,我们可以对P(F1|C)(以及 P(F2|C)、P(F3|C)等

11、)做如下处理(加权平均):P2(F1|C) = (1*0.5 + sum(F1)*P(F1|C) / (1 + sum(F1) = (0.5 + sum(F1)*P(F1|C) / (1 + sum(F1) 其中,若F1 是开心,那么sum(F1) = 63+0 = 63。于是,属于正常邮件的可能性是:(0.5 + 10/101 * 60) / 61) * (0.5 + 8/101 * 64) / 65) * (0.5 + 63/101 * 63) / 64) * 101/222 =0.0025593104680632236 属于垃圾邮件的可能性是:(0.5 + 50/121 * 60) /

12、61) * (0.5 + 56/121 * 64) / 65) * (0.5 + 0/121 * 63) / 64) * 121/222 = 0.0008181611103439531 这封邮件还是倾向于正常邮件,不过计算方式更合理了。另外我们也可以通过取对数的方式进行优化。这样更合理,因为对数的相乘可以变成相加。4、如何由计算结果判断类别如果计算出一封邮件属于正常邮件的概率是0.05,属于垃圾邮件的概率是0.006,基本可以肯定这是一封正常邮件。不过, 如果一封邮件属于正常邮件的概率是0.05,属于垃圾邮件的概率是0.049,那么这封邮件是否该划分为垃圾邮件?也许在这个时候就要在训练之后再填

13、上一个分类了不确定分类。首先,设定一个阈值T(大于 1) ,待标注数据D,两个分类C0和 C1,如果:P(C0|D) / P(C1|D) T 那么, D 属于类别C0。如果:P(C1|D) / P(C0|D) T 那么, D 属于类别C1。5、如果有多个类别对于朴素贝叶斯分类器而言,多个分类和二分类没什么差别,就是训练的时候多加个分类而已。三、贝叶斯模型实现朴素贝叶斯的三个常用模型:高斯、多项式、伯努利朴素贝叶斯的基本若一个样本有n 个特征,分别用x1,x2,xn 表示,将其划分到类yk 的可能性P(yk|x1,x2, , ,xn)为:P(yk|x1,x2, , ,xn)=P(x1|yk)*P

14、(x2|yk) *P(xn|yk)*P(yk) 上式中等号右侧的各个值可以通过训练得到。根据上面的公式可以求的某个数据属于各个分类的可能性(这些可能性之和不一定是1) ,该数据应该属于具有最大可能性的分类中。一般来说,如果一个样本没有特征xi,那么P(xi|yk) 将不参与计算。不过下面的伯努利模型除外。高斯模型有些特征可能是连续型变量,比如说人的身高,物体的长度,这些特征可以转换成离散型的值, 比如如果身高在160cm 以下, 特征值为1;在 160cm 和 170cm 之间,特征值为2;在 170cm 之上, 特征值为3。也可以这样转换,将身高转换为3 个特征, 分别是 f1、f2、f3,

15、如果身高是160cm 以下,这三个特征的值分别是1、0、 0,若身高在170cm 之上,这三个特征的值分别是0、0、1。不过这些方式都不够细腻,高斯模型可以解决这个问题。高斯模型假设这些一个特征的所有属于某个类别的观测值符合高斯分布(正态分布 ),也就是:下面看一个sklearn 中的示例 :(需要安装sklearn 包) from sklearn import datasets iris = datasets.load_iris() iris.feature_names # 四个特征的名字sepal length (cm), sepal width (cm), petal length (c

16、m), petal width (cm) iris.data array( 5.1, 3.5, 1.4, 0.2, 4.9, 3. , 1.4, 0.2, 4.7, 3.2, 1.3, 0.2, 4.6, 3.1, 1.5, 0.2, 5. , 3.6, 1.4, 0.2, 5.4, 3.9, 1.7, 0.4, 4.6, 3.4, 1.4, 0.3, 5. , 3.4, 1.5, 0.2, 6.5, 3. , 5.2, 2. , 6.2, 3.4, 5.4, 2.3, 5.9, 3. , 5.1, 1.8) # 类型是 numpy.array iris.data.size 600 #共 600/4=150 个样本 iris.target_names array(setosa, versicolor, virginica, dtype=|S10) iris.target array(0

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号