机器学习之朴素贝叶斯分类

贝叶斯定理和基础概率论

概率,其实在我们生活中十分常见,它是对未来事件发生可能性的表述,比如彩票的中奖率是多少?概率值通常用P来表示,古典概率的取值范围在0~1之间。
P(A)=0就是表示事件A一定不会发生
条件概率是用形如P(A|B)来表示,它的含义是:如果事件B已经发生,那么事件A发生的概率是多少
联合概率是用形如P(AB),P(A,B),P(A ⋂ \bigcap B)来表示的,它是用来描述两个事件AB同时发生的概率。
事件之间的并的概率是用P(A ⋃ \bigcup B)来表示,即,事件A或事件B至少有一个事件发生的概率是多少
下面是一些概率计算原理
加法原理:
P(A ⋃ \bigcup B) = P(A) +P(B) - P(A ⋂ \bigcap B)
乘法原理:
P(A ⋂ \bigcap B) = P(B) ⋅ \cdot P(A|B)=P(A) ⋅ \cdot P(B|A)
贝叶斯定理:
P(A|B) = P ( A ) P ( B ∣ A ) P ( B ) \frac {P(A)P(B|A)} {P(B)} P(B)P(A)P(BA)
如果不是很理解这些原理可以尝试用韦恩图来辅助理解
请添加图片描述
在介绍和实战朴素贝叶斯前,我们还需理解几个概念:先验概率,后验概率,似然度,标准化常量。下面我们用一个例子来理解吧。
已知有两个不透明的箱子,它们分别装着大小相同颜色不同的10个球。其中箱A中有4个红球,3个绿球,3黄球;箱B中有2个红球,7个绿球,1个黄球.
问:随机从任意一个箱子取出一个球,发现其颜色为红色,那么这颗球来自箱A的概率是多少?
面对这个概率问题,我们可以定义:事件A为“从箱A中取”,事件B“取到的球为红色”。那么我们就可以用贝叶斯公式来求解P(A|B)了。此时,贝叶斯公式中的每个元素就有了其他名称了,P(A|B)是后验概率,P(A)是先验概率,P(B|A)为似然度,P(B)为标准化量。
先验概率P(A)(从A箱取球):P(A) = 1 2 \frac {1} {2} 21
似然度P(B|A)(从A箱中取到的球为红色):P(B|A) = 2 5 \frac {2} {5} 52
标准化量P(B) (取到的球为红色):P(取到A箱) × \times ×P(从A箱中取到的球为红色)+
P(取到B箱) × \times ×P(从B箱中取到的球为红色)= 1 2 \frac {1} {2} 21 × \times × 2 5 \frac {2} {5} 52+ 1 2 \frac {1} {2} 21 × \times × 2 10 \frac {2} {10} 102= 3 10 \frac {3} {10} 103
P(A|B) = P ( A ) P ( B ∣ A ) P ( B ) \frac {P(A)P(B|A)} {P(B)} P(B)P(A)P(BA)= ( 1 / 2 ∗ 2 / 5 ) 3 / 10 \frac {(1/2*2/5)} {3/10} 3/10(1/22/5)= 2 3 \frac {2} {3} 32
到这里我们会发现,如果任意取一个球,这个球来自箱A的概率为 1 2 \frac {1} {2} 21,但如果这个球的颜色为红色,那么它来自箱A的概率会变成 2 3 \frac {2} {3} 32

朴素贝叶斯

朴素贝叶斯是应用了贝叶斯定理进行的有监督学习的一种分类模型。其中贝叶斯公式 P(A|B) = P ( A ) P ( B ∣ A ) P ( B ) \frac {P(A)P(B|A)} {P(B)} P(B)P(A)P(BA)中事件A被称为分类标签,事件B为数据特征。因为特征往往是多维的,所以P(B)演变成了n个特征的联合概率。因此,贝叶斯公式就变成了:P(y| x 1 , x 2 , . . . x n x_1,x_2,...x_n x1,x2,...xn) = P ( x 1 , x 2 , . . x n ) P ( ∣ y ) P ( x 1 , x 2 , . . x n ) \frac {P(x1,x2,..xn)P(|y)} {P(x1,x2,..xn)} P(x1,x2,..xn)P(x1,x2,..xn)P(y)其中 x 1 , x 2 , . . . x n x_1,x_2,...x_n x1,x2,...xn是数据的N维特征,y是预测标签。
那朴素贝叶斯是如何预测的呢?其实很简单,朴素贝叶斯预测分两步:1.遍历所有标签,用贝叶斯公式计算给定特征环境下出现该标签的后验概率2.获得最高的后验概率的标签,然后预测标签。
朴素贝叶斯为什么叫做朴素贝叶斯不直接叫贝叶斯呢?
其实它的朴素来自它的独立性的假设,朴素贝叶斯模型假设所有n维特征之间是互相独立的。就是怎么简单,霸道的假设。也正因这样的假设,大大简化了联合分布的计算难度。因此它的似然度函数就变成了计算各特征独自的条件概率了:P( x 1 , x 2 , . . . x n x_1,x_2,...x_n x1,x2,...xn|y) = P( x 1 x_1 x1|y) × \times ×P( x 2 x_2 x2|y) × \times × × \times ×P( x n x_n xn|y)

