贝叶斯最优分类器,python贝叶斯算法
本文的主要目的是让读者更深入地学习数据挖掘和分析技术,同时进一步熟悉Python数据分析的基本流程,加深对Python编程的掌握。
贝叶斯理论介绍
在概率和统计学领域,贝叶斯理论基于对某一事件证据的认识来预测该时间事件的发生概率。 例如,如果癌症和年龄相关,在考虑年龄影响的基础上,预测癌症概率的精度比不考虑年龄的精度更高。 贝叶斯理论的表达式如下。
A、b是事件,且p(b0
p(a )和p(a )是独立观察事件a、b发生概率
p(a|b )是有条件的概率,即b事件发生时,a事件发生的概率
p(b|a )是有条件的概率,即a事件发生时,b事件发生的概率
假设药品测试灵敏度为99%,准确率为99%。 也就是说使用药品的话,有99%的可能性,检查结果是阳性。如果没有用药的话,有99%的可能性,测试结果是阴性。 现在随机抽取一个人,问一下检查结果阳性,用药的可能性有多大。
该结果与直觉差异较大,计算结果表明,随机抽取一人进行用药测试,即使结果阳性,无用药的可能性也大于用药的可能性。
在机器学习领域,朴素贝叶斯分类器是一种基于贝叶斯理论,假设各特征相互独立的分类方法。 在朴素贝叶斯模型中构建分类器的基本方法是表示使用特征向量的内容,并为这些实体赋予表示其类别的标签。 的所有朴素贝叶斯分类器都假设一个特征的值和另一个特征的值相互独立。 例如,形状为圆形,直径为5cm左右,颜色为红色,被分类为苹果的水果。 在对贝叶斯分类时,将该水果判别为苹果时,只考虑这些特征对分类概率的影响,而不考虑形状、颜色、直径等特征之间的相关性。 贝叶斯分类器可以通过监控式学习的方式非常有效地训练。
贝叶斯分类器的假设条件过于简单,与实际不符。 但是,在大多数情况下,它有很好的性能。这有一个很大的优点,就是可以用较少的训练数据创建分类所需的所有参数。
抽象地说,朴素贝叶斯其实是一个条件概率模型。 给定一个实体,求解该实体属于某一类别的概率。 其实体由长度为n的向量表示,向量的各元素表示一个特征量值(。
用贝叶斯理论计算上式:
观察上式
由于以上表达式对实体来说是常数,因此实体属于类与的大小无关。 使用以前的假设特征量间的独立性和联合概率的计算公式:
根据介绍的各特征值相互独立的概率模型,再加上一个决策规则,就构成了贝叶斯分类器。 决策规则一般是选择最大概率规则来判断对应的类别。 也就是说,实体的所属类别为下式,如果为最大值,则为与k相对应的类别。
用一个例子说明贝叶斯分类器的应用方法。 现在有1000封邮件,其中200封是垃圾邮件,800封是正常的。 现在,一封邮件的特征值是"你好"、"中国"。 假设垃圾邮件中出现“你好”的频率为50,“中国”的频率为1。 在普通的邮件中,“你好”的频率是700,“中国”的频率是80。 分别计算邮件属于普通邮件和垃圾邮件的概率:
p (垃圾邮件| (“你好”、“中国”) ) |垃圾邮件) ) p )“中国”|垃圾邮件) )
50/200*1/200=0.125%。
中,普通邮件的概率计算为8.75%。 普通邮件的概率比垃圾邮件的概率大,基于最大概率规则判断该邮件是普通邮件。
bayes分类器的实现
本节主要介绍如何使用Python实现贝叶斯分类器。 数据集如表所示。
使用文本编辑器创建bayes_classfier.py文件并写入以下代码:
#bayes分类器的源代码
datasets={ ' banana ' : { ' long ' :400,' not_long':100,
' sweet':350、' not_sweet':150、
' yellow':450,' not_yellow':50},
' orange':{'long':0,' not_long':300,
' sweet':150、' not_sweet':150、
' yellow':300,' not_yellow':0},
' other _ fruit ' : { ' long ' :100、' not_long':100、
' sweet':150、' not_sweet':50、
' yellow':50,' not_yellow':150},
}
efcount_total(data ) :
“”计算各种水果的总数
return {'bananas':500 .} ' '
count={}
总数=0
for fruit in data:
#因为各种水果是甜的还是不甜的
可以使用“sweet”和“not”sweet这两个特征的水果数量都统计了各种各样的水果
的总数
count[fruit]=data[fruit]['sweet']
count[fruit]+=data[fruit]['not_sweet']
total=+count[fruit]
return count,total
def cal_base_rates(data):
'''计算各种水果的先验概率(priori probabilities)
return {'banana':0.5...}'''
categories,total=count_total(data)
base_rates={}
for label in categories:
priori_prob=categories[label]/total
base_rates[label]=priori_prob
return base_rates
def likelihood_prob(data):
'''计算各个特征值在已知水果下的概率(likelihood probabilities)
{'banana':{'long:0.8'...}...}'''
count,_=count_total(data)
likelihood={}
for fruit in data:
#创建一个新字典,临时存储各个特征的概率
attr_prob={}
for attr in datasets[fruit]:
#计算各个特征在已知某种水果下的概率
attr_prob[attr]=data[fruit][attr]/count[fruit]
#把某种水果的各个特征的概率放入到likelihood这个字典中
likelihood[fruit]=attr_prob
return likelihood
def evidence_prob(data):
'''虽然各个证据(特征)的概率的概率对分类结果没有影响
主要目的是说明一些基本的概念
return {'long':'50%'}'''
#水果的所有特征
attrs=list(data['banana'].keys())
count,total=count_total(data)
evidence_prob={}
#计算各种特征的概率
for attr in attrs:
attr_total=0
for fruit in data:
attr_total+=data[fruit][attr]
evidence_prob[attr]=attr_total/total
return evidence_prob
class naive_bayes_classifier:
#初始化贝叶斯分类器
def __init__(self,data=datasets):
self._data=datasets
self._labels=[key for key in self._data.keys()]
self._priori_prob=cal_base_rates(self._data)
self._likelihood_prob=likelihood_prob(self._data)
self._evidence_prob=evidence_prob(self._data)
def get_label(self,length,sweetness,color):
#获取某一组特征值的类别
self._attrs=[length,sweetness,color]
res={}
for label in self._labels:
prob=self._priori_prob[label]
for attr in self._attrs:
prob*=self._likelihood_prob[label][attr]/self._evidence_prob[attr]
res[label]=prob
return res
下面使用一些未知类别的数据集,来测试贝叶斯分类器的预测能力。
注意:测试数据集,一定要随机选取,否则不能准确反映bayes分类器的预测能力。
这里使用Python的random模块下的randint来随机生成(0,1) 之间的整数,然后再使用这些随机数生成相应的特征值。使用文本编辑器,建立一个generate_attires.py的文件,写入下面的代码。
import random
def random_attr(pair):
#生成0或1的随机数
return pair[random.randint(0,1)]
def gen_attrs():
#特征值的取值集合
sets=[('long','not long'),('sweet','not sweet'),('yellow','not yellow')]
test_datasets=[]
for i in range(20):
#使用map函数来生成一组特征值
test_datasets.append(list(map(random_attr,sets)))
return test_datasets
随机生成的20组特征值如下,
['long', 'sweet', 'yellow']
['not_long', 'not_sweet', 'not_yellow']
['long', 'sweet', 'yellow']
['not_long', 'sweet', 'yellow']
['long', 'sweet', 'not_yellow']
['not_long', 'sweet', 'not_yellow']
['not_long', 'sweet', 'not_yellow']
['not_long', 'not_sweet', 'not_yellow']
['long', 'not_sweet', 'yellow']
['not_long', 'not_sweet', 'yellow']
['long', 'not_sweet', 'yellow']
['not_long', 'not_sweet', 'not_yellow']
['not_long', 'sweet', 'not_yellow']
['long', 'not_sweet', 'not_yellow']
['not_long', 'sweet', 'not_yellow']
['not_long', 'not_sweet', 'yellow']
['long', 'not_sweet', 'not_yellow']
['not_long', 'not_sweet', 'yellow']
['not_long', 'sweet', 'yellow']
['long', 'sweet', 'not_yellow']
使用贝叶斯分类器来对测试数据集进行分类。使用文本编辑器,建立一个classfication.py的文件,写入下面的代码:
import operator
import bayes
import generate_attrs
def main():
#生成测试数据集
test_datasets=generate_attrs.gen_attrs()
#建立分类器
classfier=bayes.naive_bayes_classifier()
for data in test_datasets:
print('特征值:',end='\t')
print(data)
print('预测结果:',end='\t')
res=classfier.get_label(*data)
print(res)
print('水果类别:',end='\t')
#对后验概率排序,输出概率最大的标签
print(sorted(res.items(),key=operator.itemgetter(1),reverse=True)[0][0])
#导入该模块,并自动运行main函数
if __name__=='__main__':
main()
输出结果如下:
特征值: ['long','sweet', 'yellow']
水果类别: banana
特征值: ['long','not_sweet', 'not_yellow']
水果类别: other_fruit
特征值: ['not_long','sweet', 'not_yellow']
水果类别: other_fruit
特征值: ['not_long','not_sweet', 'yellow']
水果类别: orange
特征值: ['long','not_sweet', 'not_yellow']
水果类别: other_fruit
特征值: ['not_long','sweet', 'yellow']
水果类别: orange
特征值: ['long','not_sweet', 'not_yellow']
水果类别: other_fruit
特征值: ['not_long','not_sweet', 'yellow']
水果类别: orange
特征值: ['long','not_sweet', 'not_yellow']
水果类别: other_fruit
特征值: ['long','not_sweet', 'yellow']
水果类别: banana
特征值: ['not_long','not_sweet', 'yellow']
水果类别: orange
特征值: ['long','not_sweet', 'not_yellow']
水果类别: other_fruit
特征值: ['long','sweet', 'yellow']
水果类别: banana
特征值: ['long','not_sweet', 'yellow']
水果类别: banana
特征值: ['not_long','sweet', 'yellow']
水果类别: orange
特征值: ['not_long','not_sweet', 'yellow']
水果类别: orange
特征值: ['long','sweet', 'not_yellow']
水果类别: other_fruit
特征值: ['long','sweet', 'not_yellow']
水果类别: other_fruit
特征值: ['not_long','not_sweet', 'not_yellow']
水果类别: other_fruit
特征值: ['not_long','not_sweet', 'not_yellow']
水果类别: other_fruit
本节假设读者具备基本的概率知识,如果觉得学习有困难,可以去补习一下概率论方面的基础知识。这里建议读者去选择别的问题实现一个bayes分类器,加深对知识的理解。