机器学习算法(二): 基于鸢尾花数据集的奢侈贝叶斯(Naive Bayes)预测分类
我的项目链接参考:https://www.heywhale.com/home/column/64141d6b1c8c8b518ba97dcc
1. 实验室介绍
1.1 试验环境
1. python3.72. numpy >= '1.16.4'3. sklearn >= '0.23.1'
1.2 奢侈贝叶斯的介绍
奢侈贝叶斯算法(Naive Bayes, NB) 是利用最为宽泛的分类算法之一。它是基于贝叶斯定义和特色条件独立假如的分类器办法。因为奢侈贝叶斯法基于贝叶斯公式计算失去,有着松软的数学根底,以及稳固的分类效率。NB模型所需预计的参数很少,对缺失数据不太敏感,算法也比较简单。当年的垃圾邮件分类都是基于奢侈贝叶斯分类器辨认的。
什么是条件概率,咱们从一个摸球的例子来了解。咱们有两个桶:灰色桶和绿色桶,一共有7个小球,4个蓝色3个紫色,散布如下图:
<img src="http://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/2NaiveBayes/ball_ab.png" />
从这7个球中,随机抉择1个球是紫色的概率p是多少?抉择过程如下:
- 先抉择桶
- 再从抉择的桶中抉择一个球
$$p(球=紫色) \\=p(抉择灰桶) \cdot p(从灰桶中抉择紫色) + p(抉择绿桶) \cdot p(从灰桶中抉择紫色) \\=\frac{1}{2} \cdot \frac{2}{4} + \frac{1}{2} \cdot \frac{1}{2}$$
上述咱们抉择小球的过程就是条件概率的过程,在抉择桶的色彩的状况下是紫色的概率,另一种计算条件概率的办法是贝叶斯准则。
贝叶斯公式是英国数学家提出的一个数据公式:
$$p(A|B)=\frac{p(A,B)}{p(B)}=\frac{p(B|A) \cdot p(A)}{\sum_{a \in ℱ_A}p(B|a) \cdot p(a)}$$
p(A,B):示意事件A和事件B同时产生的概率。
p(B):示意事件B产生的概率,叫做先验概率;p(A):示意事件A产生的概率。
p(A|B):示意当事件B产生的条件下,事件A产生的概率叫做后验概率。
p(B|A):示意当事件A产生的条件下,事件B产生的概率。
咱们用一句话了解贝叶斯:世间很多事都存在某种分割,假如事件A和事件B。人们经常应用曾经产生的某个事件去推断咱们想要晓得的之间的概率。
例如,医生在确诊的时候,会依据病人的舌苔、心跳等来判断病人得了什么病。对病人来说,只会关注得了什么病,医生会通道曾经产生的事件来
确诊具体的状况。这里就用到了贝叶斯思维,A是曾经产生的病人症状,在A产生的条件下是B_i的概率。
1.3 奢侈贝叶斯的利用
奢侈贝叶斯算法假如所有特色的呈现互相独立互不影响,每一特色等同重要,又因为其简略,而且具备很好的可解释性个别。绝对于其余精心设计的更简单的分类算法,奢侈贝叶斯分类算法是学习效率和分类成果较好的分类器之一。奢侈贝叶斯算法个别利用在文本分类,垃圾邮件的分类,信用评估,钓鱼网站检测等。
2. 实验室手册
2.1 学习指标
- 把握贝叶斯公式
- 联合两个实例理解贝奢侈叶斯的参数估计
- 把握贝叶斯预计
2.2 代码流程
Part 1. 莺尾花数据集--贝叶斯分类
- Step1: 库函数导入
- Step2: 数据导入&剖析
- Step3: 模型训练
- Step4: 模型预测
- Step5: 原理简析
Part 2. 模仿离散数据集--贝叶斯分类
- Step1: 库函数导入
- Step2: 数据导入&剖析
- Step3: 模型训练&可视化
- Step4: 原理简析
2.3 算法实战
莺尾花数据集--贝叶斯分类
Step1: 库函数导入
import warningswarnings.filterwarnings('ignore')import numpy as np# 加载莺尾花数据集from sklearn import datasets# 导入高斯奢侈贝叶斯分类器from sklearn.naive_bayes import GaussianNBfrom 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)
咱们须要计算两个概率别离是:条件概率:$P(X^{(i)}=x^{(i)}|Y=c_k)$和类目$c_k$的先验概率:$P(Y=c_k)$。
通过剖析发现训练数据是数值类型的数据,这里假如每个特色遵从高斯分布,因而咱们抉择高斯奢侈贝叶斯来进行分类计算。
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) / X_test.shape[0]print("Test Acc : %.3f" % acc)# 预测y_proba = clf.predict_proba(X_test[:1])print(clf.predict(X_test[:1]))print("预计的概率值:", y_proba)
Test Acc : 0.967 [2] 预计的概率值: [[1.63542393e-232 2.18880483e-006
9.99997811e-001]]
Step5: 原理简析
高斯奢侈贝叶斯假如每个特色都遵从高斯分布,咱们把一个随机变量X遵从数学冀望为,方差为^2的数据分布称为高斯分布。对于每个特色咱们个别应用平均值来预计和应用所有特色的方差预计^2。
$$P(X^{(i)}=x^{(i)}|Y=c_k) = \frac{1}{\sqrt{2\pi\sigma^2_y}} \exp\left(-\frac{(x^{(i)} - \mu_{c_k})^2}{2\sigma^2_{c_k}}\right)$$
从上述例子中的预测后果中,咱们能够看到类别2对应的后验概率值最大,所以咱们认为类目2是最优的后果。
模仿离散数据集--贝叶斯分类
Step1: 库函数导入
+ Step2: 数据导入&剖析 + Step3: 模型训练&可视化+ Step4: 原理简析
import randomimport numpy as np# 应用基于类目特色的奢侈贝叶斯from sklearn.naive_bayes import CategoricalNBfrom 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进行整体打散random.shuffle(data)X = data[:,:-1]y = data[:, -1]X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
所有的数据特色都是离散特色,咱们引入基于离散特色的奢侈贝叶斯分类器。
Step3: 模型训练&预测
clf = CategoricalNB(alpha=1)clf.fit(X_train, y_train)acc = clf.score(X_test, y_test)print("Test Acc : %.3f" % acc)
Test Acc : 0.683
# 随机数据测试,剖析预测后果,贝叶斯会抉择概率最大的预测后果# 比方这里的预测后果是6,6对应的概率最大,因为咱们是随机数据# 读者运行的时候,可能会呈现不一样的后果。x = rng.randint(5, size=(1, 100))print(clf.predict_proba(x))print(clf.predict(x))
[[3.48859652e-04 4.34747491e-04 2.23077189e-03 9.90226387e-01 5.98248900e-03 7.76745425e-04]]
2.4 原理简析
2.4.1 后果剖析
能够看到测试的数据的后果,贝叶斯会抉择概率最大的预测后果,比方这里的预测后果是6,6对应的概率最大,因为咱们是随机数据,读者运行的时候,可能会呈现不一样的后果。
这里的测试数据的准确率没有任何意义,因为数据是随机生成的,不肯定具备贝叶斯先验性,这里只是作为一个列子疏导大家如何应用。
alpha=1这个参数示意什么?
咱们晓得贝叶斯法肯定要计算两个概率:条件概率:$P(X^{(i)}=x^{(i)}|Y=c_k)$和类目$c_k$的先验概率:$P(Y=c_k)$。
对于离散特色:
$$P(X^{(j)}=x^{(j)}|Y=c_k)=\frac{\sum_{i=1}^{N}I(x_i^j=a_{jl},y_i=c_k)+\alpha}{\sum_{i=1}^{N}I(y_i=c_k)+S_j\alpha} $$
咱们能够看出就是对每一个变量的多加了一个频数alpha。当alpha=0时,就是极大似然预计。通常取值alpha=1,这就是拉普拉斯平滑(Laplace smoothing),这有叫做贝叶斯预计,次要是因为如果应用极大似然预计,如果某个特征值在训练数据中没有呈现,这时候会呈现概率为0的状况,导致整个预计都为0,因为引入贝叶斯预计。
其中:
$S_j$:示意第j个特色的个数。
$x_i^j$:示意第i个样本的第j维元素。
$y_i$:第i个样本的label。
2.4.2 奢侈贝叶斯算法
奢侈贝叶斯法 = 贝叶斯定理 + 特色条件独立。
输出$X \in R^n$空间是n维向量汇合,输入空间$y=\{c_1,c_2,...,c_K\}$. 所有的X和y都是对应空间上的随机变量. $P(X,Y)$是X和Y的联结概率别离. 训练数据集(由$P(X,Y)$独立同散布产生):
$$T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}$$
计算测试数据x的列表,咱们须要顺次计算$P(Y=c_k|X=x)$,取概率最大的值,就是x对应的分类。
$P(Y=c_k|X=x)$咱们个别这样解释,当给定$(X=x)$的条件下,$Y=c_k$的概率,这就是条件概率. 这就简略了,咱们只须要每个的x,计算其对应的$c_k,k \in [1,2,...,K]$的概率,抉择最大的概率作为这个x的类别进行了.
通过贝叶斯公式进行变形,失去预测的概率计算公式:
$$P(Y=c_k|X=x)=\frac{P(X=x|Y=c_k)P(Y=c_k)}{\sum_{k}P(X=x|Y=c_k)P(Y=c_k)}$$
咱们只须要计算以下两个概率即可,又因为奢侈贝叶斯假如条件独立,咱们能够独自计算每个特色的条件概率:$P(X^{(i)}=x^{(i)}|Y=c_k)$和类目$c_k$的先验概率:$P(Y=c_k)$。为了更好的了解这个公式,看下图解释:
其中:
$$P(Y=c_k)=\frac{\sum_{i=1}^{N}I(y_i=c_k)}{N}, k=1,2,...,K$$
当波及到多个条件时,奢侈贝叶斯有一个提前的假如,咱们称之为 条件独立性假如(或者 简略假如:Naive):公式如下
$$P(A,B|Y) = P(A|Y) \cdot P(B|Y)$$
这个公式是奢侈贝叶斯的根底假如,即各个条件概率是互相独立的,A不影响B,B不影响A。
而对这里来说,假如$X = [x_1,x_2,...,x_n]$
$$P(X=x|Y=c_k) \\=P(X^{(1)}=x^{(1)},X^{(2)}=x^{(2)},...,X^{(n)}=x^{(n)}|Y=c_k) \\=\prod_{i=1}^{n} P(x_i | y)$$
由此原式能够等价为:
$$P(Y=c_k|X=x)=\frac{\prod_{i=1}^{n} P(x_i | Y=c_k)P(Y=c_k)}{\sum_{k}\prod_{i=1}^{n} P(x_i | Y=c_k)P(Y=c_k)}$$
咱们为了抉择后验概率最大的后果,进行概率的比拟,因为分母统一,这里间接去掉分母,失去最初的计算公式。
$$y=arg max_{c_k}P(Y=c_k)\prod_{j}P(X^{(j)}=x^{(j)}|Y=c_k)$$
<img src="http://tianchi-media.oss-cn-beijing.aliyuncs.com/DSW/2NaiveBayes/bayes2.png" />
咱们来看一个实例,更好的了解贝叶斯的计算过程,依据天气和是否是周末预测一个人是否会出门。
index | $X_1:$天气的好坏 | $X_2:$是否周末 | $Y:$是否出门 |
---|---|---|---|
1 | 好 | 是 | 出门 |
2 | 好 | 否 | 出门 |
3 | 好 | 是 | 不出门 |
4 | 好 | 否 | 出门 |
5 | 不好 | 是 | 出门 |
6 | 不好 | 否 | 不出门 |
根据上述数据,为了更好的了解计算过程,咱们给出几个计算公式:
a. 当出门的条件下,X_1是天气不好的概率:
$$p(X_1=不好|Y=出门)=\frac{p(X_1=不好,Y=出门)}{p(Y=出门)}=\frac{1}{4}$$
b. 出门的概率
$$p(Y=出门)=\frac{4}{6}$$
c. X_1天气不好的概率、
$$p(X_1=不好)=\frac{2}{6}$$
d. 在X_1天气不好的状况下,出门的概率:
$$p(Y=出门|X_1=不好)=\frac{p(X_1=不好|Y=出门) \cdot p(Y=出门)}{p(X=不好)} \\=\frac{\frac{1}{4} \cdot \frac{4}{6}}{\frac{2}{6}}=\frac{1}{2}$$
f. 在X_1天气不好的状况下,不出门的概率:
$$p(Y=出门|X_1=不好)=1-p(Y=不出门|X_1=不好)=1-\frac{1}{2}=\frac{1}{2}$$
2.4.3 奢侈贝叶斯的优缺点
长处:
奢侈贝叶斯算法次要基于经典的贝叶斯公式进行推倒,具备很好的数学原理。而且在数据量很小的时候体现良好,数据量很大的时候也能够进行增量计算。因为奢侈贝叶斯应用先验概率预计后验概率具备很好的模型的可解释性。
毛病:
奢侈贝叶斯模型与其余分类办法相比具备最小的实践误差率。然而实际上并非总是如此,这是因为奢侈贝叶斯模型给定输入类别的状况下,假如属性之间互相独立,这个假如在理论利用中往往是不成立的,在属性个数比拟多或者属性之间相关性较大时,分类成果不好。而在属性相关性较小时,奢侈贝叶斯性能最为良好。对于这一点,有半奢侈贝叶斯之类的算法通过思考局部关联性适度改良,例如为了计算量不至于太大,咱们假设每个属性只依赖另外的一个。解决特色之间的相关性,咱们还能够应用数据降维(PCA)的办法,去除特色相关性,再进行奢侈贝叶斯计算。