高斯朴素贝叶斯,多项式朴素贝叶斯,伯努利朴素贝叶斯的区别

这几种贝叶斯的主要区别在于训练似然度条件概率中的元素P( x 1 , x 2 , . . . x n x_1,x_2,...x_n x1,x2,...xn|y) …的方法是假定符合某种分布的,然后通过训练集数据估计分布参数。其中高斯朴素贝叶斯使用的是高斯分布,也就是我们常用的正态分布;多项式朴素贝叶斯,顾名思义就是使用多项式分布作为似然度概率模型的分类器;而伯努利朴素贝叶斯使用的是伯努利分布作为似然度概率模型。因为伯努利分布也称为二值分布,所有伯努利分布只能描述二值结果,因此在该学习模型中要求数据中的所有特征都是布尔类型或者二值类型。下面我们就实战下这几种朴素贝叶斯分类。

几种朴素贝叶斯实战

from sklearn.datasets import load_iris
from sklearn.naive_bayes import GaussianNB
from sklearn.naive_bayes import BernoulliNB
from sklearn.naive_bayes import MultinomialNB
from sklearn.model_selection import train_test_split


iris = load_iris()
x_data = iris.data
target = iris.target
lable_name = iris.feature_names
train_data, test_data, train_target, test_target = train_test_split(x_data, target, test_size=0.3)
# 高斯朴素贝叶斯
gnb = GaussianNB(priors=None)
gnb.fit(train_data, train_target)
gnb.predict(test_data)
scores = gnb.score(test_data, test_target)
print("模型的先验概率:", gnb.class_prior_)
print("特征的均值:", gnb.theta_)
print("特征的方差:", gnb.sigma_)
print(scores)
# 多项式贝叶斯
mnb = MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
mnb.fit(train_data, train_target)
mnb.predict(test_data)
scores = mnb.score(test_data, test_target)
print("************************************************")
print("每个类别平滑后的先验概率:", mnb.class_log_prior_)
print(scores)
# 伯努利贝叶斯
clf = BernoulliNB(alpha=1.0, binarize=5.0, fit_prior=True, class_prior=None)
clf.fit(train_data, train_target)
clf.predict(test_data)
scores = clf.score(test_data, test_target)
print("************************************************")
print("每个类别平滑后的先验概率:", clf.class_log_prior_)
print(scores)

请添加图片描述

总结

从训练结果来看,面对load_iris这个数据集的训练,高斯朴素贝叶斯的结果是最好的,其次是多项式贝叶斯,最后是伯努利贝叶斯。当然,也因为伯努利只能描述二值结果。面对不同的数据集,每个模型都有自己的优势,多项式贝叶斯就特别适合文本分类的场景,因为它实际衡量的是特征在不同标签之间的分布比例关系;而伯努利贝叶斯,在面对二值类型或者布尔类型的数据集也会有更好的结果。下面总结了一些常用的参数和方法。
高斯朴素贝叶斯

参数或对象解释
priors(参数)先验概率大小,如果没有给定,模型则根据样本数据自己计算
class_prior_模型的先验概率
class_count训练集标签数量
theta_特征的均值
sigma_特征的方差

多项式贝叶斯

参数或对象解释
alpha(参数)先验平滑因子,默认等于1
fit_prior(参数)是否去学习类的先验概率,默认是True
class_prior(参数):每个类别的先验概率,如果没有指定,则模型会根据数据自动学习
class_log_prior_平滑后的先验概率
feature_count_每个类别中各个特征出现的次数

伯努利贝叶斯

参数或对象解释
alpha(参数)先验平滑因子,默认等于1
binarize(参数)样本特征二值化的阈值,默认是0。如果不输入,则模型会认为所有特征都已经是二值化了;如果输入具体的值,则模型会把大于该值的部分归为一类,小于的归为另一类。
fit_priorr(参数):是否去学习类的先验概率,默认是True
class_prior(参数)每个类别的先验概率,如果没有指定,则模型会根据数据自动学习
class_log_prior_平滑后的先验概率
feature_log_prob_给定特征类别的经验对数概率
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值