朴素贝叶斯分类
贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。
原理
贝叶斯定理解决了已知某条件概率,如何得到两个事件交换后的概率问题,如在已知P(A|B)的情况下如何求得P(B|A)。
求解公式如下:
P
(
A
∣
B
)
=
P
(
A
B
)
P
(
B
)
P(A|B)=\frac{P(AB)}{P(B)}
P(A∣B)=P(B)P(AB)
条件概率:
P(A|B)表示事件B已经发生的前提下,事件A发生的概率,这就叫做事件B发生下事件A的条件概率。实际上,大多时候我们可以很容易直接得出P(A|B),P(B|A)则很难直接得出,而 P(B|A)正是我们想要的答案。通过贝叶斯定理,我们可以从P(A|B)求得P(B|A)。贝叶斯定理:
P
(
B
∣
A
)
=
P
(
A
∣
B
)
P
(
B
)
P
(
A
)
P(B|A)=\frac{P(A|B)P(B)}{P(A)}
P(B∣A)=P(A)P(A∣B)P(B)
分类介绍
朴素贝叶斯分类是一种基础的分类算法,其思想基础是:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。
正式定义:
- 设
x = { a 1 , a 2 , . . . , a n } x=\{a_1,a_2,...,a_n \} x={a1,a2,...,an}
为一个待分类项,而每个a为x的一个特征属性。 - 有类别集合
C = { y 1 , y 2 , . . . , y n } C=\{y_1,y_2,...,y_n \} C={y1,y2,...,yn} - 计算
P ( y 1 ∣ x ) , P ( y 2 ∣ x ) , . . . , P ( y n , x ) P(y_1|x),P(y_2|x),...,P(y_n,x) P(y1∣x),P(y2∣x),...,P(yn,x) - 若
P ( y k ∣ x ) = m a x { P ( y 1 ∣ x ) , P ( y 2 ∣ x ) , . . , P ( y n ∣ x ) } P(y_k|x)=max\{P(y_1|x),P(y_2|x),..,P(y_n|x)\} P(yk∣x)=max{P(y1∣x),P(y2∣x),..,P(yn∣x)}
则 x ∈ y k x∈y_k x∈yk
那么现在的关键就是如何计算第3步中的各个条件概率。
我们可以这么做:
1、找到一个已知分类的待分类项集合,这个集合叫做训练样本集。
2、统计得到在各类别下各个特征属性的条件概率估计。即
P
(
a
1
∣
y
1
)
,
P
(
a
2
∣
y
1
)
,
.
.
.
,
P
(
a
m
,
∣
y
1
)
;
P
(
a
1
∣
y
2
)
,
P
(
a
2
∣
y
2
)
,
.
.
.
,
P
(
a
m
∣
y
2
)
,
.
.
.
,
P
(
a
1
∣
y
n
)
,
P
(
a
2
∣
y
n
)
,
.
.
.
,
P
(
a
m
∣
y
n
)
P(a_1|y_1),P(a_2|y_1),...,P(a_m,|y_1); P(a_1|y_2),P(a_2|y_2),...,P(a_m|y_2),..., P(a_1|y_n),P(a_2|y_n),...,P(a_m|y_n)
P(a1∣y1),P(a2∣y1),...,P(am,∣y1);P(a1∣y2),P(a2∣y2),...,P(am∣y2),...,P(a1∣yn),P(a2∣yn),...,P(am∣yn)
3、如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导:
P
(
y
i
∣
x
)
=
P
(
x
∣
y
i
)
P
(
y
i
)
P
(
x
)
P(y_i|x)=\frac{P(x|y_i)P(y_i)}{P(x)}
P(yi∣x)=P(x)P(x∣yi)P(yi)
因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。又因为各特征属性是条件独立的,
所以有:
P
(
x
∣
y
i
)
P
(
y
i
)
=
P
(
a
1
∣
y
i
)
P
(
a
2
∣
y
i
)
.
.
.
P
(
a
m
∣
y
i
)
=
P
(
y
i
)
∏
j
=
1
m
P
(
a
j
∣
y
i
)
P(x|y_i)P(y_i)=P(a_1|y_i)P(a_2|y_i)...P(a_m|y_i)=P(y_i)\displaystyle\prod_{j=1}^{m}P(a_j|y_i)
P(x∣yi)P(yi)=P(a1∣yi)P(a2∣yi)...P(am∣yi)=P(yi)j=1∏mP(aj∣yi)
三个阶段
整个朴素贝叶斯分类分为三个阶段:
第一阶段
第一阶段——准备工作阶段,这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。
第二阶段
第二阶段——分类器训练阶段,这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。
第三阶段
第三阶段——应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。
高斯朴素贝叶斯分类
计算各个划分的条件概率P(a|y)是朴素贝叶斯分类的关键性步骤,当特征属性为离散值时,只要很方便的统计训练样本中各个划分在每个类别中出现的频率即可用来估计P(a|y),下面重点讨论特征属性是连续值的情况。
当特征属性为连续值时,通常假定其值服从高斯分布(也称正态分布)。即:
g
(
x
,
η
,
δ
)
=
1
√
2
π
δ
e
−
(
x
−
η
)
2
2
δ
g(x,η,δ)=\frac{1}{√2πδ}e^\frac{-(x-η)^2}{2δ}
g(x,η,δ)=√2πδ1e2δ−(x−η)2
而
P
(
a
k
∣
y
i
)
=
g
(
a
k
,
η
y
i
,
δ
y
i
)
P(a_k|y_i)=g(a_k,η_y{_i},δ_y{_i})
P(ak∣yi)=g(ak,ηyi,δyi)
因此只要计算出训练样本中各个类别中此特征项划分的各均值和标准差,代入上述公式即可得到需要的估计值。
均值与标准差的计算在此不再赘述。另一个需要讨论的问题就是当P(a|y)=0怎么办,当某个类别下某个特征项划分没有出现时,就会产生这种现象,这会令分类器质量大大降低。为了解决这个问题,我们引入Laplace校准,它的思想非常简单,就是对没类别下所有划分的计数加1,那么当训练样本集数量足够大时,就不会对结果产生影响,并且解决了上述频率为0的问题。
朴素贝叶斯分类
利用朴素贝叶斯算法对鸢尾花数据进行分类与预测。
from sklearn.naive_bayes import GaussianNB
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import numpy as np
if __name__ == '__main__':
dataset = load_iris()
X = dataset.data
y = dataset.target
Xd_train, Xd_test, y_train, y_test = train_test_split(X, y, random_state=14)
clf = GaussianNB()
clf = clf.fit(Xd_train, y_train)
y_predicted = clf.predict(Xd_test)
accuracy = np.mean(y_predicted == y_test) * 100
print("y_test\n ",y_test)
print("y_predicted\n",y_predicted)
print("accuracy:",accuracy)
正确率为97.37%