贝叶斯原理
贝叶斯最主要的想法是用先验概率来计算后验概率,先验概率指的是没有任何提示信息时的事件C概率,来计算掌握一定信息时事件C概率,用公式:
P
(
C
∣
X
)
=
P
(
C
)
⋅
P
(
X
∣
C
)
P
(
X
)
P(C|X)=\frac{P(C)·P(X|C)}{P(X)}
P(C∣X)=P(X)P(C)⋅P(X∣C)
也就是:
P
(
类
别
∣
特
征
)
=
P
(
类
别
)
⋅
P
(
特
征
∣
类
别
)
P
(
特
征
)
P(类别|特征)=\frac{P(类别)·P(特征|类别)}{P(特征)}
P(类别∣特征)=P(特征)P(类别)⋅P(特征∣类别)
由于P(类别1|特征)和P(类别1|特征)中分母相同,所以找到
P
(
类
别
)
⋅
P
(
特
征
∣
类
别
)
{P(类别)·P(特征|类别)}
P(类别)⋅P(特征∣类别)的最大值对应的类别,为该特征的样本所属于的类别。
朴素贝叶斯:
假设所有的特征之间是相互独立的,也就是
P
(
特
征
∣
类
别
)
=
∏
i
=
1
d
P
(
特
征
i
∣
类
别
)
P(特征|类别)=\prod_{i=1}^d P(特征i|类别)
P(特征∣类别)=∏i=1dP(特征i∣类别)这样可以更方便的计算出后验概率。
相对应的可以放松独立性假设,得到ODE,AODE
度依赖估计(ODE)
假设每个属性及依赖于最多一个属性(除自身外),被依赖属性称为超父属性,就是让下式最大化
P
(
C
j
)
∏
i
=
1
d
P
(
X
i
∣
C
j
,
p
a
i
)
P(C_j)\prod_{i=1}^d P(X_i|C_j,pai)
P(Cj)i=1∏dP(Xi∣Cj,pai)
AODE
每个属性轮流做超父属性,就是让下式最大化
∑
i
=
1
d
P
(
C
j
,
X
k
)
∏
i
=
1
d
P
(
X
i
∣
C
j
,
X
k
)
\sum_{i=1}^dP(C_j,X_k)\prod_{i=1}^d P(X_i|C_j,X_k)
i=1∑dP(Cj,Xk)i=1∏dP(Xi∣Cj,Xk)
拉普拉斯修正
训练集中有的分类没有某特征,并不代表该特征不可能存在于这个分类,但是此时该分类中这个特征的概率为0,进而计算出包含该特征的样本出现在该分类的概率为0。所以需要进行修正。对
P
(
特
征
∣
类
别
)
P(特征|类别)
P(特征∣类别)进行修改
P
(
X
i
∣
C
)
=
∣
D
c
,
x
i
∣
+
1
∣
D
c
∣
+
N
i
P(X_i|C) = \frac{|D_{c,x_i}|+1}{|D_c|+N_i}
P(Xi∣C)=∣Dc∣+Ni∣Dc,xi∣+1
N
i
N_i
Ni是
X
i
X_i
Xi一共有多少类。以下例子中会详细说明为什么需要修正,以及如何修正。
例子
体积 | 颜色 | 形状 | 分类 |
---|---|---|---|
大 | 红 | 圆 | 甜 |
小 | 红 | 圆 | 甜 |
小 | 绿 | 扁 | 不甜 |
大 | 绿 | 圆 | 不甜 |
大 | 绿 | 圆 | 甜 |
1.一个苹果如果(小,绿,圆)则苹果是甜还是不甜
P(甜|小,绿,圆)P(小,绿,圆)=P(小|甜)P(绿|甜)P(圆|甜)P(甜) = 1/15
P(不甜|小,绿,圆)P(小,绿,圆)=P(小|不甜)P(绿|不甜)P(圆|不甜)P(不甜) = 3/20
得出结论·:苹果不甜
2.一个苹果如果(大,绿,扁)则苹果是甜还是不甜
可以看出在给出的几行数据里,甜苹果里没有扁的,则这个苹果甜的概率为0,但是给出的数据里甜苹果里没有扁的,不代表甜苹果里一定没有扁的。所以为了优化需要进行拉普拉斯修正
此时,P(甜|大,绿,扁)P(大,绿,扁)=P(大|甜)P(绿|甜)P(扁|甜)P(甜)
P(大|甜) =
2
+
1
3
+
2
=
3
5
\frac{2+1}{3+2}=\frac{3}{5}
3+22+1=53
P(绿|甜) =
2
+
1
3
+
2
=
3
5
\frac{2+1}{3+2}=\frac{3}{5}
3+22+1=53
P(扁|甜) =
1
3
+
2
=
1
5
\frac{1}{3+2}=\frac{1}{5}
3+21=51
p(甜) =
3
+
1
5
+
2
=
4
7
\frac{3+1}{5+2 }= \frac47
5+23+1=74
P(甜|大,绿,扁)P(大,绿,扁) =
36
875
\frac{36}{875}
87536
同理可得:
P(不甜|大,绿,扁)P(大,绿,扁)=P(大|不甜)P(绿|不甜)P(扁|不甜)P(不甜)=
4
21
\frac{4}{21}
214
这个苹果不甜
代码
调用sklearn来实现,选用的数据集是手写数字:
from sklearn.datasets import load_digits
digits = load_digits()
x = digits.data
y = digits.target
# 数据分类
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)
# 模型训练与预测
from sklearn.naive_bayes import MultinomialNB, GaussianNB
Bys1 = GaussianNB()
Bys2 =MultinomialNB()
Bys1.fit(x_train,y_train)
Bys2.fit(x_train,y_train)
import numpy as np
from sklearn import metrics
pred1 = Bys1.predict(x_test)
pred2 = Bys2.predict(x_test)
accuracy1 = metrics.accuracy_score(y_test,pred1)
accuracy2 = metrics.accuracy_score(y_test,pred2)
print(accuracy1,accuracy2)
输出:0.8240740740740741 0.9055555555555556
代码解释:
朴素贝叶斯常用的三个模型:MultinomialNB, GaussianNB,BernoulliNB
MultinomialNB:假设先验分布是多项式分布,上面苹果例子中就是假设先验分布为多项式分布,
P
(
X
i
∣
C
k
)
=
∣
D
c
k
,
x
i
∣
∣
D
c
k
∣
P(X_i|C_k) = \frac{|D_{c_k,x_i}|}{|D_{c_k}|}
P(Xi∣Ck)=∣Dck∣∣Dck,xi∣
参数:
alpha : float, default=1.0,惩罚项(参数2范数的平方)的参数λ ,如果设置为0则表示完全没有惩罚项
fit_prior : bool, default=True,是否要学习先验概率,如果为False,则所有样本输出时使用统一的类别先验概率(1 / 类别数)。
如果为True时,则可以利用第三个参数class_piror输入先验概率,或者不输入第三个参数,可以从训练集中自己计算先验概率,此时,第k个类别的先验概率=第k个类别样本数 / 总的样本数
class_prior : array-like of shape (n_classes,), default=None,类的先验概率。
GaussianNB:假设先验分布是高斯分布,上面的苹果例子中大小用苹果周长来衡量,此时这个特征对应的就应该是高斯分布,
P
(
X
i
∣
C
k
)
=
1
2
π
σ
k
2
e
x
p
(
−
(
x
i
−
μ
k
)
2
2
σ
k
2
)
P(X_i|C_k) = \frac1{\sqrt{2πσ_k^2}}exp(-\frac{(x_i-μ_k)^2}{2σ_k^2})
P(Xi∣Ck)=2πσk21exp(−2σk2(xi−μk)2)其中
σ
k
σ_k
σk,
μ
k
μ_k
μk是用
C
k
C_k
Ck中所有的样本通过极大似然求得
参数:
priors : array-like of shape (n_classes,),类的先验概率。如果指定,则先验数据不会根据数据进行调整
BernoulliNB:假设先验分布是伯努利分布,还是上面苹果的例子进行改造,现在苹果是按照筐卖,每筐可以分为上等品和次品,计算筐子里有(大,绿,圆)则这一筐是什么等级?此时
P
(
X
2
=
绿
∣
C
=
上
等
品
)
=
∣
D
上
等
品
,
含
绿
色
∣
∣
D
上
等
品
∣
P(X_2 =绿|C=上等品) = \frac{|D_{上等品,含绿色}|}{|D_{上等品}|}
P(X2=绿∣C=上等品)=∣D上等品∣∣D上等品,含绿色∣,此时计数的单位改成了筐,并且满足伯努利分布,
P
(
上
等
品
∣
大
,
绿
,
圆
)
=
P
(
上
等
品
)
P
(
大
∣
上
等
品
)
[
1
−
P
(
大
∣
上
等
品
)
]
0
⋅
P
(
上
等
品
)
P
(
绿
∣
上
等
品
)
[
1
−
P
(
绿
∣
上
等
品
)
]
0
⋅
P
(
上
等
品
)
P
(
圆
∣
上
等
品
)
[
1
−
P
(
圆
∣
上
等
品
)
]
0
P(上等品|大,绿,圆)=P(上等品)P(大|上等品)[1-P(大|上等品)]^0· P(上等品)P(绿|上等品)[1-P(绿|上等品)]^0· P(上等品)P(圆|上等品)[1-P(圆|上等品)]^0
P(上等品∣大,绿,圆)=P(上等品)P(大∣上等品)[1−P(大∣上等品)]0⋅P(上等品)P(绿∣上等品)[1−P(绿∣上等品)]0⋅P(上等品)P(圆∣上等品)[1−P(圆∣上等品)]0
参数:
比多项式贝叶斯只多了一个参数
binarize : float或None,default =0,将特征二值化的阈值,如果设定为None,则假定为特征已经被二值化完毕
推荐博客:
朴素贝叶斯,ODE,AODE:
https://blog.csdn.net/xo3ylAF9kGs/article/details/78643424?spm=1001.2014.3001.5506
这个文章里举的例子非常好!:
https://blog.csdn.net/qq_36134437/article/details/103065030
这个文章展示了如何调参:
https://blog.csdn.net/dingming001/article/details/80686600
贝叶斯方法缺点:没有太多的参数可以调整,因此贝叶斯算法的成长空间并不是太大,如果贝叶斯算法的效果不是太理想,一般都会考虑换模型。