贝叶斯分类算法是统计学的一种分类方法,它是一类利用概率统计知识进行分类的算法。
- 优点:在数据较少的情况下仍然有效,可以处理多类别问题。
- 缺点:对于输入数据的准备方式较为敏感。
- 适用数据类型:标称型数据
假设有一数据集,由两类数据组成,数据有两个属性x,y。现在用p1(x,y)
,p2(x,y)
分别表示数据点(x,y)
属于类别1和类别2的概率。那么可以用下面的规则来判断它的类别:
- p1(x,y) > p2(x,y),那么类别为1
- p1(x,y) < p2(x,y),那么类别为2
原理
首先,由条件概率可以,有以下推导:
1 | 已知p(x|c),求p(c|x),c代表属性向量 |
在对待分类数据进行分类时,p(x)
是相同的,故可以不考虑。现在的关键问题是如何计算p(x|c)p(c)
,这就需要用到贝叶斯假设了,贝叶斯假设x中每个属性都是独立的,则:
1 | p(x|c)p(c) = p(x1|c)p(c)p(x2|c)p(c)...p(xn|c)p(c) |
使用python进行文本分类
可以使用文本中的词条作为文本的特征来进行分类,这里为了方便,暂时不处理中文
数据处理
1 | def loadDataSet(): |
训练算法
由上面的贝叶斯原理,得到代码如下:
1 | def trainNB0(trainMatrix,trainCategory): |
有两处特殊处理:
- 将每个词的出现次数初始化为,这是为了防止计算
p(x1|c)p(x2|c)...p(xn|c)
的时候为0 - 求条件概率的时候转为了对数,这是为了防止
p(x1|c)p(x2|c)...p(xn|c)
得到很小的数最后四舍五入为0
最后得到分类函数,很简单:
1 | def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1): |
测试:
1 | ... |
文档词袋模型
上面将每个词的出现与否作为一个特征,称为词集模型。如果将词的出现频率作为特征,则称为词袋模型。
下面是词袋模型:
1 | def bagOfWords2VecMN(vocabList, inputSet): |
示例:使用朴素贝叶斯过滤垃圾邮件
数据
1 |
|
分类器构建及测试
1 | def spamTest(): |
运行,得到如下结果:1
2
3classification error ['home', 'based', 'business', 'opportunity', 'knocking', 'your', 'door', 'don', 'rude', 'and', 'let', 'this', 'chance', 'you', 'can', 'earn', 'great', 'income', 'and', 'find', 'your', 'financial', 'life', 'transformed', 'learn', 'more', 'here', 'your', 'success', 'work', 'from', 'home', 'finder', 'experts']
true class is: spam
the error rate is: 0.1
将垃圾邮件误分为正常邮件,这种错误比将正常邮件分为垃圾邮件要可以接受。后面将会介绍如何修正分类器。
小结
贝叶斯分类基于独立性假设来构建,尽管并不正确,但是其仍然是一种有效的分类器。
实际使用时需要处理溢出等问题,可以通过取对数来解决。
词袋模型在解决文档分类问题上比词集模型有所提高。
可以通过移除停用词来进一步优化。