学习目标
- 说明条件概率与联合概率
- 说明贝叶斯公式及特征独立的关系
- 记忆贝叶斯公式
-
使用贝叶斯对鸢尾花数据进行分类
%-------------------------------------------------------------------------------------------------------
1、概率定义
- 条件概率:所考虑的事件A已发生的条件下事件B发生的概率p(B|A)
- 我们能根据今天的天气去预测明天的天气,其实隐含的条件就
是在知道今天的天气情况下去预测明天的天气的概率
- 我们能根据今天的天气去预测明天的天气,其实隐含的条件就
- 联合概率:包含多个条件,且所有的条件同时成立的概率。
- 相互独立:如果,则称事件A,B相互独立。
2、案例:判断女神对你的喜欢情况
- 问题如下:
- 1、女神喜欢的概率?
- 2、职业是程序员并且体型匀称的概率?
- 3、在女神喜欢的条件下,职业是程序员的概率?
- 4、在女神喜欢的条件下,职业是程序员,体重超重的概率?
- 计算结果
p(喜欢) = 4/7 (先验概率)
p(程序员,匀称) = 1/7(联合概率)
p(程序员|喜欢) = 2/4 = 1/2(条件概率)
p(程序员,超重|喜欢) = 1/4
- 思考:在小明是产品经理并且体重超重的情况下,如何计算小明被女神
喜欢的概率?
即:p(喜欢|产品,超重) = ?
3、贝叶斯公式
3、1 公式介绍
3.2 案例计算
那么思考题可以套用贝叶斯公式来解决:
p(喜欢|产品,超重) = p(产品,超重|喜欢)P(喜欢)/p(产品,超重)
上式中,
- p(产品,超重|喜欢)和p(产品,超重)的结果均为0,导致无法计算结
果,原因是我们的样本太少了,不具备代表性; - 现实中,肯定存在产品经理是超重的人的,故p(产品,超重)不可能
为0; - 事件“职业是产品经理”和事件“体重超重”通常被认为是相互独立的
事件,但是根据我们的有限的样本计算“p(产品,超重)= p(产品)p(超重)”不成立。
而朴素贝叶斯可以解决这个问题。 - 朴素贝叶斯,简单理解,就是假定了特征与特征之间相互独立的贝
叶斯公式; - 即,朴素贝叶斯,之所以朴素,就在于特征之间相互独立。
按照朴素贝叶斯思路来计算,就可以是
p(产品,超重) = p(产品)p(超重) = 2/7*3/7 = 6/49
p(产品,超重|喜欢) = p(产品|喜欢)*p(超重|喜欢) = 1/2*1/4 = 1/8
p(喜欢|产品,超重) = p(产品,超重|喜欢)P(喜欢)/p(产品,超重)
= 1/8*4/7 /6/49 = 7/12
3.3文本分类计算
需求:通过前面4个训练样本,判断第五篇文章,是否属于china类
- 公式运用
公式分成三个部分:- :每个文档类别的概率(= 某类文档的特征个数/总文档特征数)
- :给定类别下特征(该类别文档中出现的
词)的概率,计算方法:- 为在C类中出现的次数
- 为C类中所有词出现的次数
- 预测文档中每个词的概率
计算出结果并进行比较,所以
我们只需计算分子的大小就可以得出哪个概率大
p(C|chinese,chinese,chinese,Tokyo,Japan) --->
p(chinese,chinese,chinese,Tokyo,Japan|C) *p(C) /p(chinese,chinese,chinese,Tokyo,Japan)
= p(chinese|C)^3*p(Tokyo|C)*p(Japan|C) *p(C) / p(chinese)^3*p(Tokyo)*p(Japan)
# 首先计算是China类的文章
p(chinese|C) = 5/8
p(Tokyo|C) = 0/8
p(Japan|C) = 0/8
# 接着计算不是china类的文章
p(chinese|C) = 1/3
p(Tokyo|C) = 1/3
p(Japan|C) = 1/3
问题:从上面计算中发现,p(Tokyo|C) = 0 和 p(Japan|C) = 0,这是不
合理的。仍然是样本太少造成的,如果词频列表中有很多的话,可以避
免。
解决方法: 拉普拉斯平滑系数
- 为指定的系数,一般为1
- m 为训练文档中统计出的特征词个数
# 首先计算是China类的文章
p(chinese|C) = 5/8--->6/14
p(Tokyo|C) = 0/8--->1/14
p(Japan|C) = 0/8--->1/14
# 接着计算不是china类的文章
p(chinese|C) = 1/3--->2/9
p(Tokyo|C) = 1/3--->2/9
p(Japan|C) = 1/3--->2/9
4、认识朴素贝叶斯分类器API
4.1 种类
sklearn 给我们提供了 3 个朴素贝叶斯分类算法,分别是
- 高斯朴素贝叶斯(GaussianNB)
- 多项式朴素贝叶斯(MultinomialNB)
- 伯努利朴素贝叶斯(BernoulliNB)
4.2 应用
特征:
- 高斯朴素贝叶斯:特征变量是连续变量,符合高斯分布,比如说人的身高,物体的长度;
class sklearn.naive_bayes.GaussianNB(priors=None)
- : 先验概率大小,如果没有给定,模型则根据样本数据自己计算(利用极大似然法),。其中为训练集样本总数量,为输出为第类别的训练集样本数。
- 对象:
- :每个样本的概率
- :每个类别的样本数量
- :每个类别中每个特征的均值
- :每个类别中每个特征的方差
- 多项式朴素贝叶斯:特征变量是离散变量,符合多项分布;
class sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
:先验平滑因子,默认等于1,当等于1时表示拉普拉斯平滑。
:是否去学习类的先验概率,默认是True
:各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,等于类标记总个数N分之一。
对象
:每个类别平滑后的先验概率
:是朴素贝叶斯对应的线性模型,其值和class_log_prior_相同
:给定特征类别的对数概率(条件概率)。 特征的条件概率=(指定类下指定特征出现的次数+)/(指定类下所有特征出现次数之和+类的可能取值个数*)
: 是朴素贝叶斯对应的线性模型,其值和feature_log_prob相同
: 训练样本中各类别对应的样本数
: 每个类别中各个特征出现的次数
- 伯努利朴素贝叶斯:特征变量是布尔变量,符合 0/1 分布,在文档分类中特征是单词是否出现
sklearn.naive_bayes.BernoulliNB(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)
- :平滑因子,与多项式中的一致。
- :样本特征二值化的阈值,默认是0。如果不输入,则模型会认为所有特征都已经是二值化形式了;如果输入具体的值,则模型会把大于该值的部分归为一类,小于的归为另一类。
- :是否去学习类的先验概率,默认是True
- :各个类别的先验概率,如果没有指定,则模型会根据数据自动学习, 每个类别的先验概率相同,等于类标记总个数N分之一。
对象
- :每个类别平滑后的先验对数概率。
- :给定特征类别的经验对数概率。
- :拟合过程中每个样本的数量。
- :拟合过程中每个特征的数量。
方法
贝叶斯的方法和其他模型的方法一致。
- :在数据集(X,Y)上拟合模型。
- :对数据集X进行预测。
- :对数据集X预测,得到每个类别的概率对数值。
- :对数据集X预测,得到每个类别的概率。
- :得到模型在数据集(X,Y)的得分情况。
5、鸢尾花数据分类
#导入所需要的包
from sklearn.naive_bayes import GaussianNB
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from matplotlib.colors import ListedColormap
%matplotlib inline
#导入函数
muNB = GaussianNB()
#读取数据
iris = load_iris()
#取出数据中的data
data = iris.data
#取出数据中的target
target = iris.target
#取data中所有行前两列为训练数据
samples = data[:,:2]
#训练数据
muNB.fit(samples,target)
#取出训练数据中第一列中的最大与最小值
xmin,xmax = samples[:,0].min(),samples[:,0].max()
#取出训练数据中第二列中的最大与最小值
ymin,ymax = samples[:,1].min(),samples[:,1].max()
#在最大与最小值的区间分成300个数据
x = np.linspace(xmin,xmax,300)
y = np.linspace(ymin,ymax,300)
#然后使这些数据组成一个平面
xx,yy = np.meshgrid(x,y)
#生成90000个坐标点
X_test = np.c_[xx.ravel(),yy.ravel()]
#预测训练数据
y_ = muNB.predict(X_test)
#导入三种不同的颜色
colormap = ListedColormap(['#00aaff','#aa00ff','#ffaa00'])
#生成三个不同颜色的模块,第一列为x轴坐标,第二列为y轴坐标,预测之后,不同的点分成不同的三类
plt.scatter(X_test[:,0],X_test[:,1],c=y_)
#生成训练数据生成的点的分布,c=target意思是根据target的值,生成不同的颜色的点
plt.scatter(samples[:,0],samples[:,1],c=target,cmap=colormap)
#一起调用的话使两张图结合起来
plt.scatter(X_test[:,0],X_test[:,1],c=y_)
plt.scatter(samples[:,0],samples[:,1],c=target,cmap=colormap)