vlambda博客
学习文章列表

通俗易懂-朴素贝叶斯

朴素贝叶斯

茶谈大数据

朴素贝叶斯分类器是基于贝叶斯原理和特征条件独立假设的概率分类器。


两个假设


)假设特征之间相互独立

2)   假设特征之间同等重要

优缺点


优点:

1)对于少量的训练集数据也有效

2)可以运用于多类别预测

缺点:

1)若测试集中一个类别没有出现在训练集中,有可能出现0的概率

2)独立假设过于理想,在现实生活中不太可行


朴素贝叶斯原理


贝叶斯原理源于“逆向概率”,“逆向概率”对应的是“正向概率”,所谓的正向概率就是假设一个黑袋子里有4个白球,6个黑球,你摸到黑球的概率是3/5,这就是正向概率;逆向概率就是你不知道黑袋子的黑白球概率,根据摸出的球去计算摸到黑球/白球的概率。举个通俗的例子,如果你看到一个人总在花钱,那你多半会推测他是一个有钱人。也就是说,当你不能准确判断一个事物的本质的时候,可以依靠事物本质相关的事件来进行判断。


    贝叶斯定理是关于随机事件 A 和 B 的条件概率:

    其中P(A|B)是在 B 发生的情况下 A 发生的可能性。

    在贝叶斯定理中,每个名词都有约定俗成的名称:

1)P(A)是 A 的先验概率,之所以称为“先验”是因为它不考虑任何 B 方面的因素。

2)P(A|B)是已知 B 发生后 A 的条件概率,也由于得自 B 的取值而被称作 A 的后验概率。

3)P(B|A)是已知 A 发生后 B 的条件概率,也由于得自 A 的取值而被称作 B 的后验概率。

4)P(B)是 B 的先验概率,也作标淮化常量(normalizing constant)。

按这些术语,贝叶斯定理可表述为:

后验概率 = (相似度 * 先验概率)/标淮化常量

也就是说,后验概率与先验概率和相似度的乘积成正比。

另外,比例P(B|A)/P(B)也有时被称作标淮相似度(standardised likelihood),Bayes定理可表述为:

后验概率 = 标淮相似度 * 先验概率

通常,事件 A 在事件 B 发生的条件下的概率,与事件 B 在事件 A 发生的条件下的概率是不一样的;然而,这两者是有确定关系的,贝叶斯定理就是这种关系的陈述。

条件概率就是事件 A 在另外一个事件 B 已经发生条件下的发生概率。条件概率表示为P(A|B),读作“在 B 发生的条件下 A 发生的概率”。

联合概率表示两个事件共同发生(数学概念上的交集)的概率。A 与 B 的联合概率表示为



朴素贝叶斯模型


朴素贝叶斯模型有两种类型的概率组成:

1)每个类别的概率

2)每个属性的条件概率

类别概率也就是说,我有7个球,红球4个,白球3个,抽到白球的概率是3/7,红球的概率是4/7,这就是类别概率

属性概率也就是说,将7个球放到两个盒子中,A盒2红1白,B盒2红2白,在A盒抽到白球的概率是1/3,在B盒抽到的白球概率是1/2,这就是属性概率。


朴素贝叶斯分类算法


1、高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布,比如人的身高

2、多项式朴素贝叶斯:特征变量是离散变量,符合多项分布,在文档分类中,特征变量是词频

3、伯努力朴素贝叶斯:特征变量是布尔变量,符合0/1分布,在文档分类中特征是单词是否出现

python实例--糖尿病预测


#导入包import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport matplotlib matplotlib.rcParams['font.sans-serif'] = ['SimHei']matplotlib.rcParams['font.family']='sans-serif' matplotlib.rcParams['axes.unicode_minus'] = False
#数据预处理data = pd.read_csv('./糖尿病.csv',encoding='gbk')data.head()

可以看到,这些数据符合0-1分布,但需要做一下转换。也就是特征编码:

  • Yes为1 No为0

  • Male 1 Female 0

  • Positive 1 Negative 0

for i,j in enumerate(data["Gender"]): if j == 'Male': data['Gender'].iloc[i]= 1 else: data['Gender'].iloc[i]= 0data = data.replace('No',0)data = data.replace('Yes',1)
data = data.replace("Positive",1)data = data.replace("Negative",0)
#利用伯努力朴素贝叶斯进行预测from sklearn.naive_bayes import BernoulliNBfrom sklearn.model_selection import train_test_split
#划分数据集X_train,X_test,y_train,y_test = train_test_split(data.iloc[:,:16],data.iloc[:,16],test_size=0.3)nb = BernoulliNB()nb.fit(X_train,y_train)print("模型得分{:.3f}".format(nb.score(X_test,y_test)))