目录
贝叶斯分类理论
简单的说,贝叶斯定理是基于假设的先验概率、给定假设下观察到不同数据的概率,提供了一种计算后验概率的方法。
一、贝叶斯公式定义
设
Ω
\Omega
Ω 为试验
E
E
E 的样本空间,
A
A
A 为
E
E
E 的事件,
B
1
,
B
2
,
.
.
.
,
B
n
B_1,B_2,...,B_n
B1,B2,...,Bn为
Ω
\Omega
Ω 的一个划分,且
P
(
A
)
>
0
P(A)>0
P(A)>0,
P
(
B
i
)
>
0
(
i
=
1
,
2
,
.
.
.
,
n
)
P(B_i)>0(i=1,2,...,n)
P(Bi)>0(i=1,2,...,n),则
P
(
B
i
∣
A
)
=
P
(
A
∣
B
i
)
P
(
B
i
)
P
(
A
)
,
i
=
1
,
2
,
.
.
.
,
n
.
P(B_i|A)=\frac{P(A|B_i)P(B_i)}{P(A)},i=1,2,...,n.
P(Bi∣A)=P(A)P(A∣Bi)P(Bi),i=1,2,...,n.
其中
P
(
A
)
P(A)
P(A)也可写为
P
(
A
)
=
∑
j
=
1
n
P
(
A
∣
B
j
)
P
(
B
j
)
。
P(A)=\sum\limits_{j=1}^n P(A|B_j)P(B_j)。
P(A)=j=1∑nP(A∣Bj)P(Bj)。
更一般地,贝叶斯公式可简化为
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)。
P ( A ) P(A) P(A)称为先验概率, P ( B ) P(B) P(B)为后验概率, P ( A ∣ B ) P(A|B) P(A∣B)是已知 B B B发生后 A A A的条件概率,也被称为 A A A的后验概率, P ( B ∣ A ) P(B|A) P(B∣A)是已知 A A A发生后 B B B的条件概率,也被称为 B B B的后验概率。
二、贝叶斯算法
基于贝叶斯定理的贝叶斯算法是一类简单常用的分类算法,有严谨的数学理论作支撑。而假设待分类项的各个属性相互独立的情况下,构造出来的分类算法就称为朴素的,即朴素贝叶斯算法。
基本思想是:对于给定的待分类项
X
(
a
1
,
a
2
,
.
.
.
,
a
n
)
,
X (a_1,a_2,...,a_n ),
X(a1,a2,...,an),求解在此项出现的条件下各个类别
y
i
y_i
yi出现的概率,哪个
P
(
y
i
∣
X
)
P(y_i|X)
P(yi∣X)最大,就把此待分类项归属于哪个类别。
三、贝叶斯算法的优缺点
朴素贝叶斯算法的优点:
1、算法逻辑简单, 易于实现;
2、分类过程中时空开销小;
3、算法稳定,对于不同的数据特点其分类性能差别不大,健壮性比较好。
朴素贝叶斯算法的缺点:
1、朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。
2、需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
3、由于我们是通过先验和数据来决定后验的概率从而决定分类,所以分类决策存在一定的错误率。
算法实践:莺尾花数据集–贝叶斯分类
Step1: 库函数导入
import numpy as np
# 加载莺尾花数据集
from sklearn import datasets
# 导入高斯朴素贝叶斯分类器
from sklearn.naive_bayes import GaussianNB
from sklearn.model_selection import train_test_split
Step2: 数据导入&分析
X, y = datasets.load_iris(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
Step3: 模型训练
# 使用高斯朴素贝叶斯进行计算
clf = GaussianNB(var_smoothing=1e-8)
clf.fit(X_train, y_train)
Step4: 模型预测
# 评估
y_pred = clf.predict(X_test)
acc = np.sum(y_test == y_pred) /float(len( X_test))
print("Test Acc : %.3f" % acc)
输出为:
# 预测
y_proba = clf.predict_proba(X_test[:1])
print(clf.predict(X_test[:1]))
print "预计的概率值:", y_proba
输出为:
由y_proba知预测为2的概率最大,故clf.predict(X_test[:1])被预测为2。
模拟离散数据集–贝叶斯分类
Step1: 库函数导入
import random
import numpy as np
# 使用先验为伯努利分布的朴素贝叶斯
from sklearn.naive_bayes import BernoulliNB
from sklearn.model_selection import train_test_split
Step2: 数据导入&分析
# 模拟数据
rng = np.random.RandomState(1)
# 随机生成600个100维的数据,每一维的特征都是[0, 4]之间的整数
X = rng.randint(5, size=(600, 100))
y = np.array([1, 2, 3, 4, 5, 6] * 100)
data = np.c_[X, y]#X和y合并
# X和y进行整体打散
random.shuffle(data)
X = data[:,:-1]
y = data[:, -1]
#此时X和y都是随机排序后的结果
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
Step3: 模型训练&预测
clf = BernoulliNB(alpha=1.2, binarize=0.0, fit_prior=True, class_prior=None)
clf.fit(X_train, y_train)
acc = clf.score(X_test, y_test)
print("Test Acc : %.3f" % acc)
# 随机数据测试,分析预测结果,贝叶斯会选择概率最大的预测结果
# 比如这里的预测结果是3,3对应的概率最大,预测结果可能随不同的人不一样
x = rng.randint(5, size=(1, 100))
print(clf.predict_proba(x))
print(clf.predict(x))
参考链接:
1、十大经典算法朴素贝叶斯讲解PPT
2、朴素贝叶斯算法优缺点
3、sklearn朴素贝叶斯类库(naive_bayes)使用小结