文章目录
阿里天池训练营day06:模拟离散数据集贝叶斯分类
还是贝叶斯分类,用模拟离散数据集练习
1. 介绍
Step1: 库函数导入
Step2: 数据导入&分析
Step3: 模型训练&可视化
Step4: 原理简析
2. 算法实战
Step1: 库函数导入
import random
import numpy as np
# 使用基于类目特征的朴素贝叶斯
from sklearn.naive_bayes import CategoricalNB
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进行整体打散
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.667
'''
# 随机数据测试,分析预测结果,贝叶斯会选择概率最大的预测结果
# 比如这里的预测结果是6,6对应的概率最大,由于我们是随机数据
# 读者运行的时候,可能会出现不一样的结果。
x = rng.randint(5, size=(1, 100))
print(clf.predict_proba(x))
print(clf.predict(x))
'''
[[9.41171278e-04 6.23339167e-05 6.51019424e-03 5.87833689e-01
4.20262268e-04 4.04232349e-01]]
[4]
我这里预测的是4
'''
Step4: 原理简析
1 结果分析
可以看到测试的数据的结果,贝叶斯会选择概率最大的预测结果,比如这里的预测结果是6,6对应的概率最大,由于我们是随机数据,读者运行的时候,可能会出现不一样的结果。
这里的测试数据的准确率没有任何意义,因为数据是随机生成的,不一定具有贝叶斯先验性,这里只是作为一个列子引导大家如何使用。
alpha=1这个参数表示什么?
我们知道贝叶斯法一定要计算两个概率:条件概率: P ( X ( i ) = x ( i ) ∣ Y = c k ) P(X^{(i)}=x^{(i)}|Y=c_k) P(X(i)=x(i)∣Y=ck)和类目 c k c_k ck的先验概率: P ( Y = c k ) P(Y=c_k) P(Y=ck)。
对于离散特征:
P ( X ( j ) = x ( j ) ∣ Y = c k ) = ∑ i = 1 N I ( x i j = a j l , y i = c k ) + α ∑ i = 1 N I ( y i = c k ) + S j α 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} P(X(j)=x(j)∣Y=ck)=∑i=1NI(yi=ck)+Sjα∑i=1NI(xij=ajl,yi=ck)+α
我们可以看出就是对每一个变量的多加了一个频数alpha。当alphaλ=0时,就是极大似然估计。通常取值alpha=1,这就是拉普拉斯平滑(Laplace smoothing),这有叫做贝叶斯估计,主要是因为如果使用极大似然估计,如果某个特征值在训练数据中没有出现,这时候会出现概率为0的情况,导致整个估计都为0,因为引入贝叶斯估计。
其中:
S j S_j Sj:表示第j个特征的个数。
x i j x_i^j xij:表示第i个样本的第j维元素。
y i y_i yi:第i个样本的label。
2 朴素贝叶斯算法
朴素贝叶斯法 = 贝叶斯定理 + 特征条件独立。
输入 X ∈ R n X \in R^n X∈Rn空间是n维向量集合,输出空间 y = { c 1 , c 2 , . . . , c K } y=\{c_1,c_2,...,c_K\} y={c1,c2,...,cK}. 所有的X和y都是对应空间上的随机变量. P ( X , Y ) P(X,Y) P(X,Y)是X和Y的联合概率分别. 训练数据集(由 P ( X , Y ) P(X,Y) P(X,Y)独立同分布产生):
T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } T=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\} T={(x1,y1),(x2,y2),...,(xN,yN)}
计算测试数据x的列表,我们需要依次计算 P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ck∣X=x),取概率最大的值,就是x对应的分类。
P ( Y = c k ∣ X = x ) P(Y=c_k|X=x) P(Y=ck∣X=x)我们一般这样解释,当给定 ( X = x ) (X=x) (X=x)的条件下, Y = c k Y=c_k Y=ck的概率,这就是条件概率. 这就简单了,我们只需要每个的x,计算其对应的 c k , k ∈ [ 1 , 2 , . . . , K ] c_k,k \in [1,2,...,K] ck,k∈[1,2,...,K]的概率,选择最大的概率作为这个x的类别进行了.
通过贝叶斯公式进行变形,得到预测的概率计算公式:
P ( Y = c k ∣ X = x ) = P ( X = x ∣ Y = c k ) P ( Y = c k ) ∑ k P ( X = x ∣ Y = c k ) P ( Y = c k ) 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(Y=ck∣X=x)=∑kP(X=x∣Y=ck)P(Y=ck)P(X=x∣Y=ck)P(Y=ck)
我们只需要计算以下两个概率即可,又由于朴素贝叶斯假设条件独立,我们可以单独计算每个特征的条件概率: P ( X ( i ) = x ( i ) ∣ Y = c k ) P(X^{(i)}=x^{(i)}|Y=c_k) P(X(i)=x(i)∣Y=ck)和类目 c k c_k ck的先验概率: P ( Y = c k ) P(Y=c_k) P(Y=ck)。为了更好的理解这个公式,看下图解释:
其中:
P
(
Y
=
c
k
)
=
∑
i
=
1
N
I
(
y
i
=
c
k
)
N
,
k
=
1
,
2
,
.
.
.
,
K
P(Y=c_k)=\frac{\sum_{i=1}^{N}I(y_i=c_k)}{N}, k=1,2,...,K
P(Y=ck)=N∑i=1NI(yi=ck),k=1,2,...,K
当涉及到多个条件时,朴素贝叶斯有一个提前的假设,我们称之为 条件独立性假设(或者 简单假设:Naive):公式如下
P
(
A
,
B
∣
Y
)
=
P
(
A
∣
Y
)
⋅
P
(
B
∣
Y
)
P(A,B|Y) = P(A|Y) \cdot P(B|Y)
P(A,B∣Y)=P(A∣Y)⋅P(B∣Y)
这个公式是朴素贝叶斯的基础假设,即各个条件概率是相互独立的,A不影响B,B不影响A。
而对这里来说,假设
X
=
[
x
1
,
x
2
,
.
.
.
,
x
n
]
X = [x_1,x_2,...,x_n]
X=[x1,x2,...,xn]
P ( X = x ∣ Y = c k ) = P ( X ( 1 ) = x ( 1 ) , X ( 2 ) = x ( 2 ) , . . . , X ( n ) = x ( n ) ∣ Y = c k ) = ∏ i = 1 n P ( x i ∣ y ) 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(X=x∣Y=ck)=P(X(1)=x(1),X(2)=x(2),...,X(n)=x(n)∣Y=ck)=i=1∏nP(xi∣y)
由此原式可以等价为:
P ( Y = c k ∣ X = x ) = ∏ i = 1 n P ( x i ∣ Y = c k ) P ( Y = c k ) ∑ k ∏ i = 1 n P ( x i ∣ Y = c k ) P ( Y = c k ) 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)} P(Y=ck∣X=x)=∑k∏i=1nP(xi∣Y=ck)P(Y=ck)∏i=1nP(xi∣Y=ck)P(Y=ck)
我们为了选择后验概率最大的结果,进行概率的比较,由于分母一致,这里直接去掉分母,得到最后的计算公式。
y = a r g m a x c k P ( Y = c k ) ∏ j P ( X ( j ) = x ( j ) ∣ Y = c k ) y=arg max_{c_k}P(Y=c_k)\prod_{j}P(X^{(j)}=x^{(j)}|Y=c_k) y=argmaxckP(Y=ck)j∏P(X(j)=x(j)∣Y=ck)
我们来看一个实例,更好的理解贝叶斯的计算过程,根据天气和是否是周末预测一个人是否会出门。
| index | X 1 : X_1: X1:天气的好坏 | X 2 : X_2: X2:是否周末 | Y : Y: Y:是否出门 |
|---|---|---|---|
| 1 | 好 | 是 | 出门 |
| 2 | 好 | 否 | 出门 |
| 3 | 好 | 是 | 不出门 |
| 4 | 好 | 否 | 出门 |
| 5 | 不好 | 是 | 出门 |
| 6 | 不好 | 否 | 不出门 |
根据上述数据,为了更好的理解计算过程,我们给出几个计算公式:
a. 当出门的条件下,X_1是天气不好的概率:
p
(
X
1
=
不
好
∣
Y
=
出
门
)
=
p
(
X
1
=
不
好
,
Y
=
出
门
)
p
(
Y
=
出
门
)
=
1
4
p(X_1=不好|Y=出门) =\frac{p(X_1=不好,Y=出门)}{p(Y=出门)}=\frac{1}{4}
p(X1=不好∣Y=出门)=p(Y=出门)p(X1=不好,Y=出门)=41
b. 出门的概率
p
(
Y
=
出
门
)
=
4
6
p(Y=出门)=\frac{4}{6}
p(Y=出门)=64
c. X_1天气不好的概率、
p
(
X
1
=
不
好
)
=
2
6
p(X_1=不好)=\frac{2}{6}
p(X1=不好)=62
d. 在X_1天气不好的情况下,出门的概率:
p
(
Y
=
出
门
∣
X
1
=
不
好
)
=
p
(
X
1
=
不
好
∣
Y
=
出
门
)
⋅
p
(
Y
=
出
门
)
p
(
X
=
不
好
)
=
1
4
⋅
4
6
2
6
=
1
2
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}
p(Y=出门∣X1=不好)=p(X=不好)p(X1=不好∣Y=出门)⋅p(Y=出门)=6241⋅64=21
f. 在X_1天气不好的情况下,不出门的概率:
p
(
Y
=
出
门
∣
X
1
=
不
好
)
=
1
−
p
(
Y
=
不
出
门
∣
X
1
=
不
好
)
=
1
−
1
2
=
1
2
p(Y=出门|X_1=不好)=1-p(Y=不出门|X_1=不好)=1-\frac{1}{2}=\frac{1}{2}
p(Y=出门∣X1=不好)=1−p(Y=不出门∣X1=不好)=1−21=21
3 朴素贝叶斯的优缺点
优点:
朴素贝叶斯算法主要基于经典的贝叶斯公式进行推倒,具有很好的数学原理。而且在数据量很小的时候表现良好,数据量很大的时候也可以进行增量计算。由于朴素贝叶斯使用先验概率估计后验概率具有很好的模型的可解释性。
缺点:
朴素贝叶斯模型与其他分类方法相比具有最小的理论误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型给定输出类别的情况下,假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进,例如为了计算量不至于太大,我们假定每个属性只依赖另外的一个。解决特征之间的相关性,我们还可以使用数据降维(PCA)的方法,去除特征相关性,再进行朴素贝叶斯计算。
3. 总结
这个例子虽然是没有实际意义的例子,但是却很有意思,通过随机生成数据,就可以尝试进行预测,这表现了机器学习本质上并不依赖于任何实际的问题,实际问题仅仅表现了数据在某种程度上具有的内在联系。
本文介绍了阿里天池训练营的一次实践——使用模拟离散数据集进行贝叶斯分类。通过实战步骤,包括库函数导入、数据处理、模型训练与可视化,详细阐述了朴素贝叶斯算法的原理,如拉普拉斯平滑和条件独立假设,并探讨了该算法的优缺点。
6414

被折叠的 条评论
为什么被折叠?



