赞
踩
概率,其实在我们生活中十分常见,它是对未来事件发生可能性的表述,比如彩票的中奖率是多少?概率值通常用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(B∣A)
如果不是很理解这些原理可以尝试用韦恩图来辅助理解
在介绍和实战朴素贝叶斯前,我们还需理解几个概念:先验概率,后验概率,似然度,标准化常量。下面我们用一个例子来理解吧。
已知有两个不透明的箱子,它们分别装着大小相同颜色不同的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(B∣A)=
(
1
/
2
∗
2
/
5
)
3
/
10
\frac {(1/2*2/5)} {3/10}
3/10(1/2∗2/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(B∣A)中事件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_ | 给定特征类别的经验对数概率 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。